• Paul E. McKenney's avatar
    rcu: Move rcu_report_unblock_qs_rnp() to common code · cc99a310
    Paul E. McKenney authored
    The rcu_report_unblock_qs_rnp() function is invoked when the
    last task blocking the current grace period exits its outermost
    RCU read-side critical section.  Previously, this was called only
    from rcu_read_unlock_special(), and was therefore defined only when
    CONFIG_RCU_PREEMPT=y.  However, this function will be invoked even when
    CONFIG_RCU_PREEMPT=n once CPU-hotplug operations are processed only at
    the beginnings of RCU grace periods.  The reason for this change is that
    the last task on a given leaf rcu_node structure's ->blkd_tasks list
    might well exit its RCU read-side critical section between the time that
    recent CPU-hotplug operations were applied and when the new grace period
    was initialized.  This situation could result in RCU waiting forever on
    that leaf rcu_node structure, because if all that structure's CPUs were
    already offline, there would be no quiescent-state events to drive that
    structure's part of the grace period.
    
    This commit therefore moves rcu_report_unblock_qs_rnp() to common code
    that is built unconditionally so that the quiescent-state-forcing code
    can clean up after this situation, avoiding the grace-period stall.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    cc99a310
tree.c 124 KB