• Paul E. McKenney's avatar
    rcu: Mark additional concurrent load from ->cpu_no_qs.b.exp · 9146eb25
    Paul E. McKenney authored
    The per-CPU rcu_data structure's ->cpu_no_qs.b.exp field is updated
    only on the instance corresponding to the current CPU, but can be read
    more widely.  Unmarked accesses are OK from the corresponding CPU, but
    only if interrupts are disabled, given that interrupt handlers can and
    do modify this field.
    
    Unfortunately, although the load from rcu_preempt_deferred_qs() is always
    carried out from the corresponding CPU, interrupts are not necessarily
    disabled.  This commit therefore upgrades this load to READ_ONCE.
    
    Similarly, the diagnostic access from synchronize_rcu_expedited_wait()
    might run with interrupts disabled and from some other CPU.  This commit
    therefore marks this load with data_race().
    
    Finally, the C-language access in rcu_preempt_ctxt_queue() is OK as
    is because interrupts are disabled and this load is always from the
    corresponding CPU.  This commit adds a comment giving the rationale for
    this access being safe.
    
    This data race was reported by KCSAN.  Not appropriate for backporting
    due to failure being unlikely.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    9146eb25
tree_exp.h 35.1 KB