Skip to content

Commit

Permalink
powerpc/smp: Fix a crash while booting kvm guest with nr_cpus=2
Browse files Browse the repository at this point in the history
Aneesh reported a crash with a fairly recent upstream kernel when
booting kernel whose commandline was appended with nr_cpus=2

1:mon> e
cpu 0x1: Vector: 300 (Data Access) at [c000000008a67bd0]
    pc: c00000000002557c: cpu_to_chip_id+0x3c/0x100
    lr: c000000000058380: start_secondary+0x460/0xb00
    sp: c000000008a67e70
   msr: 8000000000001033
   dar: 10
 dsisr: 80000
  current = 0xc00000000891bb00
  paca    = 0xc0000018ff981f80   irqmask: 0x03   irq_happened: 0x01
    pid   = 0, comm = swapper/1
Linux version 5.13.0-rc3-15704-ga050a6d2b7e8 (kvaneesh@ltc-boston8) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) torvalds#433 SMP Tue May 25 02:38:49 CDT 2021
1:mon> t
[link register   ] c000000000058380 start_secondary+0x460/0xb00
[c000000008a67e70] c000000008a67eb0 (unreliable)
[c000000008a67eb0] c0000000000589d4 start_secondary+0xab4/0xb00
[c000000008a67f90] c00000000000c654 start_secondary_prolog+0x10/0x14

Current code assumes that num_possible_cpus() is always greater than
threads_per_core. However this may not be true when using nr_cpus=2 or
similar options. Handle the case where num_possible_cpus is smaller than
threads_per_core.

Cc: [email protected]
Cc: Aneesh Kumar K.V <[email protected]>
Cc: Nathan Lynch <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Valentin Schneider <[email protected]>
Cc: Gautham R Shenoy <[email protected]>
Cc: Vincent Guittot <[email protected]>
Fixes: c1e5336 ("powerpc/smp: Cache CPU to chip lookup")
Reported-by: Aneesh Kumar K.V <[email protected]>
Debugged-by: Michael Ellerman <[email protected]>
Signed-off-by: Srikar Dronamraju <[email protected]>
  • Loading branch information
srikard authored and intel-lab-lkp committed Aug 21, 2021
1 parent 8b893ef commit 79b484a
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion arch/powerpc/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1109,7 +1109,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
}

if (cpu_to_chip_id(boot_cpuid) != -1) {
int idx = num_possible_cpus() / threads_per_core;
int idx = max((int)num_possible_cpus() / threads_per_core, 1);

/*
* All threads of a core will all belong to the same core,
Expand Down

0 comments on commit 79b484a

Please sign in to comment.