On 1 November 2010 03:42, David Xu <davidxu_at_freebsd.org> wrote: > Author: davidxu > Date: Mon Nov 1 00:42:25 2010 > New Revision: 214611 > URL: http://svn.freebsd.org/changeset/base/214611 > > Log: > Use integer for size of cpuset, as it won't be bigger than INT_MAX, > This is requested by bge. > Also move the sysctl into file kern_cpuset.c, because it should > always be there, it is independent of thread scheduler. Hi. This breaks for me fetching a cpusetsize value with sysconf(3) interface, as after this change sysconf(3) consumers expect a long return type, while sysctl kern.sched.cpusetsize has switched from long to int type in kernel. That makes for me sizeof(cpusize_t) from 8 to incorrect 34359738376. In particular, kvm_getpcpu(3) uses sysconf(3) to fetch cpusetsize on live kernel. That gives me a broken result: kvm_open: kcpusetsize: 8 pcpu[0] = 0x801072300 kvm_open: kcpusetsize: 34359738376 pcpu[1] = 0xffffffffffffffff kvm_open: kcpusetsize: 8 pcpu[2] = 0x801072600 kvm_open: kcpusetsize: 34359738376 pcpu[3] = 0xffffffffffffffff This small test indicates that that's due to int->long type conversion: long lvalue; size_t len; len = sizeof(lvalue); if (sysctlbyname("kern.sched.cpusetsize", &lvalue, &len, NULL, 0) < 0) err(1, "sysctlbyname"); printf("sysctl: %ld\n", lvalue); printf("sysctl: %d -- explicitly casted to (int)\n", (int)lvalue); printf("sysconf: %ld\n", sysconf(_SC_CPUSET_SIZE)); printf("sysconf: %d -- explicitly casted to (int)\n", (int)sysconf(_SC_CPUSET_SIZE)); That prints: sysctl: 34359738376 sysctl: 8 -- explicitly casted to (int) sysconf: 34359738376 sysconf: 8 -- explicitly casted to (int) The other way to solve this other than reverting is to "fix" all cpusetsize consumers in userland. Now sysconf() saves long returned value to int: Index: lib/libkvm/kvm_pcpu.c =================================================================== --- lib/libkvm/kvm_pcpu.c (revision 223073) +++ lib/libkvm/kvm_pcpu.c (working copy) _at__at_ -120,7 +120,7 _at__at_ void * kvm_getpcpu(kvm_t *kd, int cpu) { - long kcpusetsize; + int kcpusetsize; ssize_t nbytes; uintptr_t readptr; char *buf; So, after applying the above change all is ok: kvm_open: kcpusetsize: 8 pcpu[0] = 0x801072300 kvm_open: kcpusetsize: 8 pcpu[1] = 0x801072600 kvm_open: kcpusetsize: 8 pcpu[2] = 0x801072900 kvm_open: kcpusetsize: 8 pcpu[3] = 0x801072c00 > > Modified: > head/sys/kern/kern_cpuset.c > head/sys/kern/sched_ule.c > > Modified: head/sys/kern/kern_cpuset.c > ============================================================================== > --- head/sys/kern/kern_cpuset.c Sun Oct 31 23:04:15 2010 (r214610) > +++ head/sys/kern/kern_cpuset.c Mon Nov 1 00:42:25 2010 (r214611) > _at__at_ -107,6 +107,10 _at__at_ static struct setlist cpuset_ids; > static struct unrhdr *cpuset_unr; > static struct cpuset *cpuset_zero; > > +/* Return the size of cpuset_t at the kernel level */ > +SYSCTL_INT(_kern_sched, OID_AUTO, cpusetsize, CTLFLAG_RD, > + 0, sizeof(cpuset_t), "sizeof(cpuset_t)"); > + > cpuset_t *cpuset_root; > > /* > > Modified: head/sys/kern/sched_ule.c > ============================================================================== > --- head/sys/kern/sched_ule.c Sun Oct 31 23:04:15 2010 (r214610) > +++ head/sys/kern/sched_ule.c Mon Nov 1 00:42:25 2010 (r214611) > _at__at_ -2713,7 +2713,6 _at__at_ sysctl_kern_sched_topology_spec(SYSCTL_H > return (err); > } > > -static size_t _kern_cpuset_size = sizeof(cpuset_t); > #endif > > SYSCTL_NODE(_kern, OID_AUTO, sched, CTLFLAG_RW, 0, "Scheduler"); > _at__at_ -2751,14 +2750,6 _at__at_ SYSCTL_PROC(_kern_sched, OID_AUTO, topol > CTLFLAG_RD, NULL, 0, sysctl_kern_sched_topology_spec, "A", > "XML dump of detected CPU topology"); > > -/* > - * Return the size of cpuset_t at the kernel level > - * > - * XXX (gcooper): replace ULONG with SIZE once CTLTYPE_SIZE is implemented. > - */ > -SYSCTL_ULONG(_kern_sched, OID_AUTO, cpusetsize, CTLFLAG_RD, > - &_kern_cpuset_size, 0, "Kernel-level cpuset_t struct size"); > - > #endif > > /* ps compat. All cpu percentages from ULE are weighted. */ > -- wbr, pluknetReceived on Tue Jun 14 2011 - 10:25:03 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:14 UTC