• NeilBrown's avatar
    md: only call set_in_sync() when it is expected to succeed. · 480523fe
    NeilBrown authored
    Since commit 4ad23a97 ("MD: use per-cpu counter for
    writes_pending"), set_in_sync() is substantially more expensive: it
    can wait for a full RCU grace period which can be 10s of milliseconds.
    
    So we should only call it when the cost is justified.
    
    md_check_recovery() currently calls set_in_sync() every time it finds
    anything to do (on non-external active arrays).  For an array
    performing resync or recovery, this will be quite often.
    Each call will introduce a delay to the md thread, which can noticeable
    affect IO submission latency.
    
    In md_check_recovery() we only need to call set_in_sync() if
    'safemode' was non-zero at entry, meaning that there has been not
    recent IO.  So we save this "safemode was nonzero" state, and only
    call set_in_sync() if it was non-zero.
    
    This measurably reduces mean and maximum IO submission latency during
    resync/recovery.
    Reported-and-tested-by: default avatarJack Wang <jinpu.wang@cloud.ionos.com>
    Fixes: 4ad23a97 ("MD: use per-cpu counter for writes_pending")
    Cc: stable@vger.kernel.org (v4.12+)
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    480523fe
md.c 250 KB