diff options
author | Paolo Valente <paolo.valente@linaro.org> | 2019-06-25 01:12:44 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-06-25 11:07:34 -0400 |
commit | db599f9ed9bd31b018b6c48ad7c6b21d5b790ecf (patch) | |
tree | bc003791219b878b55104a71530e0f59a4af264c /block/bfq-iosched.c | |
parent | 766d61412ef840295f55e98e2c5fb0fc110c6ca4 (diff) |
block, bfq: fix rq_in_driver check in bfq_update_inject_limit
One of the cases where the parameters for injection may be updated is
when there are no more in-flight I/O requests. The number of in-flight
requests is stored in the field bfqd->rq_in_driver of the descriptor
bfqd of the device. So, the controlled condition is
bfqd->rq_in_driver == 0.
Unfortunately, this is wrong because, the instruction that checks this
condition is in the code path that handles the completion of a
request, and, in particular, the instruction is executed before
bfqd->rq_in_driver is decremented in such a code path.
This commit fixes this issue by just replacing 0 with 1 in the
comparison.
Reported-by: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
Tested-by: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/bfq-iosched.c')
-rw-r--r-- | block/bfq-iosched.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 9bc10198ddff..05041f84b8da 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c | |||
@@ -5481,8 +5481,14 @@ static void bfq_update_inject_limit(struct bfq_data *bfqd, | |||
5481 | * total service time, and there seem to be the right | 5481 | * total service time, and there seem to be the right |
5482 | * conditions to do it, or we can lower the last base value | 5482 | * conditions to do it, or we can lower the last base value |
5483 | * computed. | 5483 | * computed. |
5484 | * | ||
5485 | * NOTE: (bfqd->rq_in_driver == 1) means that there is no I/O | ||
5486 | * request in flight, because this function is in the code | ||
5487 | * path that handles the completion of a request of bfqq, and, | ||
5488 | * in particular, this function is executed before | ||
5489 | * bfqd->rq_in_driver is decremented in such a code path. | ||
5484 | */ | 5490 | */ |
5485 | if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 0) || | 5491 | if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 1) || |
5486 | tot_time_ns < bfqq->last_serv_time_ns) { | 5492 | tot_time_ns < bfqq->last_serv_time_ns) { |
5487 | bfqq->last_serv_time_ns = tot_time_ns; | 5493 | bfqq->last_serv_time_ns = tot_time_ns; |
5488 | /* | 5494 | /* |