• Paul E. McKenney's avatar
    rcu: Fix bug in rcu_barrier() torture test · c6ebcbb6
    Paul E. McKenney authored
    The child threads in the rcu_torture_barrier_cbs() are improperly
    synchronized, which can cause the rcu_barrier() tests to hang.  The
    failure mode is as follows:
    
    1.	CPU 0 running in rcu_torture_barrier() sets barrier_cbs_count
        	to n_barrier_cbs.
    
    2.	CPU 1 running in rcu_torture_barrier_cbs() wakes up, posts
        	its RCU callback, and atomically decrements barrier_cbs_count.
        	Because barrier_cbs_count is not zero, it does not do the wake_up().
    
    3.	CPU 2 running in rcu_torture_barrier_cbs() wakes up, but
        	finds that barrier_cbs_count is not equal to n_barrier_cbs,
        	and so returns to sleep.
    
    4.	The value of barrier_cbs_count therefore never reaches zero,
        	which causes the test to hang.
    
    This commit therefore uses a phase variable to coordinate the test,
    preventing this scenario from occurring.
    Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    c6ebcbb6
rcutorture.c 61.7 KB