Skip to content

Commit 0b9a29a

Browse files
committed
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 293e242 ("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. Reported-by: Guenter Roeck <[email protected]> Signed-off-by: Paul E. McKenney <[email protected]> Tested-by: Guenter Roeck <[email protected]> Tested-by: Tony Lindgren <[email protected]> Cc: Russell King <[email protected]> Reviewed-by: Steven Rostedt <[email protected]> Cc: <[email protected]> Cc: <[email protected]>
1 parent f55532a commit 0b9a29a

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

arch/arm/mach-omap2/powerdomain.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,9 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
186186
trace_state = (PWRDM_TRACE_STATES_FLAG |
187187
((next & OMAP_POWERSTATE_MASK) << 8) |
188188
((prev & OMAP_POWERSTATE_MASK) << 0));
189-
trace_power_domain_target(pwrdm->name, trace_state,
190-
smp_processor_id());
189+
trace_power_domain_target_rcuidle(pwrdm->name,
190+
trace_state,
191+
smp_processor_id());
191192
}
192193
break;
193194
default:
@@ -523,8 +524,8 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
523524

524525
if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {
525526
/* Trace the pwrdm desired target state */
526-
trace_power_domain_target(pwrdm->name, pwrst,
527-
smp_processor_id());
527+
trace_power_domain_target_rcuidle(pwrdm->name, pwrst,
528+
smp_processor_id());
528529
/* Program the pwrdm desired target state */
529530
ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
530531
}

0 commit comments

Comments
 (0)