rcu: Don't do reschedule unless in irq
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 16 May 2011 09:52:04 +0000 (02:52 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 26 May 2011 16:42:21 +0000 (09:42 -0700)
Condition the set_need_resched() in rcu_irq_exit() on in_irq().  This
should be a no-op, because rcu_irq_exit() should only be called from irq.

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

index 011bf6f..195b3a3 100644 (file)
@@ -421,8 +421,9 @@ void rcu_irq_exit(void)
        WARN_ON_ONCE(rdtp->dynticks & 0x1);
 
        /* If the interrupt queued a callback, get out of dyntick mode. */
-       if (__this_cpu_read(rcu_sched_data.nxtlist) ||
-           __this_cpu_read(rcu_bh_data.nxtlist))
+       if (in_irq() &&
+           (__this_cpu_read(rcu_sched_data.nxtlist) ||
+            __this_cpu_read(rcu_bh_data.nxtlist)))
                set_need_resched();
 }