• Paul E. McKenney's avatar
    rcu: Yet another fix for preemption and CPU hotplug · a77da14c
    Paul E. McKenney authored
    As noted earlier, the following sequence of events can occur when
    running PREEMPT_RCU and HOTPLUG_CPU on a system with a multi-level
    rcu_node combining tree:
    
    1.	A group of tasks block on CPUs corresponding to a given leaf
    	rcu_node structure while within RCU read-side critical sections.
    2.	All CPUs corrsponding to that rcu_node structure go offline.
    3.	The next grace period starts, but because there are still tasks
    	blocked, the upper-level bits corresponding to this leaf rcu_node
    	structure remain set.
    4.	All the tasks exit their RCU read-side critical sections and
    	remove themselves from the leaf rcu_node structure's list,
    	leaving it empty.
    5.	But because there now is code to check for this condition at
    	force-quiescent-state time, the upper bits are cleared and the
    	grace period completes.
    
    However, there is another complication that can occur following step 4 above:
    
    4a.	The grace period starts, and the leaf rcu_node structure's
    	gp_tasks pointer is set to NULL because there are no tasks
    	blocked on this structure.
    4b.	One of the CPUs corresponding to the leaf rcu_node structure
    	comes back online.
    4b.	An endless stream of tasks are preempted within RCU read-side
    	critical sections on this CPU, such that the ->blkd_tasks
    	list is always non-empty.
    
    The grace period will never end.
    
    This commit therefore makes the force-quiescent-state processing check only
    for absence of tasks blocking the current grace period rather than absence
    of tasks altogether.  This will cause a quiescent state to be reported if
    the current leaf rcu_node structure is not blocking the current grace period
    and its parent thinks that it is, regardless of how RCU managed to get
    itself into this state.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: <stable@vger.kernel.org> # 4.0.x
    Tested-by: default avatarSasha Levin <sasha.levin@oracle.com>
    a77da14c
tree.c 127 KB