From: Vitaliy Makkoveev Subject: sysctl: unlock KERN_CPTIME{,2} To: David Gwynne , tech@openbsd.org Cc: sysctl: unlockKERN_CPTIME{@openbsd.org, 2}@openbsd.org; Date: Wed, 4 Jun 2025 22:26:32 +0300 Fixed subject: Subject: sysctl: unlock KERN_CPTIME{,2} On Wed, Jun 04, 2025 at 10:08:27PM +0300, Vitaliy Makkoveev wrote: > dlg@ made the CPU state statistics mp-safe, but forgot to move sysctl(2) > cases out of locks. > > Index: sys/kern/kern_sysctl.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_sysctl.c,v > retrieving revision 1.475 > diff -u -p -r1.475 kern_sysctl.c > --- sys/kern/kern_sysctl.c 4 Jun 2025 13:29:11 -0000 1.475 > +++ sys/kern/kern_sysctl.c 4 Jun 2025 19:05:07 -0000 > @@ -410,6 +410,9 @@ kern_sysctl_dirs(int top_name, int *name > case KERN_MALLOCSTATS: > return (sysctl_malloc(name, namelen, oldp, oldlenp, > newp, newlen, p)); > + case KERN_CPTIME2: > + return (sysctl_cptime2(name, namelen, oldp, oldlenp, > + newp, newlen)); > case KERN_POOL: > return (sysctl_dopool(name, namelen, oldp, oldlenp)); > #if NAUDIO > 0 > @@ -490,9 +493,6 @@ kern_sysctl_dirs_locked(int top_name, in > #endif > case KERN_TIMECOUNTER: > return (sysctl_tc(name, namelen, oldp, oldlenp, newp, newlen)); > - case KERN_CPTIME2: > - return (sysctl_cptime2(name, namelen, oldp, oldlenp, > - newp, newlen)); > #ifdef WITNESS > case KERN_WITNESSWATCH: > return witness_sysctl_watch(oldp, oldlenp, newp, newlen); > @@ -632,6 +632,33 @@ kern_sysctl(int *name, u_int namelen, vo > return (ENXIO); > return (sysctl_rdint(oldp, oldlenp, newp, mp->msg_bufs)); > } > + case KERN_CPTIME: > + { > + CPU_INFO_ITERATOR cii; > + struct cpu_info *ci; > + long cp_time[CPUSTATES]; > + int i, n = 0; > + > + memset(cp_time, 0, sizeof(cp_time)); > + > + CPU_INFO_FOREACH(cii, ci) { > + uint64_t ci_cp_time[CPUSTATES]; > + > + if (!cpu_is_online(ci)) > + continue; > + > + n++; > + sysctl_ci_cp_time(ci, ci_cp_time); > + for (i = 0; i < CPUSTATES; i++) > + cp_time[i] += ci_cp_time[i]; > + } > + > + for (i = 0; i < CPUSTATES; i++) > + cp_time[i] /= n; > + > + return (sysctl_rdstruct(oldp, oldlenp, newp, &cp_time, > + sizeof(cp_time))); > + } > case KERN_POOL_DEBUG: { > extern int pool_debug; > int oldval, newval; > @@ -714,33 +741,6 @@ kern_sysctl_locked(int *name, u_int name > if (newp && !error) > domainnamelen = newlen; > return (error); > - case KERN_CPTIME: > - { > - CPU_INFO_ITERATOR cii; > - struct cpu_info *ci; > - long cp_time[CPUSTATES]; > - int i, n = 0; > - > - memset(cp_time, 0, sizeof(cp_time)); > - > - CPU_INFO_FOREACH(cii, ci) { > - uint64_t ci_cp_time[CPUSTATES]; > - > - if (!cpu_is_online(ci)) > - continue; > - > - n++; > - sysctl_ci_cp_time(ci, ci_cp_time); > - for (i = 0; i < CPUSTATES; i++) > - cp_time[i] += ci_cp_time[i]; > - } > - > - for (i = 0; i < CPUSTATES; i++) > - cp_time[i] /= n; > - > - return (sysctl_rdstruct(oldp, oldlenp, newp, &cp_time, > - sizeof(cp_time))); > - } > case KERN_NCHSTATS: > return (sysctl_rdstruct(oldp, oldlenp, newp, &nchstats, > sizeof(struct nchstats))); >