• Jan Kara's avatar
    bfq: Avoid false bfq queue merging · 41e76c85
    Jan Kara authored
    bfq_setup_cooperator() uses bfqd->in_serv_last_pos so detect whether it
    makes sense to merge current bfq queue with the in-service queue.
    However if the in-service queue is freshly scheduled and didn't dispatch
    any requests yet, bfqd->in_serv_last_pos is stale and contains value
    from the previously scheduled bfq queue which can thus result in a bogus
    decision that the two queues should be merged. This bug can be observed
    for example with the following fio jobfile:
    
    [global]
    direct=0
    ioengine=sync
    invalidate=1
    size=1g
    rw=read
    
    [reader]
    numjobs=4
    directory=/mnt
    
    where the 4 processes will end up in the one shared bfq queue although
    they do IO to physically very distant files (for some reason I was able to
    observe this only with slice_idle=1ms setting).
    
    Fix the problem by invalidating bfqd->in_serv_last_pos when switching
    in-service queue.
    
    Fixes: 058fdecc ("block, bfq: fix in-service-queue check for queue merging")
    CC: stable@vger.kernel.org
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Acked-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    41e76c85
bfq-iosched.c 240 KB