• Paolo Valente's avatar
    block, bfq: avoid circular stable merges · 7ea96eef
    Paolo Valente authored
    BFQ may merge a new bfq_queue, stably, with the last bfq_queue
    created. In particular, BFQ first waits a little bit for some I/O to
    flow inside the new queue, say Q2, if this is needed to understand
    whether it is better or worse to merge Q2 with the last queue created,
    say Q1. This delayed stable merge is performed by assigning
    bic->stable_merge_bfqq = Q1, for the bic associated with Q1.
    
    Yet, while waiting for some I/O to flow in Q2, a non-stable queue
    merge of Q2 with Q1 may happen, causing the bic previously associated
    with Q2 to be associated with exactly Q1 (bic->bfqq = Q1). After that,
    Q2 and Q1 may happen to be split, and, in the split, Q1 may happen to
    be recycled as a non-shared bfq_queue. In that case, Q1 may then
    happen to undergo a stable merge with the bfq_queue pointed by
    bic->stable_merge_bfqq. Yet bic->stable_merge_bfqq still points to
    Q1. So Q1 would be merged with itself.
    
    This commit fixes this error by intercepting this situation, and
    canceling the schedule of the stable merge.
    
    Fixes: 430a67f9 ("block, bfq: merge bursts of newly-created queues")
    Signed-off-by: default avatarPietro Pedroni <pedroni.pietro.96@gmail.com>
    Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Link: https://lore.kernel.org/r/20210512094352.85545-2-paolo.valente@linaro.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    7ea96eef
bfq-iosched.c 254 KB