rcu/nocb: Never downgrade ->nocb_defer_wakeup in wake_nocb_gp_defer()
authorPaul E. McKenney <paulmck@linux.ibm.com>
Thu, 23 May 2019 20:49:26 +0000 (13:49 -0700)
committerPaul E. McKenney <paulmck@linux.ibm.com>
Tue, 13 Aug 2019 21:35:49 +0000 (14:35 -0700)
Currently, wake_nocb_gp_defer() simply stores whatever waketype was
passed in, which can result in a RCU_NOCB_WAKE_FORCE being downgraded
to RCU_NOCB_WAKE, which could in turn delay callback processing.
This commit therefore adds a check so that wake_nocb_gp_defer() only
updates ->nocb_defer_wakeup when the update increases the forcefulness,
thus avoiding downgrades.

Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
kernel/rcu/tree_plugin.h

index 7077ef7bea96929ff81538fbbd37cdba458c219f..b9e00660af609f11530c3ad51a447bff70c1ba7a 100644 (file)
@@ -1600,7 +1600,8 @@ static void wake_nocb_gp_defer(struct rcu_data *rdp, int waketype,
 {
        if (rdp->nocb_defer_wakeup == RCU_NOCB_WAKE_NOT)
                mod_timer(&rdp->nocb_timer, jiffies + 1);
-       WRITE_ONCE(rdp->nocb_defer_wakeup, waketype);
+       if (rdp->nocb_defer_wakeup < waketype)
+               WRITE_ONCE(rdp->nocb_defer_wakeup, waketype);
        trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, reason);
 }