• Paul E. McKenney's avatar
    rcu: Fix rcu_preempt_deferred_qs_irqrestore() strict QS reporting · 90d2efe7
    Paul E. McKenney authored
    Suppose we have a kernel built with both CONFIG_RCU_STRICT_GRACE_PERIOD=y
    and CONFIG_PREEMPT=y.  Suppose further that an RCU reader from which RCU
    core needs a quiescent state ends in rcu_preempt_deferred_qs_irqrestore().
    This function will then invoke rcu_report_qs_rdp() in order to immediately
    report that quiescent state.  Unfortunately, it will not have cleared
    that reader's CPU's rcu_data structure's ->cpu_no_qs.b.norm field.
    As a result, rcu_report_qs_rdp() will take an early exit because it
    will believe that this CPU has not yet encountered a quiescent state,
    and there will be no reporting of the current quiescent state.
    
    This commit therefore causes rcu_preempt_deferred_qs_irqrestore() to
    clear the ->cpu_no_qs.b.norm field before invoking rcu_report_qs_rdp().
    
    Kudos to Boqun Feng and Neeraj Upadhyay for helping with analysis of
    this issue!
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    90d2efe7
tree_plugin.h 43 KB