• Y
    md/raid5: split wait_for_stripe and introduce wait_for_quiescent · b1b46486
    Yuanhan Liu 提交于
    I noticed heavy spin lock contention at get_active_stripe(), introduced
    at being wake up stage, where a bunch of processes try to re-hold the
    spin lock again.
    
    After giving some thoughts on this issue, I found the lock could be
    relieved(and even avoided) if we turn the wait_for_stripe to per
    waitqueue for each lock hash and make the wake up exclusive: wake up
    one process each time, which avoids the lock contention naturally.
    
    Before go hacking with wait_for_stripe, I found it actually has 2
    usages: for the array to enter or leave the quiescent state, and also
    to wait for an available stripe in each of the hash lists.
    
    So this patch splits the first usage off into a separate wait_queue,
    wait_for_quiescent, and the next patch will turn the second usage into
    one waitqueue for each hash value, and make it exclusive, to relieve
    the lock contention.
    
    v2: wake_up(wait_for_quiescent) when (active_stripes == 0)
        Commit log refactor suggestion from Neil.
    Signed-off-by: NYuanhan Liu <yuanhan.liu@linux.intel.com>
    Signed-off-by: NNeilBrown <neilb@suse.de>
    b1b46486
raid5.c 219.4 KB