• Frederic Weisbecker's avatar
    rcu/tasks: Handle new PF_IDLE semantics · 9715ed50
    Frederic Weisbecker authored
    The commit:
    
    	cff9b233 ("kernel/sched: Modify initial boot task idle setup")
    
    has changed the semantics of what is to be considered an idle task in
    such a way that CPU boot code preceding the actual idle loop is excluded
    from it.
    
    This has however introduced new potential RCU-tasks stalls when either:
    
    1) Grace period is started before init/0 had a chance to set PF_IDLE,
       keeping it stuck in the holdout list until idle ever schedules.
    
    2) Grace period is started when some possible CPUs have never been
       online, keeping their idle tasks stuck in the holdout list until the
       CPU ever boots up.
    
    3) Similar to 1) but with secondary CPUs: Grace period is started
       concurrently with secondary CPU booting, putting its idle task in
       the holdout list because PF_IDLE isn't yet observed on it. It stays
       then stuck in the holdout list until that CPU ever schedules. The
       effect is mitigated here by the hotplug AP thread that must run to
       bring the CPU up.
    
    Fix this with handling the new semantics of PF_IDLE, keeping in mind
    that it may or may not be set on an idle task. Take advantage of that to
    strengthen the coverage of an RCU-tasks quiescent state within an idle
    task, excluding the CPU boot code from it. Only the code running within
    the idle loop is now a quiescent state, along with offline CPUs.
    
    Fixes: cff9b233 ("kernel/sched: Modify initial boot task idle setup")
    Suggested-by: default avatarJoel Fernandes <joel@joelfernandes.org>
    Suggested-by: default avatarPaul E . McKenney" <paulmck@kernel.org>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    9715ed50
tasks.h 70.4 KB