rcu: Provide improved interrupt-from-idle check in rcu_check_callbacks()
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 9 Jul 2018 22:50:16 +0000 (15:50 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 30 Aug 2018 23:03:39 +0000 (16:03 -0700)
The patch making need_resched() respond to urgent RCU-QS needs used
is_idle_task(current) to detect an interrupt from idle, which does work
reasonably, but is (in theory at least) vulnerable to loops containing
need_resched() invoked from within RCU_NONIDLE() or its tracepoint
equivalent.  This commit therefore moves rcu_is_cpu_rrupt_from_idle()
to a place from which rcu_check_callbacks() can invoke it and replaces
the is_idle_task(current) with rcu_is_cpu_rrupt_from_idle().

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/tree.c

index f47ac7a..77d2cbf 100644 (file)
@@ -2474,7 +2474,7 @@ void rcu_check_callbacks(int user)
        /* The load-acquire pairs with the store-release setting to true. */
        if (smp_load_acquire(this_cpu_ptr(&rcu_dynticks.rcu_urgent_qs))) {
                /* Idle and userspace execution already are quiescent states. */
-               if (!is_idle_task(current) && !user) {
+               if (!rcu_is_cpu_rrupt_from_idle() && !user) {
                        set_tsk_need_resched(current);
                        set_preempt_need_resched();
                }