aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2014-08-14 13:28:23 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2014-09-07 19:18:20 -0400
commit73a860cd58a1eb258e889b615cebf738ab33aa23 (patch)
tree9eacb2ac5f6331f3249778c685da7f26c8ed0488
parent2aa792e6faf1a00f5accf1f69e87e11a390ba2cd (diff)
rcu: Replace flush_signals() with WARN_ON(signal_pending())
Currently, when RCU awakens from a wait_event_interruptible() that might have awakened prematurely, it does a flush_signals(). This is done on the off-chance that someone figured out how to deliver a signal to a kthread, which is supposed to be impossible. Given that this is supposed to be impossible, this commit changes the flush_signals() calls into WARN_ON(signal_pending()). Reported-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
-rw-r--r--kernel/rcu/tree.c4
-rw-r--r--kernel/rcu/tree_plugin.h6
2 files changed, 5 insertions, 5 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 9e83cd9a32f1..3e002c1cb441 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1796,7 +1796,7 @@ static int __noreturn rcu_gp_kthread(void *arg)
1796 if (rcu_gp_init(rsp)) 1796 if (rcu_gp_init(rsp))
1797 break; 1797 break;
1798 cond_resched(); 1798 cond_resched();
1799 flush_signals(current); 1799 WARN_ON(signal_pending(current));
1800 trace_rcu_grace_period(rsp->name, 1800 trace_rcu_grace_period(rsp->name,
1801 ACCESS_ONCE(rsp->gpnum), 1801 ACCESS_ONCE(rsp->gpnum),
1802 TPS("reqwaitsig")); 1802 TPS("reqwaitsig"));
@@ -1842,7 +1842,7 @@ static int __noreturn rcu_gp_kthread(void *arg)
1842 } else { 1842 } else {
1843 /* Deal with stray signal. */ 1843 /* Deal with stray signal. */
1844 cond_resched(); 1844 cond_resched();
1845 flush_signals(current); 1845 WARN_ON(signal_pending(current));
1846 trace_rcu_grace_period(rsp->name, 1846 trace_rcu_grace_period(rsp->name,
1847 ACCESS_ONCE(rsp->gpnum), 1847 ACCESS_ONCE(rsp->gpnum),
1848 TPS("fqswaitsig")); 1848 TPS("fqswaitsig"));
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index d67cc5c375c5..bbb0a0cd091b 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -2237,7 +2237,7 @@ static void rcu_nocb_wait_gp(struct rcu_data *rdp)
2237 (d = ULONG_CMP_GE(ACCESS_ONCE(rnp->completed), c))); 2237 (d = ULONG_CMP_GE(ACCESS_ONCE(rnp->completed), c)));
2238 if (likely(d)) 2238 if (likely(d))
2239 break; 2239 break;
2240 flush_signals(current); 2240 WARN_ON(signal_pending(current));
2241 trace_rcu_future_gp(rnp, rdp, c, TPS("ResumeWait")); 2241 trace_rcu_future_gp(rnp, rdp, c, TPS("ResumeWait"));
2242 } 2242 }
2243 trace_rcu_future_gp(rnp, rdp, c, TPS("EndWait")); 2243 trace_rcu_future_gp(rnp, rdp, c, TPS("EndWait"));
@@ -2296,7 +2296,7 @@ wait_again:
2296 if (!rcu_nocb_poll) 2296 if (!rcu_nocb_poll)
2297 trace_rcu_nocb_wake(my_rdp->rsp->name, my_rdp->cpu, 2297 trace_rcu_nocb_wake(my_rdp->rsp->name, my_rdp->cpu,
2298 "WokeEmpty"); 2298 "WokeEmpty");
2299 flush_signals(current); 2299 WARN_ON(signal_pending(current));
2300 schedule_timeout_interruptible(1); 2300 schedule_timeout_interruptible(1);
2301 2301
2302 /* Rescan in case we were a victim of memory ordering. */ 2302 /* Rescan in case we were a victim of memory ordering. */
@@ -2375,7 +2375,7 @@ static void nocb_follower_wait(struct rcu_data *rdp)
2375 if (!rcu_nocb_poll) 2375 if (!rcu_nocb_poll)
2376 trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, 2376 trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu,
2377 "WokeEmpty"); 2377 "WokeEmpty");
2378 flush_signals(current); 2378 WARN_ON(signal_pending(current));
2379 schedule_timeout_interruptible(1); 2379 schedule_timeout_interruptible(1);
2380 } 2380 }
2381} 2381}