From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tony Lindgren Subject: Re: [PATCH] ARM: OMAP4+: SMP: use lockless clkdm/pwrdm api in omap4_boot_secondary Date: Wed, 25 Nov 2015 11:03:37 -0800 Message-ID: <20151125190336.GR2517@atomide.com> References: <1447695533-11460-1-git-send-email-grygorii.strashko@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1447695533-11460-1-git-send-email-grygorii.strashko@ti.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Grygorii Strashko Cc: Tero Kristo , linux-omap@vger.kernel.org, nsekhar@ti.com, linux-arm-kernel@lists.infradead.org List-Id: linux-omap@vger.kernel.org * Grygorii Strashko [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: [] vfs_write+0x13c/0x164 > #1: (&of->mutex){+.+.+.}, at: [] kernfs_fop_write+0x48/0x19c > #2: (s_active#24){.+.+.+}, at: [] kernfs_fop_write+0x50/0x19c > #3: (device_hotplug_lock){+.+.+.}, at: [] lock_device_hotplug_sysfs+0xc/0x4c > #4: (&dev->mutex){......}, at: [] device_online+0x14/0x88 > #5: (cpu_add_remove_lock){+.+.+.}, at: [] cpu_up+0x50/0x1a0 > #6: (cpu_hotplug.lock){++++++}, at: [] cpu_hotplug_begin+0x0/0xc4 > #7: (cpu_hotplug.lock#2){+.+.+.}, at: [] cpu_hotplug_begin+0x78/0xc4 > #8: (boot_lock){+.+...}, at: [] 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) > [] (unwind_backtrace) from [] (show_stack+0x10/0x14) > [] (show_stack) from [] (dump_stack+0x80/0x94) > [] (dump_stack) from [] (rt_spin_lock+0x24/0x54) > [] (rt_spin_lock) from [] (clkdm_wakeup+0x10/0x2c) > [] (clkdm_wakeup) from [] (omap4_boot_secondary+0x88/0x178) > [] (omap4_boot_secondary) from [] (__cpu_up+0xc4/0x164) > [] (__cpu_up) from [] (cpu_up+0x15c/0x1a0) > [] (cpu_up) from [] (device_online+0x64/0x88) > [] (device_online) from [] (online_store+0x68/0x74) > [] (online_store) from [] (kernfs_fop_write+0xb8/0x19c) > [] (kernfs_fop_write) from [] (__vfs_write+0x20/0xd8) > [] (__vfs_write) from [] (vfs_write+0x90/0x164) > [] (vfs_write) from [] (SyS_write+0x44/0x9c) > [] (SyS_write) from [] (ret_fast_syscall+0x0/0x54) > CPU1: smp_ops.cpu_die() returned, trying to resuscitate > > Cc: Tero Kristo > Signed-off-by: Grygorii Strashko 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 > From mboxrd@z Thu Jan 1 00:00:00 1970 From: tony@atomide.com (Tony Lindgren) Date: Wed, 25 Nov 2015 11:03:37 -0800 Subject: [PATCH] ARM: OMAP4+: SMP: use lockless clkdm/pwrdm api in omap4_boot_secondary In-Reply-To: <1447695533-11460-1-git-send-email-grygorii.strashko@ti.com> References: <1447695533-11460-1-git-send-email-grygorii.strashko@ti.com> Message-ID: <20151125190336.GR2517@atomide.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org * Grygorii Strashko [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: [] vfs_write+0x13c/0x164 > #1: (&of->mutex){+.+.+.}, at: [] kernfs_fop_write+0x48/0x19c > #2: (s_active#24){.+.+.+}, at: [] kernfs_fop_write+0x50/0x19c > #3: (device_hotplug_lock){+.+.+.}, at: [] lock_device_hotplug_sysfs+0xc/0x4c > #4: (&dev->mutex){......}, at: [] device_online+0x14/0x88 > #5: (cpu_add_remove_lock){+.+.+.}, at: [] cpu_up+0x50/0x1a0 > #6: (cpu_hotplug.lock){++++++}, at: [] cpu_hotplug_begin+0x0/0xc4 > #7: (cpu_hotplug.lock#2){+.+.+.}, at: [] cpu_hotplug_begin+0x78/0xc4 > #8: (boot_lock){+.+...}, at: [] 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) > [] (unwind_backtrace) from [] (show_stack+0x10/0x14) > [] (show_stack) from [] (dump_stack+0x80/0x94) > [] (dump_stack) from [] (rt_spin_lock+0x24/0x54) > [] (rt_spin_lock) from [] (clkdm_wakeup+0x10/0x2c) > [] (clkdm_wakeup) from [] (omap4_boot_secondary+0x88/0x178) > [] (omap4_boot_secondary) from [] (__cpu_up+0xc4/0x164) > [] (__cpu_up) from [] (cpu_up+0x15c/0x1a0) > [] (cpu_up) from [] (device_online+0x64/0x88) > [] (device_online) from [] (online_store+0x68/0x74) > [] (online_store) from [] (kernfs_fop_write+0xb8/0x19c) > [] (kernfs_fop_write) from [] (__vfs_write+0x20/0xd8) > [] (__vfs_write) from [] (vfs_write+0x90/0x164) > [] (vfs_write) from [] (SyS_write+0x44/0x9c) > [] (SyS_write) from [] (ret_fast_syscall+0x0/0x54) > CPU1: smp_ops.cpu_die() returned, trying to resuscitate > > Cc: Tero Kristo > Signed-off-by: Grygorii Strashko 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 >