summaryrefslogtreecommitdiffstats
path: root/kernel/rcutree.c
diff options
context:
space:
mode:
authorPaul E. McKenney2011-05-16 11:52:04 +0200
committerPaul E. McKenney2011-05-26 18:42:21 +0200
commitb5904090c754327ed6c2ecaefed4f7d473df393f (patch)
tree46cf53f98413171d92de3b5e11c9327309f240b7 /kernel/rcutree.c
parentrcu: Remove old memory barriers from rcu_process_callbacks() (diff)
downloadkernel-qcow2-linux-b5904090c754327ed6c2ecaefed4f7d473df393f.tar.gz
kernel-qcow2-linux-b5904090c754327ed6c2ecaefed4f7d473df393f.tar.xz
kernel-qcow2-linux-b5904090c754327ed6c2ecaefed4f7d473df393f.zip
rcu: Don't do reschedule unless in irq
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>
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r--kernel/rcutree.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 011bf6f261a2..195b3a3313e3 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -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();
}