Messages in this thread | | | Date | Mon, 1 Sep 2014 13:29:34 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH tip/core/rcu 11/15] rcu: Break more call_rcu() deadlock involving scheduler and perf |
| |
On Thu, Aug 28, 2014 at 11:26:30AM -0700, Paul E. McKenney wrote:
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h > index b6acb9340192..a1af86099a67 100644 > --- a/kernel/rcu/tree_plugin.h > +++ b/kernel/rcu/tree_plugin.h > @@ -2121,16 +2121,23 @@ static void __call_rcu_nocb_enqueue(struct rcu_data *rdp, > trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, > TPS("WakeEmpty")); > } else { > - rdp->nocb_defer_wakeup = true; > + rdp->nocb_defer_wakeup = RCU_NOGP_WAKE; > trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, > TPS("WakeEmptyIsDeferred")); > } > rdp->qlen_last_fqs_check = 0; > } else if (len > rdp->qlen_last_fqs_check + qhimark) { > /* ... or if many callbacks queued. */ > - wake_nocb_leader(rdp, true); > + if (!irqs_disabled_flags(flags)) { > + wake_nocb_leader(rdp, true); > + trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, > + TPS("WakeOvf")); > + } else { > + rdp->nocb_defer_wakeup = RCU_NOGP_WAKE_FORCE; > + trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, > + TPS("WakeOvfIsDeferred")); > + } > rdp->qlen_last_fqs_check = LONG_MAX / 2; > - trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, TPS("WakeOvf")); > } else { > trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, TPS("WakeNot")); > }
Is it possible for the RCU_NOCP_WAKE write to overwrite a WAKE_FORCE ? If not, why not? (Would make a good comment thereabouts).
| |