• P
    rcu: Allow post-unlock reference for rt_mutex · dfeb9765
    Paul E. McKenney 提交于
    The current approach to RCU priority boosting uses an rt_mutex strictly
    for its priority-boosting side effects.  The rt_mutex_init_proxy_locked()
    function is used by the booster to initialize the lock as held by the
    boostee.  The booster then uses rt_mutex_lock() to acquire this rt_mutex,
    which priority-boosts the boostee.  When the boostee reaches the end
    of its outermost RCU read-side critical section, it checks a field in
    its task structure to see whether it has been boosted, and, if so, uses
    rt_mutex_unlock() to release the rt_mutex.  The booster can then go on
    to boost the next task that is blocking the current RCU grace period.
    
    But reasonable implementations of rt_mutex_unlock() might result in the
    boostee referencing the rt_mutex's data after releasing it.  But the
    booster might have re-initialized the rt_mutex between the time that the
    boostee released it and the time that it later referenced it.  This is
    clearly asking for trouble, so this commit introduces a completion that
    forces the booster to wait until the boostee has completely finished with
    the rt_mutex, thus avoiding the case where the booster is re-initializing
    the rt_mutex before the last boostee's last reference to that rt_mutex.
    
    This of course does introduce some overhead, but the priority-boosting
    code paths are miles from any possible fastpath, and the overhead of
    executing the completion will normally be quite small compared to the
    overhead of priority boosting and deboosting, so this should be OK.
    Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    dfeb9765
tree_plugin.h 83.1 KB