In article <[email protected]>, Maxime Villard <[email protected]> wrote: >Hi, >a bug I must have spotted some weeks ago: the kernel decrements the >number of offline cpus even when trying to shutting down one fails. >How to reproduce: > > # schedctl -p SOME_RANDOM_PROC_PID -A 0 > # sysctl hw.ncpuonline > # cpuctl offline 0 (it fails) > # sysctl hw.ncpuonline (one cpu missing) > >If you cpuctl too much, the value goes negative. This is not a harmful >bug. > >Index: kern_cpu.c >=================================================================== >RCS file: /cvsroot/src/sys/kern/kern_cpu.c,v >retrieving revision 1.70 >diff -u -r1.70 kern_cpu.c >--- kern_cpu.c 20 Aug 2015 09:45:45 -0000 1.70 >+++ kern_cpu.c 28 Aug 2015 08:51:36 -0000 >@@ -444,7 +444,6 @@ > if ((spc->spc_flags & SPCF_OFFLINE) == 0) > return 0; > func = (xcfunc_t)cpu_xc_online; >- ncpuonline++; > } else { > if ((spc->spc_flags & SPCF_OFFLINE) != 0) > return 0; >@@ -463,16 +462,19 @@ > if (nonline == 1) > return EBUSY; > func = (xcfunc_t)cpu_xc_offline; >- ncpuonline--; > } > > where = xc_unicast(0, func, ci, NULL, ci); > xc_wait(where); > if (online) { > KASSERT((spc->spc_flags & SPCF_OFFLINE) == 0); >- } else if ((spc->spc_flags & SPCF_OFFLINE) == 0) { >- /* If was not set offline, then it is busy */ >- return EBUSY; >+ ncpuonline++; >+ } else { >+ if ((spc->spc_flags & SPCF_OFFLINE) == 0) { >+ /* If was not set offline, then it is busy */ >+ return EBUSY; >+ } >+ ncpuonline--; > } > > spc->spc_lastmod = time_second; > > >Ok?
Ok with me. christos
