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@xxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxx> -- Damien Le Moal Western Digital Research