[PATCH] ARM: OMAP4+: SMP: use lockless clkdm/pwrdm api in omap4_boot_secondary

Tony Lindgren tony at atomide.com
Wed Nov 25 11:03:37 PST 2015


* Grygorii Strashko <grygorii.strashko at ti.com> [151116 09:39]:
> OMAP CPU hotplug uses cpu1's clocks and power domains for CPU1 wake up
> from low power states (or turn on CPU1). This part of code is also
> part of system suspend (disable_nonboot_cpus()).
> >From other side, cpu1's clocks and power domains are used by CPUIdle. All above
> functionality is mutually exclusive and, therefore, lockless clkdm/pwrdm api
> can be used in omap4_boot_secondary().
> 
> This fixes below back-trace on -RT which is triggered by
> pwrdm_lock/unlock():
> 
> BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917
>  in_atomic(): 1, irqs_disabled(): 0, pid: 118, name: sh
>  9 locks held by sh/118:
>   #0:  (sb_writers#4){.+.+.+}, at: [<c0144a6c>] vfs_write+0x13c/0x164
>   #1:  (&of->mutex){+.+.+.}, at: [<c01b4c70>] kernfs_fop_write+0x48/0x19c
>   #2:  (s_active#24){.+.+.+}, at: [<c01b4c78>] kernfs_fop_write+0x50/0x19c
>   #3:  (device_hotplug_lock){+.+.+.}, at: [<c03cbff0>] lock_device_hotplug_sysfs+0xc/0x4c
>   #4:  (&dev->mutex){......}, at: [<c03cd284>] device_online+0x14/0x88
>   #5:  (cpu_add_remove_lock){+.+.+.}, at: [<c003af90>] cpu_up+0x50/0x1a0
>   #6:  (cpu_hotplug.lock){++++++}, at: [<c003ae48>] cpu_hotplug_begin+0x0/0xc4
>   #7:  (cpu_hotplug.lock#2){+.+.+.}, at: [<c003aec0>] cpu_hotplug_begin+0x78/0xc4
>   #8:  (boot_lock){+.+...}, at: [<c002b254>] omap4_boot_secondary+0x1c/0x178
>  Preemption disabled at:[<  (null)>]   (null)
> 
>  CPU: 0 PID: 118 Comm: sh Not tainted 4.1.12-rt11-01998-gb4a62c3-dirty #137
>  Hardware name: Generic DRA74X (Flattened Device Tree)
>  [<c0017574>] (unwind_backtrace) from [<c0013be8>] (show_stack+0x10/0x14)
>  [<c0013be8>] (show_stack) from [<c05a8670>] (dump_stack+0x80/0x94)
>  [<c05a8670>] (dump_stack) from [<c05ad158>] (rt_spin_lock+0x24/0x54)
>  [<c05ad158>] (rt_spin_lock) from [<c0030dac>] (clkdm_wakeup+0x10/0x2c)
>  [<c0030dac>] (clkdm_wakeup) from [<c002b2c0>] (omap4_boot_secondary+0x88/0x178)
>  [<c002b2c0>] (omap4_boot_secondary) from [<c0015d00>] (__cpu_up+0xc4/0x164)
>  [<c0015d00>] (__cpu_up) from [<c003b09c>] (cpu_up+0x15c/0x1a0)
>  [<c003b09c>] (cpu_up) from [<c03cd2d4>] (device_online+0x64/0x88)
>  [<c03cd2d4>] (device_online) from [<c03cd360>] (online_store+0x68/0x74)
>  [<c03cd360>] (online_store) from [<c01b4ce0>] (kernfs_fop_write+0xb8/0x19c)
>  [<c01b4ce0>] (kernfs_fop_write) from [<c0144124>] (__vfs_write+0x20/0xd8)
>  [<c0144124>] (__vfs_write) from [<c01449c0>] (vfs_write+0x90/0x164)
>  [<c01449c0>] (vfs_write) from [<c01451e4>] (SyS_write+0x44/0x9c)
>  [<c01451e4>] (SyS_write) from [<c0010240>] (ret_fast_syscall+0x0/0x54)
>  CPU1: smp_ops.cpu_die() returned, trying to resuscitate
> 
> Cc: Tero Kristo <t-kristo at ti.com>
> Signed-off-by: Grygorii Strashko <grygorii.strashko at ti.com>

Applying into omap-for-v4.4/fixes thanks.

Tony

> ---
>  arch/arm/mach-omap2/omap-smp.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
> index 5305ec7..79e1f87 100644
> --- a/arch/arm/mach-omap2/omap-smp.c
> +++ b/arch/arm/mach-omap2/omap-smp.c
> @@ -143,9 +143,9 @@ static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle)
>  		 * Ensure that CPU power state is set to ON to avoid CPU
>  		 * powerdomain transition on wfi
>  		 */
> -		clkdm_wakeup(cpu1_clkdm);
> -		omap_set_pwrdm_state(cpu1_pwrdm, PWRDM_POWER_ON);
> -		clkdm_allow_idle(cpu1_clkdm);
> +		clkdm_wakeup_nolock(cpu1_clkdm);
> +		pwrdm_set_next_pwrst(cpu1_pwrdm, PWRDM_POWER_ON);
> +		clkdm_allow_idle_nolock(cpu1_clkdm);
>  
>  		if (IS_PM44XX_ERRATUM(PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD)) {
>  			while (gic_dist_disabled()) {
> -- 
> 2.6.3
> 



More information about the linux-arm-kernel mailing list