Fix OMAP uses of RCU from idle loop
Subsystems (8)
v2 cover Fix OMAP uses of RCU from idle loop
Hello!
The following series fixes a number of uses of RCU from the idle loop. These are all due to tracing, so the fix is simply to append _rcuidle to the event-tracing call.
Changes since v1: Fix commit-log subjects and add maintainers on CC.
Thanx, Paul
------------------------------------------------------------------------
arch/arm/kernel/smp.c | 2 +- arch/arm/mach-omap2/powerdomain.c | 9 +++++---- drivers/base/power/runtime.c | 14 +++++++------- drivers/clk/clk.c | 8 ++++---- 4 files changed, 17 insertions(+), 16 deletions(-)
PATCH v2 1/6 arm: Use _rcuidle tracepoint to allow use from idle
Testing on ARM encountered the following pair of lockdep-RCU splats:
------------------------------------------------------------------------
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc4-next-20160422 #1 Not tainted
-------------------------------include/trace/events/power.h:328 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from idle CPU!rcu_scheduler_active = 1, debug_locks = 0
RCU used illegally from extended quiescent state!
no locks held by swapper/0/0.
stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc4-next-20160422 #1 Hardware name: Generic OMAP3-GP (Flattened Device Tree) [<c010f55c>] (unwind_backtrace) from [<c010b64c>] (show_stack+0x10/0x14) [<c010b64c>] (show_stack) from [<c047acbc>] (dump_stack+0xa8/0xe0) [<c047acbc>] (dump_stack) from [<c012bc10>] (pwrdm_set_next_pwrst+0xf8/0x1cc) [<c012bc10>] (pwrdm_set_next_pwrst) from [<c01269fc>] (omap3_enter_idle_bm+0x1b8/0x1e8) [<c01269fc>] (omap3_enter_idle_bm) from [<c05fa0b8>] (cpuidle_enter_state+0x84/0x408) [<c05fa0b8>] (cpuidle_enter_state) from [<c0182c1c>] (cpu_startup_entry+0x1c8/0x3f0) [<c0182c1c>] (cpu_startup_entry) from [<c0b00c20>] (start_kernel+0x354/0x3cc)
------------------------------------------------------------------------
[<c010f55c>] (unwind_backtrace) from [<c010b64c>] (show_stack+0x10/0x14) [<c010b64c>] (show_stack) from [<c047ac3c>] (dump_stack+0xa8/0xe0) [<c047ac3c>] (dump_stack) from [<c012c340>] (_pwrdm_state_switch+0x188/0x32c) [<c012c340>] (_pwrdm_state_switch) from [<c012c4f0>] (_pwrdm_post_transition_cb+0xc/0x14) [<c012c4f0>] (_pwrdm_post_transition_cb) from [<c012ba74>] (pwrdm_for_each+0x30/0x5c) [<c012ba74>] (pwrdm_for_each) from [<c012c72c>] (pwrdm_post_transition+0x24/0x30) [<c012c72c>] (pwrdm_post_transition) from [<c012548c>] (omap_sram_idle+0xfc/0x240) [<c012548c>] (omap_sram_idle) from [<c0126934>] (omap3_enter_idle_bm+0xf0/0x1e8) [<c0126934>] (omap3_enter_idle_bm) from [<c05fa038>] (cpuidle_enter_state+0x84/0x408) [<c05fa038>] (cpuidle_enter_state) from [<c0182b90>] (cpu_startup_entry+0x1c8/0x3f0) [<c0182b90>] (cpu_startup_entry) from [<c0b00c20>] (start_kernel+0x354/0x3cc)
------------------------------------------------------------------------
These are caused by event tracing from the idle loop, and they were exposed by commit 293e2421fe25 ("rcu: Remove superfluous versions of rcu_read_lock_sched_held()"), which suppressed some false negatives. The current commit therefore adds the _rcuidle suffix to make RCU aware of this implicit use of RCU by event tracing, thus preventing both splats.
--- arch/arm/mach-omap2/powerdomain.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
arch/arm/mach-omap2/powerdomain.c +5 -4
@@ -186,8 +186,9 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) trace_state = (PWRDM_TRACE_STATES_FLAG | ((next &OMAP_POWERSTATE_MASK ) <<8 ) | ((prev &OMAP_POWERSTATE_MASK ) <<0 )); -trace_power_domain_target (pwrdm->name, trace_state, -smp_processor_id ()); +trace_power_domain_target_rcuidle (pwrdm->name, + trace_state, +smp_processor_id ()); }break ;default :
@@ -523,8 +524,8 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {/* Trace the pwrdm desired target state */ -trace_power_domain_target (pwrdm->name, pwrst, -smp_processor_id ()); +trace_power_domain_target_rcuidle (pwrdm->name, pwrst, +smp_processor_id ());/* Program the pwrdm desired target state */ ret = arch_pwrdm->pwrdm_set_next_pwrst (pwrdm, pwrst); }
Signature · 1 line
2.5.2
PATCH v2 2/6 arm: Use _rcuidle for suspend/resume tracepoints
In reply to Paul E. McKenneyFurther testing with false negatives suppressed by commit 293e2421fe25 ("rcu: Remove superfluous versions of rcu_read_lock_sched_held()") identified a few more unprotected uses of RCU from the idle loop. Because RCU actively ignores idle-loop code (for energy-efficiency reasons, among other things), using RCU from the idle loop can result in too-short grace periods, in turn resulting in arbitrary misbehavior.
The affected functions are smp_cross_call() and rpm_suspend().
The resulting lockdep-RCU splats are as follows:
------------------------------------------------------------------------
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1112 Not tainted
-------------------------------include/trace/events/ipi.h:35 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from idle CPU!rcu_scheduler_active = 1, debug_locks = 0
RCU used illegally from extended quiescent state!
no locks held by swapper/0/0.
stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1112 Hardware name: Generic OMAP4 (Flattened Device Tree) [<c0110308>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fec8>] (dump_stack+0xb0/0xe4) [<c047fec8>] (dump_stack) from [<c010dcfc>] (smp_cross_call+0xbc/0x188) [<c010dcfc>] (smp_cross_call) from [<c01c9e28>] (generic_exec_single+0x9c/0x15c)
[<c01c9e28>] (generic_exec_single) from [<c01ca0a0>] (smp_call_function_single_async+0 x38/0x9c) [<c01ca0a0>] (smp_call_function_single_async) from [<c0603728>] (cpuidle_coupled_poke_others+0x8c/0xa8) [<c0603728>] (cpuidle_coupled_poke_others) from [<c0603c10>] (cpuidle_enter_state_coupled+0x26c/0x390) [<c0603c10>] (cpuidle_enter_state_coupled) from [<c0183c74>] (cpu_startup_entry+0x198/0x3a0) [<c0183c74>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8) [<c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
------------------------------------------------------------------------
Warning from omap3
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1112 Not tainted
-------------------------------include/trace/events/rpm.h:63 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from idle CPU!rcu_scheduler_active = 1, debug_locks = 0
RCU used illegally from extended quiescent state!
1 lock held by swapper/0/0:
#0: (&(&dev->power.lock)->rlock){-.-...}, at: [<c052ee24>] __pm_runtime_suspend+0x54/0x84
stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1112 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110308>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fec8>] (dump_stack+0xb0/0xe4) [<c047fec8>] (dump_stack) from [<c052d7b4>] (rpm_suspend+0x604/0x7e4) [<c052d7b4>] (rpm_suspend) from [<c052ee34>] (__pm_runtime_suspend+0x64/0x84) [<c052ee34>] (__pm_runtime_suspend) from [<c04bf3bc>] (omap2_gpio_prepare_for_idle+0x5c/0x70) [<c04bf3bc>] (omap2_gpio_prepare_for_idle) from [<c01255e8>] (omap_sram_idle+0x140/0x244) [<c01255e8>] (omap_sram_idle) from [<c0126b48>] (omap3_enter_idle_bm+0xfc/0x1ec) [<c0126b48>] (omap3_enter_idle_bm) from [<c0601db8>] (cpuidle_enter_state+0x80/0x3d4) [<c0601db8>] (cpuidle_enter_state) from [<c0183c74>] (cpu_startup_entry+0x198/0x3a0) [<c0183c74>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8)
[<c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
------------------------------------------------------------------------
--- arch/arm/kernel/smp.c | 2 +- drivers/base/power/runtime.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/kernel/smp.c +1 -1
@@ -486,7 +486,7 @@ static const char *ipi_types[NR_IPI] __tracepoint_string = {static void smp_cross_call (const struct cpumask *target,unsigned int ipinr) { -trace_ipi_raise (target, ipi_types[ipinr]); +trace_ipi_raise_rcuidle (target, ipi_types[ipinr]);__smp_cross_call (target, ipinr); }
drivers/base/power/runtime.c +2 -2
@@ -419,7 +419,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)struct device *parent =NULL ;int retval; -trace_rpm_suspend (dev, rpmflags); +trace_rpm_suspend_rcuidle (dev, rpmflags); repeat: retval =rpm_check_suspend_allowed (dev);
@@ -549,7 +549,7 @@ static int rpm_suspend(struct device *dev, int rpmflags) } out: -trace_rpm_return_int (dev, _THIS_IP_, retval); +trace_rpm_return_int_rcuidle (dev, _THIS_IP_, retval);return retval;
Signature · 1 line
2.5.2
PATCH v2 3/6 arm: Add _rcuidle tracepoints to allow clk_core_disable() use from idle
In reply to Paul E. McKenneyThis commit adds an _rcuidle suffix to a pair of trace events to prevent the following splat:
Quoted 32 lines
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1114 Not tainted
-------------------------------include/trace/events/clk.h:59suspiciousrcu_dereference_check()usage!other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active= 1,debug_locks= 0
RCU used illegally from extended quiescent state!
2 locks held by swapper/0/0:
#0: (&oh->hwmod_key#30){......}, at: [<c0121b40>]omap_hwmod_idle+0x18/0x44#1: (enable_lock){......}, at: [<c0630998>]clk_enable_lock+0x18/0x124stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1114 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c0631618>] (clk_core_disable+0x17c/0x348) [<c0631618>] (clk_core_disable) from [<c0632774>] (clk_disable+0x24/0x30) [<c0632774>] (clk_disable) from [<c0120590>] (_disable_clocks+0x18/0x7c) [<c0120590>] (_disable_clocks) from [<c0121680>] (_idle+0x12c/0x230) [<c0121680>] (_idle) from [<c0121b4c>] (omap_hwmod_idle+0x24/0x44) [<c0121b4c>] (omap_hwmod_idle) from [<c0122c24>] (omap_device_idle+0x3c/0x90) [<c0122c24>] (omap_device_idle) from [<c052cc00>] (__rpm_callback+0x2c/0x60) [<c052cc00>] (__rpm_callback) from [<c052cc54>] (rpm_callback+0x20/0x80) [<c052cc54>] (rpm_callback) from [<c052d150>] (rpm_suspend+0x100/0x768) [<c052d150>] (rpm_suspend) from [<c052ec58>] (__pm_runtime_suspend+0x64/0x84) [<c052ec58>] (__pm_runtime_suspend) from [<c04bf25c>] (omap2_gpio_prepare_for_idle+0x5
Quoted 8 lines
c/0x70)
[<c04bf25c>] (omap2_gpio_prepare_for_idle) from [<c0125568>] (omap_sram_idle+0x140/0x2
44)
[<c0125568>] (omap_sram_idle) from [<c01269dc>] (omap3_enter_idle_bm+0xfc/0x1ec) [<c01269dc>] (omap3_enter_idle_bm) from [<c0601bdc>] (cpuidle_enter_state+0x80/0x3d4) [<c0601bdc>] (cpuidle_enter_state) from [<c0183b08>] (cpu_startup_entry+0x198/0x3a0) [<c0183b08>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8) [<c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
--- drivers/clk/clk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/clk.c +2 -2
@@ -682,12 +682,12 @@ static void clk_core_disable(struct clk_core *core)if (--core->enable_count >0 )return ; -trace_clk_disable (core); +trace_clk_disable_rcuidle (core);if (core->ops->disable) core->ops->disable (core->hw); -trace_clk_disable_complete (core); +trace_clk_disable_complete_rcuidle (core);clk_core_disable (core->parent); }
Signature · 1 line
2.5.2
Re: [PATCH v2 omap 3/6] arm: Add _rcuidle tracepoints to allow clk_core_disable() use from idle
Quoted 11 lines · Paul E. McKenney
Quoted 11 lines
stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1114 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c0631618>] (clk_core_disable+0x17c/0x348) [<c0631618>] (clk_core_disable) from [<c0632774>] (clk_disable+0x24/0x30) [<c0632774>] (clk_disable) from [<c0120590>] (_disable_clocks+0x18/0x7c) [<c0120590>] (_disable_clocks) from [<c0121680>] (_idle+0x12c/0x230) [<c0121680>] (_idle) from [<c0121b4c>] (omap_hwmod_idle+0x24/0x44) [<c0121b4c>] (omap_hwmod_idle) from [<c0122c24>] (omap_device_idle+0x3c/0x90)
Quoted 8 lines
Quoted 8 lines
[<
c0122c24>] (omap_device_idle) from [<c052cc00>] (__rpm_callback+0x2c/0x60) [<c052cc00>] (__rpm_callback) from [<c052cc54>] (rpm_callback+0x20/0x80) [<c052cc54>] (rpm_callback) from [<c052d150>] (rpm_suspend+0x100/0x768) [<c052d150>] (rpm_suspend) from [<c052ec58>] (__pm_runtime_suspend+0x64/0x84) [<c052ec58>] (__pm_runtime_suspend) from [<c04bf25c>] (omap2_gpio_prepare_for_idle+0x5c/0x70)
[<c04bf25c>] (omap2_gpio_prepare_for_idle) from [<c0125568>] (omap_sram_idle+0x140/0x2
44)
Wouldn't the stack trace look better without the word wrap? :-)
Regards.
Re: [PATCH v2 omap 3/6] arm: Add _rcuidle tracepoints to allow clk_core_disable() use from idle
Quoted 22 lines · Mason
Quoted 11 lines · Paul E. McKenney
Quoted 11 lines
stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1114 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c0631618>] (clk_core_disable+0x17c/0x348) [<c0631618>] (clk_core_disable) from [<c0632774>] (clk_disable+0x24/0x30) [<c0632774>] (clk_disable) from [<c0120590>] (_disable_clocks+0x18/0x7c) [<c0120590>] (_disable_clocks) from [<c0121680>] (_idle+0x12c/0x230) [<c0121680>] (_idle) from [<c0121b4c>] (omap_hwmod_idle+0x24/0x44) [<c0121b4c>] (omap_hwmod_idle) from [<c0122c24>] (omap_device_idle+0x3c/0x90)Quoted 8 lines
Quoted 8 lines
[<
c0122c24>] (omap_device_idle) from [<c052cc00>] (__rpm_callback+0x2c/0x60) [<c052cc00>] (__rpm_callback) from [<c052cc54>] (rpm_callback+0x20/0x80) [<c052cc54>] (rpm_callback) from [<c052d150>] (rpm_suspend+0x100/0x768) [<c052d150>] (rpm_suspend) from [<c052ec58>] (__pm_runtime_suspend+0x64/0x84) [<c052ec58>] (__pm_runtime_suspend) from [<c04bf25c>] (omap2_gpio_prepare_for_idle+0x5c/0x70)
[<c04bf25c>] (omap2_gpio_prepare_for_idle) from [<c0125568>] (omap_sram_idle+0x140/0x2
44)
Quoted 1 line
Wouldn't the stack trace look better without the word wrap? :-)
Truth in advertising!!! ;-)
Thanx, Paul
PATCH v2 4/6 arm: Add _rcuidle suffix to allow rpm_idle() use from idle
In reply to Paul E. McKenneyThis commit appends a few _rcuidle suffixes to fix the following RCU-used-from-idle bug:
Quoted 28 lines
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1116 Not tainted
-------------------------------include/trace/events/rpm.h:95suspiciousrcu_dereference_check()usage!other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active= 1,debug_locks= 0
RCU used illegally from extended quiescent state!
1 lock held by swapper/0/0:
#0: (&(&dev->power.lock)->rlock){-.-...}, at: [<c052cc2c>]__rpm_callback+0x58/0x60stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1116 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c052d5d0>] (rpm_suspend+0x580/0x768) [<c052d5d0>] (rpm_suspend) from [<c052ec58>] (__pm_runtime_suspend+0x64/0x84) [<c052ec58>] (__pm_runtime_suspend) from [<c04bf25c>] (omap2_gpio_prepare_for_idle+0x5c/0x70) [<c04bf25c>] (omap2_gpio_prepare_for_idle) from [<c0125568>] (omap_sram_idle+0x140/0x244) [<c0125568>] (omap_sram_idle) from [<c01269dc>] (omap3_enter_idle_bm+0xfc/0x1ec) [<c01269dc>] (omap3_enter_idle_bm) from [<c0601bdc>] (cpuidle_enter_state+0x80/0x3d4) [<c0601bdc>] (cpuidle_enter_state) from [<c0183b08>] (cpu_startup_entry+0x198/0x3a0) [<c0183b08>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8)
Quoted 1 line
[<
c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
In the immortal words of Steven Rostedt, "*Whack* *Whack* *Whack*!!!"
--- drivers/base/power/runtime.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/base/power/runtime.c +3 -3
@@ -301,7 +301,7 @@ static int rpm_idle(struct device *dev, int rpmflags)int (*callback)(struct device *);int retval; -trace_rpm_idle (dev, rpmflags); +trace_rpm_idle_rcuidle (dev, rpmflags); retval =rpm_check_suspend_allowed (dev);if (retval <0 ) ;/* Conditions are wrong. */
@@ -337,7 +337,7 @@ static int rpm_idle(struct device *dev, int rpmflags) dev->power.request_pending = true;queue_work (pm_wq, &dev->power.work); } -trace_rpm_return_int (dev, _THIS_IP_,0 ); +trace_rpm_return_int_rcuidle (dev, _THIS_IP_,0 );return 0 ; }
@@ -352,7 +352,7 @@ static int rpm_idle(struct device *dev, int rpmflags)wake_up_all (&dev->power.wait_queue); out: -trace_rpm_return_int (dev, _THIS_IP_, retval); +trace_rpm_return_int_rcuidle (dev, _THIS_IP_, retval);return retval ? retval :rpm_suspend (dev, rpmflags |RPM_AUTO ); }
Signature · 1 line
2.5.2
PATCH v2 5/6 arm: Add _rcuidle suffix to allow rpm_resume() to be called from idle
In reply to Paul E. McKenneyThis commit applies another _rcuidle suffix to fix an RCU use from idle.
Quoted 27 lines
===============================
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1122 Not tainted
-------------------------------include/trace/events/rpm.h:69suspiciousrcu_dereference_check()usage!other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active= 1,debug_locks= 0
RCU used illegally from extended quiescent state!
1 lock held by swapper/0/0:
#0: (&(&dev->power.lock)->rlock){-.-...}, at: [<c052e3dc>]__pm_runtime_resume+0x3c/0x64stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1122 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c052e178>] (rpm_resume+0x5cc/0x7f4) [<c052e178>] (rpm_resume) from [<c052e3ec>] (__pm_runtime_resume+0x4c/0x64) [<c052e3ec>] (__pm_runtime_resume) from [<c04bf2c4>] (omap2_gpio_resume_after_idle+0x54/0x68) [<c04bf2c4>] (omap2_gpio_resume_after_idle) from [<c01269dc>] (omap3_enter_idle_bm+0xfc/0x1ec) [<c01269dc>] (omap3_enter_idle_bm) from [<c060198c>] (cpuidle_enter_state+0x80/0x3d4) [<c060198c>] (cpuidle_enter_state) from [<c0183b08>] (cpu_startup_entry+0x198/0x3a0) [<c0183b08>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8)
Quoted 1 line
[<
c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
--- drivers/base/power/runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/base/power/runtime.c +2 -2
@@ -601,7 +601,7 @@ static int rpm_resume(struct device *dev, int rpmflags)struct device *parent =NULL ;int retval =0 ; -trace_rpm_resume (dev, rpmflags); +trace_rpm_resume_rcuidle (dev, rpmflags); repeat:if (dev->power.runtime_error)
@@ -764,7 +764,7 @@ static int rpm_resume(struct device *dev, int rpmflags)spin_lock_irq (&dev->power.lock); } -trace_rpm_return_int (dev, _THIS_IP_, retval); +trace_rpm_return_int_rcuidle (dev, _THIS_IP_, retval);return retval; }
Signature · 1 line
2.5.2
PATCH v2 6/6 arm: Use _rcuidle suffix to allow clk_core_enable() to used from idle
In reply to Paul E. McKenneyThis commit fixes the RCU use-from-idle bug corresponding the following splat:
Quoted 36 lines
[ INFO: suspicious RCU usage. ]
4.6.0-rc5-next-20160426+ #1127 Not tainted
-------------------------------include/trace/events/clk.h:45suspiciousrcu_dereference_check()usage!other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active= 1,debug_locks= 0
RCU used illegally from extended quiescent state!
2 locks held by swapper/0/0:
#0: (&oh->hwmod_key#30){......}, at: [<c0121afc>]omap_hwmod_enable+0x18/0x44#1: (enable_lock){......}, at: [<c0630684>]clk_enable_lock+0x18/0x124stack backtrace: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.6.0-rc5-next-20160426+ #1127 Hardware name: Generic OMAP36xx (Flattened Device Tree) [<c0110290>] (unwind_backtrace) from [<c010c3a8>] (show_stack+0x10/0x14) [<c010c3a8>] (show_stack) from [<c047fd68>] (dump_stack+0xb0/0xe4) [<c047fd68>] (dump_stack) from [<c06315c0>] (clk_core_enable+0x1e0/0x36c) [<c06315c0>] (clk_core_enable) from [<c0632298>] (clk_enable+0x1c/0x38) [<c0632298>] (clk_enable) from [<c01204e0>] (_enable_clocks+0x18/0x7c) [<c01204e0>] (_enable_clocks) from [<c012137c>] (_enable+0x114/0x2ec) [<c012137c>] (_enable) from [<c0121b08>] (omap_hwmod_enable+0x24/0x44) [<c0121b08>] (omap_hwmod_enable) from [<c0122ad0>] (omap_device_enable+0x3c/0x90) [<c0122ad0>] (omap_device_enable) from [<c0122b34>] (_od_runtime_resume+0x10/0x38) [<c0122b34>] (_od_runtime_resume) from [<c052cc00>] (__rpm_callback+0x2c/0x60) [<c052cc00>] (__rpm_callback) from [<c052cc54>] (rpm_callback+0x20/0x80) [<c052cc54>] (rpm_callback) from [<c052df7c>] (rpm_resume+0x3d0/0x6f0) [<c052df7c>] (rpm_resume) from [<c052e2e8>] (__pm_runtime_resume+0x4c/0x64) [<c052e2e8>] (__pm_runtime_resume) from [<c04bf2c4>] (omap2_gpio_resume_after_idle+0x54/0x68) [<c04bf2c4>] (omap2_gpio_resume_after_idle) from [<c01269dc>] (omap3_enter_idle_bm+0xfc/0x1ec) [<c01269dc>] (omap3_enter_idle_bm) from [<c0601888>] (cpuidle_enter_state+0x80/0x3d4) [<c0601888>] (cpuidle_enter_state) from [<c0183b08>] (cpu_startup_entry+0x198/0x3a0) [<c0183b08>] (cpu_startup_entry) from [<c0b00c0c>] (start_kernel+0x354/0x3c8)
Quoted 1 line
[<
c0b00c0c>] (start_kernel) from [<8000807c>] (0x8000807c)
--- drivers/clk/clk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/clk.c +2 -2
@@ -735,12 +735,12 @@ static int clk_core_enable(struct clk_core *core)if (ret)return ret; -trace_clk_enable (core); +trace_clk_enable_rcuidle (core);if (core->ops->enable) ret = core->ops->enable (core->hw); -trace_clk_enable_complete (core); +trace_clk_enable_complete_rcuidle (core);if (ret) {clk_core_disable (core->parent);
Signature · 1 line
2.5.2
Quoted 8 lines · Paul E. McKenney
Hello!
The following series fixes a number of uses of RCU from the idle loop. These are all due to tracing, so the fix is simply to append
_rcuidleto the event-tracing call.Changes since v1: Fix commit-log subjects and add maintainers on CC.
For the series, on top of mainline (which now experiences the problem fixed by this series):
Guenter
Paul E. McKenney
AppliedQuoted 7 lines · Guenter Roeck
Quoted 6 lines · Paul E. McKenney
Hello!
The following series fixes a number of uses of RCU from the idle loop. These are all due to tracing, so the fix is simply to append
_rcuidleto the event-tracing call.
Quoted 7 lines
Quoted 2 lines
Changes since v1: Fix commit-log subjects and add maintainers on CC.
For the series, on top of mainline (which now experiences the problem fixed by this series):
Tested-by Guenter Roeck <[email protected]>
Applied, thank you! And fixed the line-wrapping while I was at it. ;-)
Thanx, Paul