Messages in this thread | | | Subject | Re: [PATCH] smpboot: correctly update number of booted cores | From | Dou Liyang <> | Date | Thu, 22 Feb 2018 16:07:24 +0800 |
| |
At 02/22/2018 04:50 AM, Samuel Neves wrote: > Without this fix, /proc/cpuinfo will display an incorrect amount > of CPU cores, after bringing them offline and online again, as > exemplified below: > > $ cat /proc/cpuinfo | grep cores > cpu cores : 4 > cpu cores : 8 > cpu cores : 8 > cpu cores : 20 > cpu cores : 4 > cpu cores : 3 > cpu cores : 2 > cpu cores : 2 > > This patch fixes this by always zeroing the booted_cores variable > upon turning off a logical CPU. > > Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
Yes, tested it in Qemu with 15 hot-pluggable CPUs, like below ... -smp 1,maxcpus=16,sockets=2,cores=4,threads=2 ...
When a new CPU bringups a new core, for each core in package, Linux increments the booted_cores for this new cpu in set_cpu_sibling_map(). Due to the uncleared booted_cores, this incorrect number of CPU cores will be shown.
Tested-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
> --- > arch/x86/kernel/smpboot.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c > index 9eee25d07586..ff99e2b6fc54 100644 > --- a/arch/x86/kernel/smpboot.c > +++ b/arch/x86/kernel/smpboot.c > @@ -1437,6 +1437,7 @@ static void remove_siblinginfo(int cpu) > cpumask_clear(topology_sibling_cpumask(cpu)); > cpumask_clear(topology_core_cpumask(cpu)); > c->cpu_core_id = 0; > + c->booted_cores = 0; > cpumask_clear_cpu(cpu, cpu_sibling_setup_mask); > recompute_smt_state(); > } >
| |