• Paul E. McKenney's avatar
    rcu: add call_rcu_sched() · 4446a36f
    Paul E. McKenney authored
    Fourth cut of patch to provide the call_rcu_sched().  This is again to
    synchronize_sched() as call_rcu() is to synchronize_rcu().
    
    Should be fine for experimental and -rt use, but not ready for inclusion.
    With some luck, I will be able to tell Andrew to come out of hiding on
    the next round.
    
    Passes multi-day rcutorture sessions with concurrent CPU hotplugging.
    
    Fixes since the first version include a bug that could result in
    indefinite blocking (spotted by Gautham Shenoy), better resiliency
    against CPU-hotplug operations, and other minor fixes.
    
    Fixes since the second version include reworking grace-period detection
    to avoid deadlocks that could happen when running concurrently with
    CPU hotplug, adding Mathieu's fix to avoid the softlockup messages,
    as well as Mathieu's fix to allow use earlier in boot.
    
    Fixes since the third version include a wrong-CPU bug spotted by
    Andrew, getting rid of the obsolete synchronize_kernel API that somehow
    snuck back in, merging spin_unlock() and local_irq_restore() in a
    few places, commenting the code that checks for quiescent states based
    on interrupting from user-mode execution or the idle loop, removing
    some inline attributes, and some code-style changes.
    
    Known/suspected shortcomings:
    
    o	I still do not entirely trust the sleep/wakeup logic.  Next step
    	will be to use a private snapshot of the CPU online mask in
    	rcu_sched_grace_period() -- if the CPU wasn't there at the start
    	of the grace period, we don't need to hear from it.  And the
    	bit about accounting for changes in online CPUs inside of
    	rcu_sched_grace_period() is ugly anyway.
    
    o	It might be good for rcu_sched_grace_period() to invoke
    	resched_cpu() when a given CPU wasn't responding quickly,
    	but resched_cpu() is declared static...
    
    This patch also fixes a long-standing bug in the earlier preemptable-RCU
    implementation of synchronize_rcu() that could result in loss of
    concurrent external changes to a task's CPU affinity mask.  I still cannot
    remember who reported this...
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    4446a36f
main.c 21 KB