* [PATCH 0/3] cleanups/fix for blk_mq_get_tag() @ 2020-11-30 1:36 Pavel Begunkov 2020-11-30 1:36 ` [PATCH 1/3] blk-mq: use right tag offset after wait Pavel Begunkov ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Pavel Begunkov @ 2020-11-30 1:36 UTC (permalink / raw) To: Jens Axboe, linux-block [1/3] fixes using tag_offset of a different HW queue. May only fire if it's allowed for queues to have different breserved_tags or a resize happened while it was waiting (can be?). Two others are simple cleanups catched the eye. Pavel Begunkov (3): blk-mq: use right tag offset after wait blk-mq: deduplicate blk_mq_get_tag() bits blk-mq: idiomatic use of WARN_ON_ONCE block/blk-mq-tag.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) -- 2.24.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] blk-mq: use right tag offset after wait 2020-11-30 1:36 [PATCH 0/3] cleanups/fix for blk_mq_get_tag() Pavel Begunkov @ 2020-11-30 1:36 ` Pavel Begunkov 2020-12-03 6:49 ` Ming Lei 2020-11-30 1:36 ` [PATCH 2/3] blk-mq: deduplicate blk_mq_get_tag() bits Pavel Begunkov 2020-11-30 1:36 ` [PATCH 3/3] blk-mq: idiomatic use of WARN_ON_ONCE Pavel Begunkov 2 siblings, 1 reply; 6+ messages in thread From: Pavel Begunkov @ 2020-11-30 1:36 UTC (permalink / raw) To: Jens Axboe, linux-block blk_mq_get_tag() selects tag_offset in the beginning and doesn't update it even though the tag set it may have changed hw queue during waiting. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- block/blk-mq-tag.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 9c92053e704d..dbbf11edf9a6 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -101,10 +101,8 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) return BLK_MQ_NO_TAG; } bt = tags->breserved_tags; - tag_offset = 0; } else { bt = tags->bitmap_tags; - tag_offset = tags->nr_reserved_tags; } tag = __blk_mq_get_tag(data, bt); @@ -167,6 +165,11 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) sbitmap_finish_wait(bt, ws, &wait); found_tag: + if (data->flags & BLK_MQ_REQ_RESERVED) + tag_offset = 0; + else + tag_offset = tags->nr_reserved_tags; + /* * Give up this allocation if the hctx is inactive. The caller will * retry on an active hctx. -- 2.24.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] blk-mq: use right tag offset after wait 2020-11-30 1:36 ` [PATCH 1/3] blk-mq: use right tag offset after wait Pavel Begunkov @ 2020-12-03 6:49 ` Ming Lei 2020-12-03 12:06 ` Pavel Begunkov 0 siblings, 1 reply; 6+ messages in thread From: Ming Lei @ 2020-12-03 6:49 UTC (permalink / raw) To: Pavel Begunkov; +Cc: Jens Axboe, linux-block On Mon, Nov 30, 2020 at 01:36:25AM +0000, Pavel Begunkov wrote: > blk_mq_get_tag() selects tag_offset in the beginning and doesn't update > it even though the tag set it may have changed hw queue during waiting. > > Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> > --- > block/blk-mq-tag.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c > index 9c92053e704d..dbbf11edf9a6 100644 > --- a/block/blk-mq-tag.c > +++ b/block/blk-mq-tag.c > @@ -101,10 +101,8 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) > return BLK_MQ_NO_TAG; > } > bt = tags->breserved_tags; > - tag_offset = 0; > } else { > bt = tags->bitmap_tags; > - tag_offset = tags->nr_reserved_tags; > } > > tag = __blk_mq_get_tag(data, bt); > @@ -167,6 +165,11 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) > sbitmap_finish_wait(bt, ws, &wait); > > found_tag: > + if (data->flags & BLK_MQ_REQ_RESERVED) > + tag_offset = 0; > + else > + tag_offset = tags->nr_reserved_tags; > + So far, the tag offset is tag-set wide, and 'tag_offset' is same for all tags, looks no need to add the extra check. thanks, Ming ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] blk-mq: use right tag offset after wait 2020-12-03 6:49 ` Ming Lei @ 2020-12-03 12:06 ` Pavel Begunkov 0 siblings, 0 replies; 6+ messages in thread From: Pavel Begunkov @ 2020-12-03 12:06 UTC (permalink / raw) To: Ming Lei; +Cc: Jens Axboe, linux-block On 03/12/2020 06:49, Ming Lei wrote: > On Mon, Nov 30, 2020 at 01:36:25AM +0000, Pavel Begunkov wrote: >> blk_mq_get_tag() selects tag_offset in the beginning and doesn't update >> it even though the tag set it may have changed hw queue during waiting. >> >> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> >> --- >> block/blk-mq-tag.c | 7 +++++-- >> 1 file changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c >> index 9c92053e704d..dbbf11edf9a6 100644 >> --- a/block/blk-mq-tag.c >> +++ b/block/blk-mq-tag.c >> @@ -101,10 +101,8 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) >> return BLK_MQ_NO_TAG; >> } >> bt = tags->breserved_tags; >> - tag_offset = 0; >> } else { >> bt = tags->bitmap_tags; >> - tag_offset = tags->nr_reserved_tags; >> } >> >> tag = __blk_mq_get_tag(data, bt); >> @@ -167,6 +165,11 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) >> sbitmap_finish_wait(bt, ws, &wait); >> >> found_tag: >> + if (data->flags & BLK_MQ_REQ_RESERVED) >> + tag_offset = 0; >> + else >> + tag_offset = tags->nr_reserved_tags; >> + > > So far, the tag offset is tag-set wide, and 'tag_offset' is same for all tags, > looks no need to add the extra check. Thanks for clearing that. I still think that's a good thing to do as more apparent to me and shouldn't be slower -- it unconditionally stores offset on-stack, even for no-wait path (gcc 9.2). With it's optimised more like if (!(data->flags & BLK_MQ_REQ_RESERVED)) tag += tags->nr_reserved_tags; I like assembly a bit more, but not like that matters much. -- Pavel Begunkov ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/3] blk-mq: deduplicate blk_mq_get_tag() bits 2020-11-30 1:36 [PATCH 0/3] cleanups/fix for blk_mq_get_tag() Pavel Begunkov 2020-11-30 1:36 ` [PATCH 1/3] blk-mq: use right tag offset after wait Pavel Begunkov @ 2020-11-30 1:36 ` Pavel Begunkov 2020-11-30 1:36 ` [PATCH 3/3] blk-mq: idiomatic use of WARN_ON_ONCE Pavel Begunkov 2 siblings, 0 replies; 6+ messages in thread From: Pavel Begunkov @ 2020-11-30 1:36 UTC (permalink / raw) To: Jens Axboe, linux-block Deduplicate bt_wait_ptr() call in blk_mq_get_tag(), condition-less while and absence of loop controls in-between former and current call location makes the change functionally identical. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- block/blk-mq-tag.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index dbbf11edf9a6..98f6ea219bb4 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -112,10 +112,11 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) if (data->flags & BLK_MQ_REQ_NOWAIT) return BLK_MQ_NO_TAG; - ws = bt_wait_ptr(bt, data->hctx); do { struct sbitmap_queue *bt_prev; + ws = bt_wait_ptr(bt, data->hctx); + /* * We're out of tags on this hardware queue, kick any * pending IO submits before going to sleep waiting for @@ -158,8 +159,6 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) */ if (bt != bt_prev) sbitmap_queue_wake_up(bt_prev); - - ws = bt_wait_ptr(bt, data->hctx); } while (1); sbitmap_finish_wait(bt, ws, &wait); -- 2.24.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] blk-mq: idiomatic use of WARN_ON_ONCE 2020-11-30 1:36 [PATCH 0/3] cleanups/fix for blk_mq_get_tag() Pavel Begunkov 2020-11-30 1:36 ` [PATCH 1/3] blk-mq: use right tag offset after wait Pavel Begunkov 2020-11-30 1:36 ` [PATCH 2/3] blk-mq: deduplicate blk_mq_get_tag() bits Pavel Begunkov @ 2020-11-30 1:36 ` Pavel Begunkov 2 siblings, 0 replies; 6+ messages in thread From: Pavel Begunkov @ 2020-11-30 1:36 UTC (permalink / raw) To: Jens Axboe, linux-block Let WARN_ON_ONCE() to be more clear by passing the warn condition directly, so it'll be printed. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- block/blk-mq-tag.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 98f6ea219bb4..f2743a9159ca 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -96,10 +96,8 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) int tag; if (data->flags & BLK_MQ_REQ_RESERVED) { - if (unlikely(!tags->nr_reserved_tags)) { - WARN_ON_ONCE(1); + if (WARN_ON_ONCE(!tags->nr_reserved_tags)) return BLK_MQ_NO_TAG; - } bt = tags->breserved_tags; } else { bt = tags->bitmap_tags; -- 2.24.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-12-03 12:10 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-11-30 1:36 [PATCH 0/3] cleanups/fix for blk_mq_get_tag() Pavel Begunkov 2020-11-30 1:36 ` [PATCH 1/3] blk-mq: use right tag offset after wait Pavel Begunkov 2020-12-03 6:49 ` Ming Lei 2020-12-03 12:06 ` Pavel Begunkov 2020-11-30 1:36 ` [PATCH 2/3] blk-mq: deduplicate blk_mq_get_tag() bits Pavel Begunkov 2020-11-30 1:36 ` [PATCH 3/3] blk-mq: idiomatic use of WARN_ON_ONCE Pavel Begunkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).