diff options
author | Paolo Valente <paolo.valente@linaro.org> | 2018-08-16 12:51:15 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-08-16 15:08:10 -0400 |
commit | 8a511ba5feec5947bee0635cff8bd796d5f77e3e (patch) | |
tree | 207364ee03acae3e83532d35146021316202f40b /block/bfq-iosched.c | |
parent | df60f6e835f763258a06cdbb5690a2e35c1aac4e (diff) |
block, bfq: readd missing reset of parent-entity service
The received-service counter needs to be equal to 0 when an entity is
set in service. Unfortunately, commit "block, bfq: fix service being
wrongly set to zero in case of preemption" mistakenly removed the
resetting of this counter for the parent entities of the bfq_queue
being set in service. This commit fixes this issue by resetting
service for parent entities, directly on the expiration of the
in-service bfq_queue.
Fixes: 9fae8dd59ff3 ("block, bfq: fix service being wrongly set to zero in case of preemption")
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 | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 41d9036b1822..62efc1b97afb 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c | |||
@@ -3298,6 +3298,27 @@ void bfq_bfqq_expire(struct bfq_data *bfqd, | |||
3298 | */ | 3298 | */ |
3299 | } else | 3299 | } else |
3300 | entity->service = 0; | 3300 | entity->service = 0; |
3301 | |||
3302 | /* | ||
3303 | * Reset the received-service counter for every parent entity. | ||
3304 | * Differently from what happens with bfqq->entity.service, | ||
3305 | * the resetting of this counter never needs to be postponed | ||
3306 | * for parent entities. In fact, in case bfqq may have a | ||
3307 | * chance to go on being served using the last, partially | ||
3308 | * consumed budget, bfqq->entity.service needs to be kept, | ||
3309 | * because if bfqq then actually goes on being served using | ||
3310 | * the same budget, the last value of bfqq->entity.service is | ||
3311 | * needed to properly decrement bfqq->entity.budget by the | ||
3312 | * portion already consumed. In contrast, it is not necessary | ||
3313 | * to keep entity->service for parent entities too, because | ||
3314 | * the bubble up of the new value of bfqq->entity.budget will | ||
3315 | * make sure that the budgets of parent entities are correct, | ||
3316 | * even in case bfqq and thus parent entities go on receiving | ||
3317 | * service with the same budget. | ||
3318 | */ | ||
3319 | entity = entity->parent; | ||
3320 | for_each_entity(entity) | ||
3321 | entity->service = 0; | ||
3301 | } | 3322 | } |
3302 | 3323 | ||
3303 | /* | 3324 | /* |