Commit b7529898 authored by Paolo Valente's avatar Paolo Valente Committed by Jens Axboe

block, bfq: forbid stable merging of queues associated with different actuators

If queues associated with different actuators are merged, then control
is lost on each actuator. Therefore some actuator may be
underutilized, and throughput may decrease. This problem cannot occur
with basic queue merging, because the latter is triggered by spatial
locality, and sectors for different actuators are not close to each
other. Yet it may happen with stable merging. To address this issue,
this commit prevents stable merging from occurring among queues
associated with different actuators.
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
Link: https://lore.kernel.org/r/20230103145503.71712-3-paolo.valente@linaro.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 9778369a
...@@ -5647,9 +5647,13 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd, ...@@ -5647,9 +5647,13 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd,
* it has been set already, but too long ago, then move it * it has been set already, but too long ago, then move it
* forward to bfqq. Finally, move also if bfqq belongs to a * forward to bfqq. Finally, move also if bfqq belongs to a
* different group than last_bfqq_created, or if bfqq has a * different group than last_bfqq_created, or if bfqq has a
* different ioprio or ioprio_class. If none of these * different ioprio, ioprio_class or actuator_idx. If none of
* conditions holds true, then try an early stable merge or * these conditions holds true, then try an early stable merge
* schedule a delayed stable merge. * or schedule a delayed stable merge. As for the condition on
* actuator_idx, the reason is that, if queues associated with
* different actuators are merged, then control is lost on
* each actuator. Therefore some actuator may be
* underutilized, and throughput may decrease.
* *
* A delayed merge is scheduled (instead of performing an * A delayed merge is scheduled (instead of performing an
* early merge), in case bfqq might soon prove to be more * early merge), in case bfqq might soon prove to be more
...@@ -5667,7 +5671,8 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd, ...@@ -5667,7 +5671,8 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd,
bfqq->creation_time) || bfqq->creation_time) ||
bfqq->entity.parent != last_bfqq_created->entity.parent || bfqq->entity.parent != last_bfqq_created->entity.parent ||
bfqq->ioprio != last_bfqq_created->ioprio || bfqq->ioprio != last_bfqq_created->ioprio ||
bfqq->ioprio_class != last_bfqq_created->ioprio_class) bfqq->ioprio_class != last_bfqq_created->ioprio_class ||
bfqq->actuator_idx != last_bfqq_created->actuator_idx)
*source_bfqq = bfqq; *source_bfqq = bfqq;
else if (time_after_eq(last_bfqq_created->creation_time + else if (time_after_eq(last_bfqq_created->creation_time +
bfqd->bfq_burst_interval, bfqd->bfq_burst_interval,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment