public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/6] blk-mq-tag: remove bt_for_each()
@ 2023-08-23  9:04 chengming.zhou
  2023-08-23  9:04 ` [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter() chengming.zhou
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

Changes in v2:
  - Split by one change per patch and add Fixes tag.
  - Improve commit messages, suggested by Bart Van Assche.

There are two almost identical mechanisms in blk-mq-tag to iterate over
requests of one tags: bt_for_each() and the newer bt_tags_for_each().

This series aim to add support of queue filter in bt_tags_for_each()
then remove bt_for_each(). Fix and update documentation as we're here.

Thanks for review!

Chengming Zhou (6):
  blk-mq-tag: support queue filter in bt_tags_iter()
  blk-mq-tag: introduce __blk_mq_tagset_busy_iter()
  blk-mq-tag: remove bt_for_each()
  blk-mq: delete superfluous check in iterate callback
  blk-mq-tag: fix functions documentation
  blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation

 block/blk-mq-tag.c | 176 ++++++++++++---------------------------------
 block/blk-mq.c     |  12 ++--
 2 files changed, 49 insertions(+), 139 deletions(-)

-- 
2.41.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter()
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:28   ` Bart Van Assche
  2023-08-23  9:04 ` [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter() chengming.zhou
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

The only user of bt_for_each() is blk_mq_queue_tag_busy_iter(), which
need to filter queue when iterate the tags. In preparation of removing
bt_for_each(), support queue filter in bt_tags_iter().

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq-tag.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index cc57e2dd9a0b..3cf3cf72cd54 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -329,6 +329,7 @@ struct bt_tags_iter_data {
 	busy_tag_iter_fn *fn;
 	void *data;
 	unsigned int flags;
+	struct request_queue *q;
 };
 
 #define BT_TAG_ITER_RESERVED		(1 << 0)
@@ -357,9 +358,13 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
 	if (!rq)
 		return true;
 
+	if (iter_data->q && iter_data->q != rq->q)
+		goto out;
+
 	if (!(iter_data->flags & BT_TAG_ITER_STARTED) ||
 	    blk_mq_request_started(rq))
 		ret = iter_data->fn(rq, iter_data->data);
+out:
 	if (!iter_static_rqs)
 		blk_mq_put_rq_ref(rq);
 	return ret;
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter()
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
  2023-08-23  9:04 ` [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter() chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:29   ` Bart Van Assche
  2023-08-23  9:04 ` [PATCH v2 3/6] blk-mq-tag: remove bt_for_each() chengming.zhou
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

For support of specified queue filter when iterating over a tagset,
we introduce __blk_mq_tagset_busy_iter() here and all current users
just set queue as NULL which means have no queue filter.

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq-tag.c | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index 3cf3cf72cd54..75b33ae6acef 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -383,13 +383,15 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
  * @flags:	BT_TAG_ITER_*
  */
 static void bt_tags_for_each(struct blk_mq_tags *tags, struct sbitmap_queue *bt,
-			     busy_tag_iter_fn *fn, void *data, unsigned int flags)
+			     busy_tag_iter_fn *fn, void *data, unsigned int flags,
+			     struct request_queue *q)
 {
 	struct bt_tags_iter_data iter_data = {
 		.tags = tags,
 		.fn = fn,
 		.data = data,
 		.flags = flags,
+		.q = q,
 	};
 
 	if (tags->rqs)
@@ -397,14 +399,15 @@ static void bt_tags_for_each(struct blk_mq_tags *tags, struct sbitmap_queue *bt,
 }
 
 static void __blk_mq_all_tag_iter(struct blk_mq_tags *tags,
-		busy_tag_iter_fn *fn, void *priv, unsigned int flags)
+		busy_tag_iter_fn *fn, void *priv, unsigned int flags,
+		struct request_queue *q)
 {
 	WARN_ON_ONCE(flags & BT_TAG_ITER_RESERVED);
 
 	if (tags->nr_reserved_tags)
 		bt_tags_for_each(tags, &tags->breserved_tags, fn, priv,
-				 flags | BT_TAG_ITER_RESERVED);
-	bt_tags_for_each(tags, &tags->bitmap_tags, fn, priv, flags);
+				 flags | BT_TAG_ITER_RESERVED, q);
+	bt_tags_for_each(tags, &tags->bitmap_tags, fn, priv, flags, q);
 }
 
 /**
@@ -422,7 +425,23 @@ static void __blk_mq_all_tag_iter(struct blk_mq_tags *tags,
 void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
 		void *priv)
 {
-	__blk_mq_all_tag_iter(tags, fn, priv, BT_TAG_ITER_STATIC_RQS);
+	__blk_mq_all_tag_iter(tags, fn, priv, BT_TAG_ITER_STATIC_RQS, NULL);
+}
+
+static void __blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset,
+				      busy_tag_iter_fn *fn, void *priv,
+				      struct request_queue *q)
+{
+	unsigned int flags = tagset->flags;
+	int i, nr_tags;
+
+	nr_tags = blk_mq_is_shared_tags(flags) ? 1 : tagset->nr_hw_queues;
+
+	for (i = 0; i < nr_tags; i++) {
+		if (tagset->tags && tagset->tags[i])
+			__blk_mq_all_tag_iter(tagset->tags[i], fn, priv,
+					      BT_TAG_ITER_STARTED, q);
+	}
 }
 
 /**
@@ -441,16 +460,7 @@ void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
 void blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset,
 		busy_tag_iter_fn *fn, void *priv)
 {
-	unsigned int flags = tagset->flags;
-	int i, nr_tags;
-
-	nr_tags = blk_mq_is_shared_tags(flags) ? 1 : tagset->nr_hw_queues;
-
-	for (i = 0; i < nr_tags; i++) {
-		if (tagset->tags && tagset->tags[i])
-			__blk_mq_all_tag_iter(tagset->tags[i], fn, priv,
-					      BT_TAG_ITER_STARTED);
-	}
+	__blk_mq_tagset_busy_iter(tagset, fn, priv, NULL);
 }
 EXPORT_SYMBOL(blk_mq_tagset_busy_iter);
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 3/6] blk-mq-tag: remove bt_for_each()
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
  2023-08-23  9:04 ` [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter() chengming.zhou
  2023-08-23  9:04 ` [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter() chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:39   ` Bart Van Assche
  2023-08-23  9:04 ` [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback chengming.zhou
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

Change the only user of bt_for_each() to use the introduced function
__blk_mq_tagset_busy_iter() to specify queue filter when iterating.

Since blk_mq_queue_tag_busy_iter() is only used to iterate over started
requests, __blk_mq_tagset_busy_iter() already have BT_TAG_ITER_STARTED
filter to iterate over started requests only, there should be no
problem.

Only one potential disadvantage I can see is that we lost the
blk_mq_hw_queue_mapped() filter, which maybe not happen for now.
Unmapped hctx was used to dynamically map or unmap when CPU hotplug,
but we don't do this anymore, we always map all possible CPUs now.
So it seems unmapped hctx may only happen if something wrong with
driver's tagset map settings.

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq-tag.c | 99 +---------------------------------------------
 1 file changed, 1 insertion(+), 98 deletions(-)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index 75b33ae6acef..c497d634cfdb 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -241,14 +241,6 @@ void blk_mq_put_tags(struct blk_mq_tags *tags, int *tag_array, int nr_tags)
 					tag_array, nr_tags);
 }
 
-struct bt_iter_data {
-	struct blk_mq_hw_ctx *hctx;
-	struct request_queue *q;
-	busy_tag_iter_fn *fn;
-	void *data;
-	bool reserved;
-};
-
 static struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags,
 		unsigned int bitnr)
 {
@@ -263,67 +255,6 @@ static struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags,
 	return rq;
 }
 
-static bool bt_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
-{
-	struct bt_iter_data *iter_data = data;
-	struct blk_mq_hw_ctx *hctx = iter_data->hctx;
-	struct request_queue *q = iter_data->q;
-	struct blk_mq_tag_set *set = q->tag_set;
-	struct blk_mq_tags *tags;
-	struct request *rq;
-	bool ret = true;
-
-	if (blk_mq_is_shared_tags(set->flags))
-		tags = set->shared_tags;
-	else
-		tags = hctx->tags;
-
-	if (!iter_data->reserved)
-		bitnr += tags->nr_reserved_tags;
-	/*
-	 * We can hit rq == NULL here, because the tagging functions
-	 * test and set the bit before assigning ->rqs[].
-	 */
-	rq = blk_mq_find_and_get_req(tags, bitnr);
-	if (!rq)
-		return true;
-
-	if (rq->q == q && (!hctx || rq->mq_hctx == hctx))
-		ret = iter_data->fn(rq, iter_data->data);
-	blk_mq_put_rq_ref(rq);
-	return ret;
-}
-
-/**
- * bt_for_each - iterate over the requests associated with a hardware queue
- * @hctx:	Hardware queue to examine.
- * @q:		Request queue to examine.
- * @bt:		sbitmap to examine. This is either the breserved_tags member
- *		or the bitmap_tags member of struct blk_mq_tags.
- * @fn:		Pointer to the function that will be called for each request
- *		associated with @hctx that has been assigned a driver tag.
- *		@fn will be called as follows: @fn(@hctx, rq, @data, @reserved)
- *		where rq is a pointer to a request. Return true to continue
- *		iterating tags, false to stop.
- * @data:	Will be passed as third argument to @fn.
- * @reserved:	Indicates whether @bt is the breserved_tags member or the
- *		bitmap_tags member of struct blk_mq_tags.
- */
-static void bt_for_each(struct blk_mq_hw_ctx *hctx, struct request_queue *q,
-			struct sbitmap_queue *bt, busy_tag_iter_fn *fn,
-			void *data, bool reserved)
-{
-	struct bt_iter_data iter_data = {
-		.hctx = hctx,
-		.fn = fn,
-		.data = data,
-		.reserved = reserved,
-		.q = q,
-	};
-
-	sbitmap_for_each_set(&bt->sb, bt_iter, &iter_data);
-}
-
 struct bt_tags_iter_data {
 	struct blk_mq_tags *tags;
 	busy_tag_iter_fn *fn;
@@ -519,35 +450,7 @@ void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_tag_iter_fn *fn,
 	if (!percpu_ref_tryget(&q->q_usage_counter))
 		return;
 
-	if (blk_mq_is_shared_tags(q->tag_set->flags)) {
-		struct blk_mq_tags *tags = q->tag_set->shared_tags;
-		struct sbitmap_queue *bresv = &tags->breserved_tags;
-		struct sbitmap_queue *btags = &tags->bitmap_tags;
-
-		if (tags->nr_reserved_tags)
-			bt_for_each(NULL, q, bresv, fn, priv, true);
-		bt_for_each(NULL, q, btags, fn, priv, false);
-	} else {
-		struct blk_mq_hw_ctx *hctx;
-		unsigned long i;
-
-		queue_for_each_hw_ctx(q, hctx, i) {
-			struct blk_mq_tags *tags = hctx->tags;
-			struct sbitmap_queue *bresv = &tags->breserved_tags;
-			struct sbitmap_queue *btags = &tags->bitmap_tags;
-
-			/*
-			 * If no software queues are currently mapped to this
-			 * hardware queue, there's nothing to check
-			 */
-			if (!blk_mq_hw_queue_mapped(hctx))
-				continue;
-
-			if (tags->nr_reserved_tags)
-				bt_for_each(hctx, q, bresv, fn, priv, true);
-			bt_for_each(hctx, q, btags, fn, priv, false);
-		}
-	}
+	__blk_mq_tagset_busy_iter(q->tag_set, fn, priv, q);
 	blk_queue_exit(q);
 }
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
                   ` (2 preceding siblings ...)
  2023-08-23  9:04 ` [PATCH v2 3/6] blk-mq-tag: remove bt_for_each() chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:40   ` Bart Van Assche
  2023-08-23  9:04 ` [PATCH v2 5/6] blk-mq-tag: fix functions documentation chengming.zhou
  2023-08-23  9:04 ` [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation chengming.zhou
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

The previous patch in this series changed the behavior of
blk_mq_queue_tag_busy_iter() from iterating over all allocated tags into
iterating over started requests only. Leave out the code from
blk_mq_rq_inflight() that became superfluous because of this change.

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 953f08354c8c..f1bafbae0a61 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1516,19 +1516,15 @@ EXPORT_SYMBOL(blk_mq_delay_kick_requeue_list);
 
 static bool blk_mq_rq_inflight(struct request *rq, void *priv)
 {
+	bool *busy = priv;
+
 	/*
 	 * If we find a request that isn't idle we know the queue is busy
 	 * as it's checked in the iter.
 	 * Return false to stop the iteration.
 	 */
-	if (blk_mq_request_started(rq)) {
-		bool *busy = priv;
-
-		*busy = true;
-		return false;
-	}
-
-	return true;
+	*busy = true;
+	return false;
 }
 
 bool blk_mq_queue_inflight(struct request_queue *q)
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 5/6] blk-mq-tag: fix functions documentation
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
                   ` (3 preceding siblings ...)
  2023-08-23  9:04 ` [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:40   ` Bart Van Assche
  2023-08-23  9:04 ` [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation chengming.zhou
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

There are some stale functions documentation in blk-mq-tag, since
the prototype of busy_tag_iter_fn() has changed. Fix it as we're here.

Fixes: 2dd6532e9591 ("blk-mq: Drop 'reserved' arg of busy_tag_iter_fn")
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq-tag.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index c497d634cfdb..087ea6b232f6 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -307,9 +307,9 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
  * @bt:		sbitmap to examine. This is either the breserved_tags member
  *		or the bitmap_tags member of struct blk_mq_tags.
  * @fn:		Pointer to the function that will be called for each started
- *		request. @fn will be called as follows: @fn(rq, @data,
- *		@reserved) where rq is a pointer to a request. Return true
- *		to continue iterating tags, false to stop.
+ *		request. @fn will be called as follows: @fn(rq, @data) where
+ *		rq is a pointer to a request. Return true to continue iterating
+ *		tags, false to stop.
  * @data:	Will be passed as second argument to @fn.
  * @flags:	BT_TAG_ITER_*
  */
@@ -345,10 +345,9 @@ static void __blk_mq_all_tag_iter(struct blk_mq_tags *tags,
  * blk_mq_all_tag_iter - iterate over all requests in a tag map
  * @tags:	Tag map to iterate over.
  * @fn:		Pointer to the function that will be called for each
- *		request. @fn will be called as follows: @fn(rq, @priv,
- *		reserved) where rq is a pointer to a request. 'reserved'
- *		indicates whether or not @rq is a reserved request. Return
- *		true to continue iterating tags, false to stop.
+ *		request. @fn will be called as follows: @fn(rq, @priv)
+ *		where rq is a pointer to a request. Return true to
+ *		continue iterating tags, false to stop.
  * @priv:	Will be passed as second argument to @fn.
  *
  * Caller has to pass the tag map from which requests are allocated.
@@ -379,10 +378,9 @@ static void __blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset,
  * blk_mq_tagset_busy_iter - iterate over all started requests in a tag set
  * @tagset:	Tag set to iterate over.
  * @fn:		Pointer to the function that will be called for each started
- *		request. @fn will be called as follows: @fn(rq, @priv,
- *		reserved) where rq is a pointer to a request. 'reserved'
- *		indicates whether or not @rq is a reserved request. Return
- *		true to continue iterating tags, false to stop.
+ *		request. @fn will be called as follows: @fn(rq, @priv)
+ *		where rq is a pointer to a request. Return true to
+ *		continue iterating tags, false to stop.
  * @priv:	Will be passed as second argument to @fn.
  *
  * We grab one request reference before calling @fn and release it after
@@ -429,11 +427,9 @@ EXPORT_SYMBOL(blk_mq_tagset_wait_completed_request);
  * blk_mq_queue_tag_busy_iter - iterate over all requests with a driver tag
  * @q:		Request queue to examine.
  * @fn:		Pointer to the function that will be called for each request
- *		on @q. @fn will be called as follows: @fn(hctx, rq, @priv,
- *		reserved) where rq is a pointer to a request and hctx points
- *		to the hardware queue associated with the request. 'reserved'
- *		indicates whether or not @rq is a reserved request.
- * @priv:	Will be passed as third argument to @fn.
+ *		on @q. @fn will be called as follows: @fn(rq, @priv) where rq
+ *		is a pointer to a request.
+ * @priv:	Will be passed as second argument to @fn.
  *
  * Note: if @q->tag_set is shared with other request queues then @fn will be
  * called for all requests on all queues that share that tag set and not only
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation
  2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
                   ` (4 preceding siblings ...)
  2023-08-23  9:04 ` [PATCH v2 5/6] blk-mq-tag: fix functions documentation chengming.zhou
@ 2023-08-23  9:04 ` chengming.zhou
  2023-08-23 14:46   ` Bart Van Assche
  5 siblings, 1 reply; 14+ messages in thread
From: chengming.zhou @ 2023-08-23  9:04 UTC (permalink / raw)
  To: axboe, ming.lei, bvanassche, hch; +Cc: linux-block, linux-kernel, zhouchengming

From: Chengming Zhou <zhouchengming@bytedance.com>

The blk_mq_queue_tag_busy_iter() is only used to iterate over reqeusts
of the specified queue, fix the documentation. And add documentation
for the new added parameter @q.

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
 block/blk-mq-tag.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index 087ea6b232f6..69b156750559 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -312,6 +312,7 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
  *		tags, false to stop.
  * @data:	Will be passed as second argument to @fn.
  * @flags:	BT_TAG_ITER_*
+ * @q:		Only iterate over requests of this queue.
  */
 static void bt_tags_for_each(struct blk_mq_tags *tags, struct sbitmap_queue *bt,
 			     busy_tag_iter_fn *fn, void *data, unsigned int flags,
@@ -432,8 +433,7 @@ EXPORT_SYMBOL(blk_mq_tagset_wait_completed_request);
  * @priv:	Will be passed as second argument to @fn.
  *
  * Note: if @q->tag_set is shared with other request queues then @fn will be
- * called for all requests on all queues that share that tag set and not only
- * for requests associated with @q.
+ * called only for requests associated with @q.
  */
 void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_tag_iter_fn *fn,
 		void *priv)
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter()
  2023-08-23  9:04 ` [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter() chengming.zhou
@ 2023-08-23 14:28   ` Bart Van Assche
  0 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:28 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> The only user of bt_for_each() is blk_mq_queue_tag_busy_iter(), which
> need to filter queue when iterate the tags. In preparation of removing
> bt_for_each(), support queue filter in bt_tags_iter().

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter()
  2023-08-23  9:04 ` [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter() chengming.zhou
@ 2023-08-23 14:29   ` Bart Van Assche
  0 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:29 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> For support of specified queue filter when iterating over a tagset,
> we introduce __blk_mq_tagset_busy_iter() here and all current users
> just set queue as NULL which means have no queue filter.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/6] blk-mq-tag: remove bt_for_each()
  2023-08-23  9:04 ` [PATCH v2 3/6] blk-mq-tag: remove bt_for_each() chengming.zhou
@ 2023-08-23 14:39   ` Bart Van Assche
  0 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:39 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> Change the only user of bt_for_each() to use the introduced function
> __blk_mq_tagset_busy_iter() to specify queue filter when iterating.
> 
> Since blk_mq_queue_tag_busy_iter() is only used to iterate over started
> requests, __blk_mq_tagset_busy_iter() already have BT_TAG_ITER_STARTED
> filter to iterate over started requests only, there should be no
> problem.
> 
> Only one potential disadvantage I can see is that we lost the
> blk_mq_hw_queue_mapped() filter, which maybe not happen for now.
> Unmapped hctx was used to dynamically map or unmap when CPU hotplug,
> but we don't do this anymore, we always map all possible CPUs now.
> So it seems unmapped hctx may only happen if something wrong with
> driver's tagset map settings.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback
  2023-08-23  9:04 ` [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback chengming.zhou
@ 2023-08-23 14:40   ` Bart Van Assche
  0 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:40 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> The previous patch in this series changed the behavior of
> blk_mq_queue_tag_busy_iter() from iterating over all allocated tags into
> iterating over started requests only. Leave out the code from
> blk_mq_rq_inflight() that became superfluous because of this change.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 5/6] blk-mq-tag: fix functions documentation
  2023-08-23  9:04 ` [PATCH v2 5/6] blk-mq-tag: fix functions documentation chengming.zhou
@ 2023-08-23 14:40   ` Bart Van Assche
  0 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:40 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> There are some stale functions documentation in blk-mq-tag, since
> the prototype of busy_tag_iter_fn() has changed. Fix it as we're here.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation
  2023-08-23  9:04 ` [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation chengming.zhou
@ 2023-08-23 14:46   ` Bart Van Assche
  2023-08-23 15:03     ` Chengming Zhou
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Van Assche @ 2023-08-23 14:46 UTC (permalink / raw)
  To: chengming.zhou, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
> diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
> index 087ea6b232f6..69b156750559 100644
> --- a/block/blk-mq-tag.c
> +++ b/block/blk-mq-tag.c
> @@ -312,6 +312,7 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
>    *		tags, false to stop.
>    * @data:	Will be passed as second argument to @fn.
>    * @flags:	BT_TAG_ITER_*
> + * @q:		Only iterate over requests of this queue.
>    */

Please integrate this change in patch 2/6 since the argument 'q' is added by that
patch.

> @@ -432,8 +433,7 @@ EXPORT_SYMBOL(blk_mq_tagset_wait_completed_request);
>    * @priv:	Will be passed as second argument to @fn.
>    *
>    * Note: if @q->tag_set is shared with other request queues then @fn will be
> - * called for all requests on all queues that share that tag set and not only
> - * for requests associated with @q.
> + * called only for requests associated with @q.
>    */
>   void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_tag_iter_fn *fn,
>   		void *priv)

Please consider adding the following to this change:

Fixes: c7b1bf5cca76 ("blk-mq: Document the functions that iterate over requests")


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation
  2023-08-23 14:46   ` Bart Van Assche
@ 2023-08-23 15:03     ` Chengming Zhou
  0 siblings, 0 replies; 14+ messages in thread
From: Chengming Zhou @ 2023-08-23 15:03 UTC (permalink / raw)
  To: Bart Van Assche, axboe, ming.lei, hch
  Cc: linux-block, linux-kernel, zhouchengming

On 2023/8/23 22:46, Bart Van Assche wrote:
> On 8/23/23 02:04, chengming.zhou@linux.dev wrote:
>> diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
>> index 087ea6b232f6..69b156750559 100644
>> --- a/block/blk-mq-tag.c
>> +++ b/block/blk-mq-tag.c
>> @@ -312,6 +312,7 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
>>    *        tags, false to stop.
>>    * @data:    Will be passed as second argument to @fn.
>>    * @flags:    BT_TAG_ITER_*
>> + * @q:        Only iterate over requests of this queue.
>>    */
> 
> Please integrate this change in patch 2/6 since the argument 'q' is added by that
> patch.

Ok, right.

> 
>> @@ -432,8 +433,7 @@ EXPORT_SYMBOL(blk_mq_tagset_wait_completed_request);
>>    * @priv:    Will be passed as second argument to @fn.
>>    *
>>    * Note: if @q->tag_set is shared with other request queues then @fn will be
>> - * called for all requests on all queues that share that tag set and not only
>> - * for requests associated with @q.
>> + * called only for requests associated with @q.
>>    */
>>   void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_tag_iter_fn *fn,
>>           void *priv)
> 
> Please consider adding the following to this change:
> 
> Fixes: c7b1bf5cca76 ("blk-mq: Document the functions that iterate over requests")
> 

Ok, will update.

Thanks!

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2023-08-23 15:03 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-23  9:04 [PATCH v2 0/6] blk-mq-tag: remove bt_for_each() chengming.zhou
2023-08-23  9:04 ` [PATCH v2 1/6] blk-mq-tag: support queue filter in bt_tags_iter() chengming.zhou
2023-08-23 14:28   ` Bart Van Assche
2023-08-23  9:04 ` [PATCH v2 2/6] blk-mq-tag: introduce __blk_mq_tagset_busy_iter() chengming.zhou
2023-08-23 14:29   ` Bart Van Assche
2023-08-23  9:04 ` [PATCH v2 3/6] blk-mq-tag: remove bt_for_each() chengming.zhou
2023-08-23 14:39   ` Bart Van Assche
2023-08-23  9:04 ` [PATCH v2 4/6] blk-mq: delete superfluous check in iterate callback chengming.zhou
2023-08-23 14:40   ` Bart Van Assche
2023-08-23  9:04 ` [PATCH v2 5/6] blk-mq-tag: fix functions documentation chengming.zhou
2023-08-23 14:40   ` Bart Van Assche
2023-08-23  9:04 ` [PATCH v2 6/6] blk-mq-tag: fix blk_mq_queue_tag_busy_iter() documentation chengming.zhou
2023-08-23 14:46   ` Bart Van Assche
2023-08-23 15:03     ` Chengming Zhou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox