Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

block, bfq: split also async bfq_queues on a per-actuator basis

Similarly to sync bfq_queues, also async bfq_queues need to be split
on a per-actuator basis.

Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Davide Zini <davidezini2@gmail.com>
Link: https://lore.kernel.org/r/20230103145503.71712-6-paolo.valente@linaro.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Davide Zini and committed by
Jens Axboe
8b7fd741 fd571df0

+26 -21
+22 -17
block/bfq-iosched.c
··· 2620 2620 void bfq_end_wr_async_queues(struct bfq_data *bfqd, 2621 2621 struct bfq_group *bfqg) 2622 2622 { 2623 - int i, j; 2623 + int i, j, k; 2624 2624 2625 - for (i = 0; i < 2; i++) 2626 - for (j = 0; j < IOPRIO_NR_LEVELS; j++) 2627 - if (bfqg->async_bfqq[i][j]) 2628 - bfq_bfqq_end_wr(bfqg->async_bfqq[i][j]); 2629 - if (bfqg->async_idle_bfqq) 2630 - bfq_bfqq_end_wr(bfqg->async_idle_bfqq); 2625 + for (k = 0; k < bfqd->num_actuators; k++) { 2626 + for (i = 0; i < 2; i++) 2627 + for (j = 0; j < IOPRIO_NR_LEVELS; j++) 2628 + if (bfqg->async_bfqq[i][j][k]) 2629 + bfq_bfqq_end_wr(bfqg->async_bfqq[i][j][k]); 2630 + if (bfqg->async_idle_bfqq[k]) 2631 + bfq_bfqq_end_wr(bfqg->async_idle_bfqq[k]); 2632 + } 2631 2633 } 2632 2634 2633 2635 static void bfq_end_wr(struct bfq_data *bfqd) ··· 5577 5575 5578 5576 static struct bfq_queue **bfq_async_queue_prio(struct bfq_data *bfqd, 5579 5577 struct bfq_group *bfqg, 5580 - int ioprio_class, int ioprio) 5578 + int ioprio_class, int ioprio, int act_idx) 5581 5579 { 5582 5580 switch (ioprio_class) { 5583 5581 case IOPRIO_CLASS_RT: 5584 - return &bfqg->async_bfqq[0][ioprio]; 5582 + return &bfqg->async_bfqq[0][ioprio][act_idx]; 5585 5583 case IOPRIO_CLASS_NONE: 5586 5584 ioprio = IOPRIO_BE_NORM; 5587 5585 fallthrough; 5588 5586 case IOPRIO_CLASS_BE: 5589 - return &bfqg->async_bfqq[1][ioprio]; 5587 + return &bfqg->async_bfqq[1][ioprio][act_idx]; 5590 5588 case IOPRIO_CLASS_IDLE: 5591 - return &bfqg->async_idle_bfqq; 5589 + return &bfqg->async_idle_bfqq[act_idx]; 5592 5590 default: 5593 5591 return NULL; 5594 5592 } ··· 5761 5759 bfqg = bfq_bio_bfqg(bfqd, bio); 5762 5760 if (!is_sync) { 5763 5761 async_bfqq = bfq_async_queue_prio(bfqd, bfqg, ioprio_class, 5764 - ioprio); 5762 + ioprio, 5763 + bfq_actuator_index(bfqd, bio)); 5765 5764 bfqq = *async_bfqq; 5766 5765 if (bfqq) 5767 5766 goto out; ··· 6985 6982 */ 6986 6983 void bfq_put_async_queues(struct bfq_data *bfqd, struct bfq_group *bfqg) 6987 6984 { 6988 - int i, j; 6985 + int i, j, k; 6989 6986 6990 - for (i = 0; i < 2; i++) 6991 - for (j = 0; j < IOPRIO_NR_LEVELS; j++) 6992 - __bfq_put_async_bfqq(bfqd, &bfqg->async_bfqq[i][j]); 6987 + for (k = 0; k < bfqd->num_actuators; k++) { 6988 + for (i = 0; i < 2; i++) 6989 + for (j = 0; j < IOPRIO_NR_LEVELS; j++) 6990 + __bfq_put_async_bfqq(bfqd, &bfqg->async_bfqq[i][j][k]); 6993 6991 6994 - __bfq_put_async_bfqq(bfqd, &bfqg->async_idle_bfqq); 6992 + __bfq_put_async_bfqq(bfqd, &bfqg->async_idle_bfqq[k]); 6993 + } 6995 6994 } 6996 6995 6997 6996 /*
+4 -4
block/bfq-iosched.h
··· 980 980 981 981 struct bfq_data *bfqd; 982 982 983 - struct bfq_queue *async_bfqq[2][IOPRIO_NR_LEVELS]; 984 - struct bfq_queue *async_idle_bfqq; 983 + struct bfq_queue *async_bfqq[2][IOPRIO_NR_LEVELS][BFQ_MAX_ACTUATORS]; 984 + struct bfq_queue *async_idle_bfqq[BFQ_MAX_ACTUATORS]; 985 985 986 986 struct bfq_entity *my_entity; 987 987 ··· 998 998 struct bfq_entity entity; 999 999 struct bfq_sched_data sched_data; 1000 1000 1001 - struct bfq_queue *async_bfqq[2][IOPRIO_NR_LEVELS]; 1002 - struct bfq_queue *async_idle_bfqq; 1001 + struct bfq_queue *async_bfqq[2][IOPRIO_NR_LEVELS][BFQ_MAX_ACTUATORS]; 1002 + struct bfq_queue *async_idle_bfqq[BFQ_MAX_ACTUATORS]; 1003 1003 1004 1004 struct rb_root rq_pos_tree; 1005 1005 };