• Paul E. McKenney's avatar
    rcu: Only do rcu_read_unlock_special() wakeups if expedited · 25102de6
    Paul E. McKenney authored
    Currently, rcu_read_unlock_special() will do wakeups whenever it is safe
    to do so.  However, wakeups are expensive, and they are only really
    needed when the just-ended RCU read-side critical section is blocking
    an expedited grace period (in which case speed is of the essence)
    or on a nohz_full CPU (where it might be a good long time before an
    interrupt arrives).  This commit therefore checks for these conditions,
    and does the expensive wakeups only if doing so would be useful.
    
    Note it can be rather expensive to determine whether or not the current
    task (as opposed to the current CPU) is blocking the current expedited
    grace period.  Doing so requires traversing the ->blkd_tasks list, which
    can be quite long.  This commit therefore cheats:  If the current task
    is on a given ->blkd_tasks list, and some task on that list is blocking
    the current expedited grace period, the code assumes that the current
    task is blocking that expedited grace period.
    Reported-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    25102de6
tree_plugin.h 72.1 KB