• Paolo Valente's avatar
    block, bfq: honor already-setup queue merges · 88013a0c
    Paolo Valente authored
    [ Upstream commit 2d52c58b ]
    
    The function bfq_setup_merge prepares the merging between two
    bfq_queues, say bfqq and new_bfqq. To this goal, it assigns
    bfqq->new_bfqq = new_bfqq. Then, each time some I/O for bfqq arrives,
    the process that generated that I/O is disassociated from bfqq and
    associated with new_bfqq (merging is actually a redirection). In this
    respect, bfq_setup_merge increases new_bfqq->ref in advance, adding
    the number of processes that are expected to be associated with
    new_bfqq.
    
    Unfortunately, the stable-merging mechanism interferes with this
    setup. After bfqq->new_bfqq has been set by bfq_setup_merge, and
    before all the expected processes have been associated with
    bfqq->new_bfqq, bfqq may happen to be stably merged with a different
    queue than the current bfqq->new_bfqq. In this case, bfqq->new_bfqq
    gets changed. So, some of the processes that have been already
    accounted for in the ref counter of the previous ne...
    88013a0c
bfq-iosched.c 256 KB