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.

blk-mq: fix stale tag depth for shared sched tags in blk_mq_update_nr_requests()

Commit 7f2799c546db ("blk-mq: cleanup shared tags case in
blk_mq_update_nr_requests()") moves blk_mq_tag_update_sched_shared_tags()
before q->nr_requests is updated, however, it's still using the old
q->nr_requests to resize tag depth.

Fix this problem by passing in expected new tag depth.

Fixes: 7f2799c546db ("blk-mq: cleanup shared tags case in blk_mq_update_nr_requests()")
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reported-by: Chris Mason <clm@meta.com>
Link: https://lore.kernel.org/linux-block/20251014130507.4187235-2-clm@meta.com/
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Yu Kuai and committed by
Jens Axboe
dc96cefe 455281c0

+7 -5
+1 -1
block/blk-mq-sched.c
··· 557 557 if (blk_mq_is_shared_tags(flags)) { 558 558 /* Shared tags are stored at index 0 in @et->tags. */ 559 559 q->sched_shared_tags = et->tags[0]; 560 - blk_mq_tag_update_sched_shared_tags(q); 560 + blk_mq_tag_update_sched_shared_tags(q, et->nr_requests); 561 561 } 562 562 563 563 queue_for_each_hw_ctx(q, hctx, i) {
+3 -2
block/blk-mq-tag.c
··· 622 622 sbitmap_queue_resize(&tags->bitmap_tags, size - set->reserved_tags); 623 623 } 624 624 625 - void blk_mq_tag_update_sched_shared_tags(struct request_queue *q) 625 + void blk_mq_tag_update_sched_shared_tags(struct request_queue *q, 626 + unsigned int nr) 626 627 { 627 628 sbitmap_queue_resize(&q->sched_shared_tags->bitmap_tags, 628 - q->nr_requests - q->tag_set->reserved_tags); 629 + nr - q->tag_set->reserved_tags); 629 630 } 630 631 631 632 /**
+1 -1
block/blk-mq.c
··· 4941 4941 * tags can't grow, see blk_mq_alloc_sched_tags(). 4942 4942 */ 4943 4943 if (q->elevator) 4944 - blk_mq_tag_update_sched_shared_tags(q); 4944 + blk_mq_tag_update_sched_shared_tags(q, nr); 4945 4945 else 4946 4946 blk_mq_tag_resize_shared_tags(set, nr); 4947 4947 } else if (!q->elevator) {
+2 -1
block/blk-mq.h
··· 186 186 void blk_mq_put_tags(struct blk_mq_tags *tags, int *tag_array, int nr_tags); 187 187 void blk_mq_tag_resize_shared_tags(struct blk_mq_tag_set *set, 188 188 unsigned int size); 189 - void blk_mq_tag_update_sched_shared_tags(struct request_queue *q); 189 + void blk_mq_tag_update_sched_shared_tags(struct request_queue *q, 190 + unsigned int nr); 190 191 191 192 void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool); 192 193 void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_tag_iter_fn *fn,