Message ID | 20170323152247.14733-2-svaidy@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Mainlined |
Delegated to: | Rafael Wysocki |
Headers | show |
On Thu, Mar 23, 2017 at 4:22 PM, Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> wrote: > drv->cpumask defaults to cpu_possible_mask in __cpuidle_driver_init(). > On PowerNV platform cpu_present could be less than cpu_possible in cases > where firmware detects the cpu, but it is not available to the OS. When > CONFIG_HOTPLUG_CPU=n, such cpus are not hotplugable at runtime and hence > we skip creating cpu_device. > > This breaks cpuidle on powernv where register_cpu() is not called for > cpus in cpu_possible_mask that cannot be hot-added at runtime. > > Trying cpuidle_register_device() on cpu without cpu_device will cause > crash like this: > > cpu 0xf: Vector: 380 (Data SLB Access) at [c000000ff1503490] > pc: c00000000022c8bc: string+0x34/0x60 > lr: c00000000022ed78: vsnprintf+0x284/0x42c > sp: c000000ff1503710 > msr: 9000000000009033 > dar: 6000000060000000 > current = 0xc000000ff1480000 > paca = 0xc00000000fe82d00 softe: 0 irq_happened: 0x01 > pid = 1, comm = swapper/8 > Linux version 4.11.0-rc2 (sv@sagarika) (gcc version 4.9.4 > (Buildroot 2017.02-00004-gc28573e) ) #15 SMP Fri Mar 17 19:32:02 IST 2017 > enter ? for help > [link register ] c00000000022ed78 vsnprintf+0x284/0x42c > [c000000ff1503710] c00000000022ebb8 vsnprintf+0xc4/0x42c (unreliable) > [c000000ff1503800] c00000000022ef40 vscnprintf+0x20/0x44 > [c000000ff1503830] c0000000000ab61c vprintk_emit+0x94/0x2cc > [c000000ff15038a0] c0000000000acc9c vprintk_func+0x60/0x74 > [c000000ff15038c0] c000000000619694 printk+0x38/0x4c > [c000000ff15038e0] c000000000224950 kobject_get+0x40/0x60 > [c000000ff1503950] c00000000022507c kobject_add_internal+0x60/0x2c4 > [c000000ff15039e0] c000000000225350 kobject_init_and_add+0x70/0x78 > [c000000ff1503a60] c00000000053c288 cpuidle_add_sysfs+0x9c/0xe0 > [c000000ff1503ae0] c00000000053aeac cpuidle_register_device+0xd4/0x12c > [c000000ff1503b30] c00000000053b108 cpuidle_register+0x98/0xcc > [c000000ff1503bc0] c00000000085eaf0 powernv_processor_idle_init+0x140/0x1e0 > [c000000ff1503c60] c00000000000cd60 do_one_initcall+0xc0/0x15c > [c000000ff1503d20] c000000000833e84 kernel_init_freeable+0x1a0/0x25c > [c000000ff1503dc0] c00000000000d478 kernel_init+0x24/0x12c > [c000000ff1503e30] c00000000000b564 ret_from_kernel_thread+0x5c/0x78 > > This patch fixes the bug by passing correct cpumask from > powernv-cpuidle driver. > > Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> That needs to be ACKed by someone familiar with powernv. > --- > drivers/cpuidle/cpuidle-powernv.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c > index a06df51..82f7b33 100644 > --- a/drivers/cpuidle/cpuidle-powernv.c > +++ b/drivers/cpuidle/cpuidle-powernv.c > @@ -175,6 +175,24 @@ static int powernv_cpuidle_driver_init(void) > drv->state_count += 1; > } > > + /* > + * On PowerNV platform cpu_present may be less that cpu_possible in > + * cases where firmware detects the cpu, but it is not available to the > + * OS. If CONFIG_HOTPLUG_CPU=n then such CPUs are not hotplugable at > + * runtime and hence cpu_devices are not created for those cpus by > + * generic topology_init(). > + * > + * drv->cpumask defaults to cpu_possible_mask in > + * __cpuidle_driver_init(). This breaks cpuidle on powernv where > + * cpu_devices are not created for cpus in cpu_possible_mask that > + * cannot be hot-added later at runtime. > + * > + * Trying cpuidle_register_device() on a cpu without cpu_devices is > + * incorrect. Hence pass correct cpu mask to generic cpuidle driver. > + */ > + > + drv->cpumask = (struct cpumask *)cpu_present_mask; > + > return 0; > } > > -- > 2.9.3 >
* Rafael J. Wysocki <rafael@kernel.org> [2017-03-23 16:28:31]: > On Thu, Mar 23, 2017 at 4:22 PM, Vaidyanathan Srinivasan > <svaidy@linux.vnet.ibm.com> wrote: > > drv->cpumask defaults to cpu_possible_mask in __cpuidle_driver_init(). > > On PowerNV platform cpu_present could be less than cpu_possible in cases > > where firmware detects the cpu, but it is not available to the OS. When > > CONFIG_HOTPLUG_CPU=n, such cpus are not hotplugable at runtime and hence > > we skip creating cpu_device. > > > > This breaks cpuidle on powernv where register_cpu() is not called for > > cpus in cpu_possible_mask that cannot be hot-added at runtime. > > > > Trying cpuidle_register_device() on cpu without cpu_device will cause > > crash like this: > > > > cpu 0xf: Vector: 380 (Data SLB Access) at [c000000ff1503490] > > pc: c00000000022c8bc: string+0x34/0x60 > > lr: c00000000022ed78: vsnprintf+0x284/0x42c > > sp: c000000ff1503710 > > msr: 9000000000009033 > > dar: 6000000060000000 > > current = 0xc000000ff1480000 > > paca = 0xc00000000fe82d00 softe: 0 irq_happened: 0x01 > > pid = 1, comm = swapper/8 > > Linux version 4.11.0-rc2 (sv@sagarika) (gcc version 4.9.4 > > (Buildroot 2017.02-00004-gc28573e) ) #15 SMP Fri Mar 17 19:32:02 IST 2017 > > enter ? for help > > [link register ] c00000000022ed78 vsnprintf+0x284/0x42c > > [c000000ff1503710] c00000000022ebb8 vsnprintf+0xc4/0x42c (unreliable) > > [c000000ff1503800] c00000000022ef40 vscnprintf+0x20/0x44 > > [c000000ff1503830] c0000000000ab61c vprintk_emit+0x94/0x2cc > > [c000000ff15038a0] c0000000000acc9c vprintk_func+0x60/0x74 > > [c000000ff15038c0] c000000000619694 printk+0x38/0x4c > > [c000000ff15038e0] c000000000224950 kobject_get+0x40/0x60 > > [c000000ff1503950] c00000000022507c kobject_add_internal+0x60/0x2c4 > > [c000000ff15039e0] c000000000225350 kobject_init_and_add+0x70/0x78 > > [c000000ff1503a60] c00000000053c288 cpuidle_add_sysfs+0x9c/0xe0 > > [c000000ff1503ae0] c00000000053aeac cpuidle_register_device+0xd4/0x12c > > [c000000ff1503b30] c00000000053b108 cpuidle_register+0x98/0xcc > > [c000000ff1503bc0] c00000000085eaf0 powernv_processor_idle_init+0x140/0x1e0 > > [c000000ff1503c60] c00000000000cd60 do_one_initcall+0xc0/0x15c > > [c000000ff1503d20] c000000000833e84 kernel_init_freeable+0x1a0/0x25c > > [c000000ff1503dc0] c00000000000d478 kernel_init+0x24/0x12c > > [c000000ff1503e30] c00000000000b564 ret_from_kernel_thread+0x5c/0x78 > > > > This patch fixes the bug by passing correct cpumask from > > powernv-cpuidle driver. > > > > Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> > > That needs to be ACKed by someone familiar with powernv. Previous version at https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-March/155587.html I had not CCed linux-pm in the first post. Michael and Mikey have reviewed the previous version. Let me get an ack for you to proceed with the merge. Thanks, Vaidy
On Thu, Mar 23, 2017 at 8:52 PM, Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> wrote: > drv->cpumask defaults to cpu_possible_mask in __cpuidle_driver_init(). > On PowerNV platform cpu_present could be less than cpu_possible in cases > where firmware detects the cpu, but it is not available to the OS. When > CONFIG_HOTPLUG_CPU=n, such cpus are not hotplugable at runtime and hence > we skip creating cpu_device. > > This breaks cpuidle on powernv where register_cpu() is not called for > cpus in cpu_possible_mask that cannot be hot-added at runtime. > > Trying cpuidle_register_device() on cpu without cpu_device will cause > crash like this: > > cpu 0xf: Vector: 380 (Data SLB Access) at [c000000ff1503490] > pc: c00000000022c8bc: string+0x34/0x60 > lr: c00000000022ed78: vsnprintf+0x284/0x42c > sp: c000000ff1503710 > msr: 9000000000009033 > dar: 6000000060000000 > current = 0xc000000ff1480000 > paca = 0xc00000000fe82d00 softe: 0 irq_happened: 0x01 > pid = 1, comm = swapper/8 > Linux version 4.11.0-rc2 (sv@sagarika) (gcc version 4.9.4 > (Buildroot 2017.02-00004-gc28573e) ) #15 SMP Fri Mar 17 19:32:02 IST 2017 > enter ? for help > [link register ] c00000000022ed78 vsnprintf+0x284/0x42c > [c000000ff1503710] c00000000022ebb8 vsnprintf+0xc4/0x42c (unreliable) > [c000000ff1503800] c00000000022ef40 vscnprintf+0x20/0x44 > [c000000ff1503830] c0000000000ab61c vprintk_emit+0x94/0x2cc > [c000000ff15038a0] c0000000000acc9c vprintk_func+0x60/0x74 > [c000000ff15038c0] c000000000619694 printk+0x38/0x4c > [c000000ff15038e0] c000000000224950 kobject_get+0x40/0x60 > [c000000ff1503950] c00000000022507c kobject_add_internal+0x60/0x2c4 > [c000000ff15039e0] c000000000225350 kobject_init_and_add+0x70/0x78 > [c000000ff1503a60] c00000000053c288 cpuidle_add_sysfs+0x9c/0xe0 > [c000000ff1503ae0] c00000000053aeac cpuidle_register_device+0xd4/0x12c > [c000000ff1503b30] c00000000053b108 cpuidle_register+0x98/0xcc > [c000000ff1503bc0] c00000000085eaf0 powernv_processor_idle_init+0x140/0x1e0 > [c000000ff1503c60] c00000000000cd60 do_one_initcall+0xc0/0x15c > [c000000ff1503d20] c000000000833e84 kernel_init_freeable+0x1a0/0x25c > [c000000ff1503dc0] c00000000000d478 kernel_init+0x24/0x12c > [c000000ff1503e30] c00000000000b564 ret_from_kernel_thread+0x5c/0x78 > > This patch fixes the bug by passing correct cpumask from > powernv-cpuidle driver. > > Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > --- > drivers/cpuidle/cpuidle-powernv.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c > index a06df51..82f7b33 100644 > --- a/drivers/cpuidle/cpuidle-powernv.c > +++ b/drivers/cpuidle/cpuidle-powernv.c > @@ -175,6 +175,24 @@ static int powernv_cpuidle_driver_init(void) > drv->state_count += 1; > } > > + /* > + * On PowerNV platform cpu_present may be less that cpu_possible in > + * cases where firmware detects the cpu, but it is not available to the > + * OS. If CONFIG_HOTPLUG_CPU=n then such CPUs are not hotplugable at > + * runtime and hence cpu_devices are not created for those cpus by > + * generic topology_init(). > + * > + * drv->cpumask defaults to cpu_possible_mask in > + * __cpuidle_driver_init(). This breaks cpuidle on powernv where > + * cpu_devices are not created for cpus in cpu_possible_mask that > + * cannot be hot-added later at runtime. > + * > + * Trying cpuidle_register_device() on a cpu without cpu_devices is > + * incorrect. Hence pass correct cpu mask to generic cpuidle driver. > + */ > + > + drv->cpumask = (struct cpumask *)cpu_present_mask; > + > return 0; > } > > -- > 2.9.3 >
"Rafael J. Wysocki" <rafael@kernel.org> writes: > On Thu, Mar 23, 2017 at 4:22 PM, Vaidyanathan Srinivasan > <svaidy@linux.vnet.ibm.com> wrote: >> drv->cpumask defaults to cpu_possible_mask in __cpuidle_driver_init(). >> On PowerNV platform cpu_present could be less than cpu_possible in cases >> where firmware detects the cpu, but it is not available to the OS. When >> CONFIG_HOTPLUG_CPU=n, such cpus are not hotplugable at runtime and hence >> we skip creating cpu_device. >> >> This breaks cpuidle on powernv where register_cpu() is not called for >> cpus in cpu_possible_mask that cannot be hot-added at runtime. >> >> Trying cpuidle_register_device() on cpu without cpu_device will cause >> crash like this: >> >> cpu 0xf: Vector: 380 (Data SLB Access) at [c000000ff1503490] >> pc: c00000000022c8bc: string+0x34/0x60 >> lr: c00000000022ed78: vsnprintf+0x284/0x42c >> sp: c000000ff1503710 >> msr: 9000000000009033 >> dar: 6000000060000000 >> current = 0xc000000ff1480000 >> paca = 0xc00000000fe82d00 softe: 0 irq_happened: 0x01 >> pid = 1, comm = swapper/8 >> Linux version 4.11.0-rc2 (sv@sagarika) (gcc version 4.9.4 >> (Buildroot 2017.02-00004-gc28573e) ) #15 SMP Fri Mar 17 19:32:02 IST 2017 >> enter ? for help >> [link register ] c00000000022ed78 vsnprintf+0x284/0x42c >> [c000000ff1503710] c00000000022ebb8 vsnprintf+0xc4/0x42c (unreliable) >> [c000000ff1503800] c00000000022ef40 vscnprintf+0x20/0x44 >> [c000000ff1503830] c0000000000ab61c vprintk_emit+0x94/0x2cc >> [c000000ff15038a0] c0000000000acc9c vprintk_func+0x60/0x74 >> [c000000ff15038c0] c000000000619694 printk+0x38/0x4c >> [c000000ff15038e0] c000000000224950 kobject_get+0x40/0x60 >> [c000000ff1503950] c00000000022507c kobject_add_internal+0x60/0x2c4 >> [c000000ff15039e0] c000000000225350 kobject_init_and_add+0x70/0x78 >> [c000000ff1503a60] c00000000053c288 cpuidle_add_sysfs+0x9c/0xe0 >> [c000000ff1503ae0] c00000000053aeac cpuidle_register_device+0xd4/0x12c >> [c000000ff1503b30] c00000000053b108 cpuidle_register+0x98/0xcc >> [c000000ff1503bc0] c00000000085eaf0 powernv_processor_idle_init+0x140/0x1e0 >> [c000000ff1503c60] c00000000000cd60 do_one_initcall+0xc0/0x15c >> [c000000ff1503d20] c000000000833e84 kernel_init_freeable+0x1a0/0x25c >> [c000000ff1503dc0] c00000000000d478 kernel_init+0x24/0x12c >> [c000000ff1503e30] c00000000000b564 ret_from_kernel_thread+0x5c/0x78 >> >> This patch fixes the bug by passing correct cpumask from >> powernv-cpuidle driver. >> >> Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> > > That needs to be ACKed by someone familiar with powernv. Acked-by: Michael Ellerman <mpe@ellerman.id.au> cheers
diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c index a06df51..82f7b33 100644 --- a/drivers/cpuidle/cpuidle-powernv.c +++ b/drivers/cpuidle/cpuidle-powernv.c @@ -175,6 +175,24 @@ static int powernv_cpuidle_driver_init(void) drv->state_count += 1; } + /* + * On PowerNV platform cpu_present may be less that cpu_possible in + * cases where firmware detects the cpu, but it is not available to the + * OS. If CONFIG_HOTPLUG_CPU=n then such CPUs are not hotplugable at + * runtime and hence cpu_devices are not created for those cpus by + * generic topology_init(). + * + * drv->cpumask defaults to cpu_possible_mask in + * __cpuidle_driver_init(). This breaks cpuidle on powernv where + * cpu_devices are not created for cpus in cpu_possible_mask that + * cannot be hot-added later at runtime. + * + * Trying cpuidle_register_device() on a cpu without cpu_devices is + * incorrect. Hence pass correct cpu mask to generic cpuidle driver. + */ + + drv->cpumask = (struct cpumask *)cpu_present_mask; + return 0; }
drv->cpumask defaults to cpu_possible_mask in __cpuidle_driver_init(). On PowerNV platform cpu_present could be less than cpu_possible in cases where firmware detects the cpu, but it is not available to the OS. When CONFIG_HOTPLUG_CPU=n, such cpus are not hotplugable at runtime and hence we skip creating cpu_device. This breaks cpuidle on powernv where register_cpu() is not called for cpus in cpu_possible_mask that cannot be hot-added at runtime. Trying cpuidle_register_device() on cpu without cpu_device will cause crash like this: cpu 0xf: Vector: 380 (Data SLB Access) at [c000000ff1503490] pc: c00000000022c8bc: string+0x34/0x60 lr: c00000000022ed78: vsnprintf+0x284/0x42c sp: c000000ff1503710 msr: 9000000000009033 dar: 6000000060000000 current = 0xc000000ff1480000 paca = 0xc00000000fe82d00 softe: 0 irq_happened: 0x01 pid = 1, comm = swapper/8 Linux version 4.11.0-rc2 (sv@sagarika) (gcc version 4.9.4 (Buildroot 2017.02-00004-gc28573e) ) #15 SMP Fri Mar 17 19:32:02 IST 2017 enter ? for help [link register ] c00000000022ed78 vsnprintf+0x284/0x42c [c000000ff1503710] c00000000022ebb8 vsnprintf+0xc4/0x42c (unreliable) [c000000ff1503800] c00000000022ef40 vscnprintf+0x20/0x44 [c000000ff1503830] c0000000000ab61c vprintk_emit+0x94/0x2cc [c000000ff15038a0] c0000000000acc9c vprintk_func+0x60/0x74 [c000000ff15038c0] c000000000619694 printk+0x38/0x4c [c000000ff15038e0] c000000000224950 kobject_get+0x40/0x60 [c000000ff1503950] c00000000022507c kobject_add_internal+0x60/0x2c4 [c000000ff15039e0] c000000000225350 kobject_init_and_add+0x70/0x78 [c000000ff1503a60] c00000000053c288 cpuidle_add_sysfs+0x9c/0xe0 [c000000ff1503ae0] c00000000053aeac cpuidle_register_device+0xd4/0x12c [c000000ff1503b30] c00000000053b108 cpuidle_register+0x98/0xcc [c000000ff1503bc0] c00000000085eaf0 powernv_processor_idle_init+0x140/0x1e0 [c000000ff1503c60] c00000000000cd60 do_one_initcall+0xc0/0x15c [c000000ff1503d20] c000000000833e84 kernel_init_freeable+0x1a0/0x25c [c000000ff1503dc0] c00000000000d478 kernel_init+0x24/0x12c [c000000ff1503e30] c00000000000b564 ret_from_kernel_thread+0x5c/0x78 This patch fixes the bug by passing correct cpumask from powernv-cpuidle driver. Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> --- drivers/cpuidle/cpuidle-powernv.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)