Messages in this thread | | | Date | Tue, 05 May 2015 20:08:32 -0400 | From | Sasha Levin <> | Subject | Re: [PATCH tip/core/rcu 2/2] rcu: Tighten up affinity and check for sysidle |
| |
On 05/05/2015 02:45 PM, Paul E. McKenney wrote: > On Tue, May 05, 2015 at 12:27:21AM -0700, Paul E. McKenney wrote: >> On Mon, May 04, 2015 at 06:10:31PM -0400, Sasha Levin wrote: >>> On 03/03/2015 12:50 PM, Paul E. McKenney wrote: >>>> From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> >>>> >>>> If the RCU grace-period kthread invoking rcu_sysidle_check_cpu() >>>> happens to be running on the tick_do_timer_cpu initially, >>>> then rcu_bind_gp_kthread() won't bind it. This kthread might >>>> then migrate before invoking rcu_gp_fqs(), which will trigger the >>>> WARN_ON_ONCE() in rcu_sysidle_check_cpu(). This commit therefore makes >>>> rcu_bind_gp_kthread() do the binding even if the kthread is currently >>>> on the same CPU. Because this incurs added overhead, this commit also >>>> causes each RCU grace-period kthread to invoke rcu_bind_gp_kthread() >>>> once at boot rather than at the beginning of each grace period. >>>> And as long as rcu_bind_gp_kthread() is being modified, this commit >>>> eliminates its #ifdef. >>>> >>>> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> >>>> --- >>>> kernel/rcu/tree.c | 2 +- >>>> kernel/rcu/tree_plugin.h | 12 ++++++------ >>>> 2 files changed, 7 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c >>>> index 735bd7ee749a..a6972c20eaa5 100644 >>>> --- a/kernel/rcu/tree.c >>>> +++ b/kernel/rcu/tree.c >>>> @@ -1707,7 +1707,6 @@ static int rcu_gp_init(struct rcu_state *rsp) >>>> struct rcu_node *rnp = rcu_get_root(rsp); >>>> >>>> ACCESS_ONCE(rsp->gp_activity) = jiffies; >>>> - rcu_bind_gp_kthread(); >>>> raw_spin_lock_irq(&rnp->lock); >>>> smp_mb__after_unlock_lock(); >>>> if (!ACCESS_ONCE(rsp->gp_flags)) { >>>> @@ -1895,6 +1894,7 @@ static int __noreturn rcu_gp_kthread(void *arg) >>>> struct rcu_state *rsp = arg; >>>> struct rcu_node *rnp = rcu_get_root(rsp); >>>> >>>> + rcu_bind_gp_kthread(); >>>> for (;;) { >>>> >>>> /* Handle grace-period start. */ >>>> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h >>>> index 0a571e9a0f1d..b46c92824db1 100644 >>>> --- a/kernel/rcu/tree_plugin.h >>>> +++ b/kernel/rcu/tree_plugin.h >>>> @@ -2763,7 +2763,8 @@ static void rcu_sysidle_exit(int irq) >>>> >>>> /* >>>> * Check to see if the current CPU is idle. Note that usermode execution >>>> - * does not count as idle. The caller must have disabled interrupts. >>>> + * does not count as idle. The caller must have disabled interrupts, >>>> + * and must be running on tick_do_timer_cpu. >>>> */ >>>> static void rcu_sysidle_check_cpu(struct rcu_data *rdp, bool *isidle, >>>> unsigned long *maxj) >>>> @@ -2784,8 +2785,8 @@ static void rcu_sysidle_check_cpu(struct rcu_data *rdp, bool *isidle, >>>> if (!*isidle || rdp->rsp != rcu_state_p || >>>> cpu_is_offline(rdp->cpu) || rdp->cpu == tick_do_timer_cpu) >>>> return; >>>> - if (rcu_gp_in_progress(rdp->rsp)) >>>> - WARN_ON_ONCE(smp_processor_id() != tick_do_timer_cpu); >>>> + /* Verify affinity of current kthread. */ >>>> + WARN_ON_ONCE(smp_processor_id() != tick_do_timer_cpu); >>> >>> Hey Paul, >>> >>> I seem to be hitting this warning: >>> >>> [22408.472078] ------------[ cut here ]------------ >>> [22408.476972] WARNING: CPU: 1 PID: 8 at kernel/rcu/tree_plugin.h:2796 rcu_sysidle_check_cpu+0x374/0x3f0() >>> [22408.481567] Modules linked in: >>> [22408.486054] CPU: 1 PID: 8 Comm: rcu_sched Tainted: G W 4.1.0-rc1-next-20150504+ #3 >>> [22408.490576] Hardware name: Oracle Corporation OVCA X3-2 /ASSY,MOTHERBOARD,1U , BIOS 17021300 06/19/2012 >>> [22408.495117] ffff881ff2db4600 0000000044d8814b ffff881ff2f1fab8 ffffffff830f9926 >>> [22408.499647] 0000000000000000 0000000000000000 ffff881ff2f1fb08 ffffffff8120bed0 >>> [22408.504120] ffff881ff2f1fb88 ffffffff81324ec4 1ffff103fe5e3f65 ffff881ff2f1fd48 >>> [22408.508568] Call Trace: >>> [22408.512953] dump_stack (lib/dump_stack.c:52) >>> [22408.517331] warn_slowpath_common (kernel/panic.c:447) >>> [22408.521637] ? rcu_sysidle_check_cpu (kernel/rcu/tree_plugin.h:2796 (discriminator 53)) >>> [22408.525899] warn_slowpath_null (kernel/panic.c:481) >>> [22408.530105] rcu_sysidle_check_cpu (kernel/rcu/tree_plugin.h:2796 (discriminator 53)) >>> [22408.534287] ? console_conditional_schedule (kernel/time/timer.c:1472) >>> [22408.538413] dyntick_save_progress_counter (kernel/rcu/tree.c:1041) >>> [22408.542486] force_qs_rnp (kernel/rcu/tree.c:2793) >>> [22408.546504] ? wake_up_atomic_t (kernel/sched/wait.c:200) >>> [22408.550461] ? rcu_sysidle_check_cpu (kernel/rcu/tree.c:1039) >>> [22408.554374] rcu_gp_kthread (kernel/rcu/tree.c:1914 include/linux/jump_label.h:125 include/linux/context_tracking_state.h:28 include/linux/tick.h:123 kernel/rcu/tree_plugin.h:2914 kernel/rcu/tree.c:1916 kernel/rcu/tree.c:2075) >>> [22408.558240] ? rcu_oom_notify (kernel/rcu/tree.c:2012) >>> [22408.562044] ? finish_task_switch (include/linux/tick.h:179 kernel/sched/core.c:2248) >>> [22408.565789] ? __schedule (kernel/sched/core.c:2340 kernel/sched/core.c:2798) >>> [22408.569473] ? __wake_up_common (kernel/sched/wait.c:73) >>> [22408.573088] ? prepare_to_wait_event (kernel/sched/wait.c:292) >>> [22408.576665] ? rcu_oom_notify (kernel/rcu/tree.c:2012) >>> [22408.580197] kthread (kernel/kthread.c:207) >>> [22408.583652] ? arch_vtime_task_switch (kernel/sched/cputime.c:753) >>> [22408.587065] ? kthread_create_on_node (kernel/kthread.c:176) >>> [22408.590427] ? kthread_create_on_node (kernel/kthread.c:176) >>> [22408.593713] ret_from_fork (arch/x86/kernel/entry_64.S:640) >>> [22408.596972] ? kthread_create_on_node (kernel/kthread.c:176) >> >> That is certainly not what I wanted to happen! ;-) >> >> Looking into it. > > Could you please send along your .CONFIG?
Attached.
Thanks, Sasha
[unhandled content-type:application/gzip] | |