• Paolo Valente's avatar
    block, bfq: update inject limit only after injection occurred · 23ed570a
    Paolo Valente authored
    BFQ updates the injection limit of each bfq_queue as a function of how
    much the limit inflates the service times experienced by the I/O
    requests of the queue. So only service times affected by injection
    must be taken into account. Unfortunately, in the current
    implementation of this update scheme, the service time of an I/O
    request rq not affected by injection may happen to be considered in
    the following case: there is no I/O request in service when rq
    arrives.
    
    This commit fixes this issue by making sure that only service times
    affected by injection are considered for updating the injection
    limit. In particular, the service time of an I/O request rq is now
    considered only if at least one of the following two conditions holds:
    - the destination bfq_queue for rq underwent injection before rq
    arrival, and there is still I/O in service in the drive on rq arrival
    (the service of such unfinished I/O may delay the service of rq);
    - injection occurs between the arrival and the completion time of rq.
    Tested-by: default avatarOleksandr Natalenko <oleksandr@natalenko.name>
    Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    23ed570a
bfq-iosched.c 235 KB