Message ID | 20221103162623.10286-3-paolo.valente@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block, bfq: extend bfq to support multi-actuator drives | expand |
On 11/4/22 01:26, Paolo Valente wrote: > 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. > > Signed-off-by: Paolo Valente <paolo.valente@linaro.org> > --- > block/bfq-iosched.c | 13 +++++++++---- > 1 file changed, 9 insertions(+), 4 deletions(-) > > diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c > index 5c69394bbb65..ec4b0e70265f 100644 > --- a/block/bfq-iosched.c > +++ b/block/bfq-iosched.c > @@ -5705,9 +5705,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 > * forward to bfqq. Finally, move also if bfqq belongs to a > * different group than last_bfqq_created, or if bfqq has a > - * different ioprio or ioprio_class. If none of these > - * conditions holds true, then try an early stable merge or > - * schedule a delayed stable merge. > + * different ioprio, ioprio_class or actuator_idx. If none of > + * these conditions holds true, then try an early 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 > * early merge), in case bfqq might soon prove to be more > @@ -5725,7 +5729,8 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd, > bfqq->creation_time) || > bfqq->entity.parent != last_bfqq_created->entity.parent || > 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; > else if (time_after_eq(last_bfqq_created->creation_time + > bfqd->bfq_burst_interval, Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 5c69394bbb65..ec4b0e70265f 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -5705,9 +5705,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 * forward to bfqq. Finally, move also if bfqq belongs to a * different group than last_bfqq_created, or if bfqq has a - * different ioprio or ioprio_class. If none of these - * conditions holds true, then try an early stable merge or - * schedule a delayed stable merge. + * different ioprio, ioprio_class or actuator_idx. If none of + * these conditions holds true, then try an early 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 * early merge), in case bfqq might soon prove to be more @@ -5725,7 +5729,8 @@ static struct bfq_queue *bfq_do_or_sched_stable_merge(struct bfq_data *bfqd, bfqq->creation_time) || bfqq->entity.parent != last_bfqq_created->entity.parent || 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; else if (time_after_eq(last_bfqq_created->creation_time + bfqd->bfq_burst_interval,
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. Signed-off-by: Paolo Valente <paolo.valente@linaro.org> --- block/bfq-iosched.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)