• Paul E. McKenney's avatar
    srcu: Remove cleanup_srcu_struct_quiesced() · f5ad3991
    Paul E. McKenney authored
    The cleanup_srcu_struct_quiesced() function was added because NVME
    used WQ_MEM_RECLAIM workqueues and SRCU did not, which meant that
    NVME workqueues waiting on SRCU workqueues could result in deadlocks
    during low-memory conditions.  However, SRCU now also has WQ_MEM_RECLAIM
    workqueues, so there is no longer a potential for deadlock.  Furthermore,
    it turns out to be extremely hard to use cleanup_srcu_struct_quiesced()
    correctly due to the fact that SRCU callback invocation accesses the
    srcu_struct structure's per-CPU data area just after callbacks are
    invoked.  Therefore, the usual practice of using srcu_barrier() to wait
    for callbacks to be invoked before invoking cleanup_srcu_struct_quiesced()
    fails because SRCU's callback-invocation workqueue handler might be
    delayed, which can result in cleanup_srcu_struct_quiesced() being invoked
    (and thus freeing the per-CPU data) before the SRCU's callback-invocation
    workqueue handler is finished using that per-CPU data.  Nor is this a
    theoretical problem: KASAN emitted use-after-free warnings because of
    this problem on actual runs.
    
    In short, NVME can now safely invoke cleanup_srcu_struct(), which
    avoids the use-after-free scenario.  And cleanup_srcu_struct_quiesced()
    is quite difficult to use safely.  This commit therefore removes
    cleanup_srcu_struct_quiesced(), switching its sole user back to
    cleanup_srcu_struct().  This effectively reverts the following pair
    of commits:
    
    f7194ac3 ("srcu: Add cleanup_srcu_struct_quiesced()")
    4317228a ("nvme: Avoid flush dependency in delete controller flow")
    Reported-by: default avatarBart Van Assche <bvanassche@acm.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Tested-by: default avatarBart Van Assche <bvanassche@acm.org>
    f5ad3991
srcutree.c 42.8 KB