linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] cancel all throttled bios in del_gendisk()
@ 2021-11-27 10:10 Yu Kuai
  2021-11-27 10:10 ` [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios" Yu Kuai
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Yu Kuai @ 2021-11-27 10:10 UTC (permalink / raw)
  To: hch, tj, axboe; +Cc: cgroups, linux-block, linux-kernel, yukuai3, yi.zhang

If del_gendisk() is done when some io are still throttled, such io
will not be handled until the throttle is done, which is not
necessary.

This patch series handle such io in del_gendisk().

Yu Kuai (4):
  Revert "blk-throttle: remove tg_drain_bios"
  blk-throtl: don't warn in tg_drain_bios()
  blk-throtl: introduce blk_throtl_cancel_bios()
  block: cancel all throttled bios in del_gendisk()

 block/blk-throttle.c | 68 +++++++++++++++++++++++++++++++++++++++++---
 block/blk-throttle.h |  2 ++
 block/genhd.c        |  2 ++
 3 files changed, 68 insertions(+), 4 deletions(-)

-- 
2.31.1


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

* [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios"
  2021-11-27 10:10 [PATCH 0/4] cancel all throttled bios in del_gendisk() Yu Kuai
@ 2021-11-27 10:10 ` Yu Kuai
  2021-11-29 11:45   ` Christoph Hellwig
  2021-11-27 10:10 ` [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios() Yu Kuai
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Yu Kuai @ 2021-11-27 10:10 UTC (permalink / raw)
  To: hch, tj, axboe; +Cc: cgroups, linux-block, linux-kernel, yukuai3, yi.zhang

This reverts commit 32e3374304c7c317c05a61f3ddc315dbd46424f2.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/blk-throttle.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 39bb6e68a9a2..230e300c5856 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -2257,6 +2257,28 @@ void blk_throtl_bio_endio(struct bio *bio)
 }
 #endif
 
+/*
+ * Dispatch all bios from all children tg's queued on @parent_sq.  On
+ * return, @parent_sq is guaranteed to not have any active children tg's
+ * and all bios from previously active tg's are on @parent_sq->bio_lists[].
+ */
+static void tg_drain_bios(struct throtl_service_queue *parent_sq)
+{
+	struct throtl_grp *tg;
+
+	while ((tg = throtl_rb_first(parent_sq))) {
+		struct throtl_service_queue *sq = &tg->service_queue;
+		struct bio *bio;
+
+		throtl_dequeue_tg(tg);
+
+		while ((bio = throtl_peek_queued(&sq->queued[READ])))
+			tg_dispatch_one_bio(tg, bio_data_dir(bio));
+		while ((bio = throtl_peek_queued(&sq->queued[WRITE])))
+			tg_dispatch_one_bio(tg, bio_data_dir(bio));
+	}
+}
+
 int blk_throtl_init(struct request_queue *q)
 {
 	struct throtl_data *td;
-- 
2.31.1


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

* [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios()
  2021-11-27 10:10 [PATCH 0/4] cancel all throttled bios in del_gendisk() Yu Kuai
  2021-11-27 10:10 ` [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios" Yu Kuai
@ 2021-11-27 10:10 ` Yu Kuai
  2021-11-29 11:46   ` Christoph Hellwig
  2021-11-27 10:10 ` [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios() Yu Kuai
  2021-11-27 10:10 ` [PATCH 4/4] block: cancel all throttled bios in del_gendisk() Yu Kuai
  3 siblings, 1 reply; 10+ messages in thread
From: Yu Kuai @ 2021-11-27 10:10 UTC (permalink / raw)
  To: hch, tj, axboe; +Cc: cgroups, linux-block, linux-kernel, yukuai3, yi.zhang

tg_drain_bios() will iterate until throtl_rb_first() return NULL,
don't warn in such situation.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/blk-throttle.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 230e300c5856..25822c88bea1 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -497,12 +497,13 @@ static void throtl_pd_free(struct blkg_policy_data *pd)
 }
 
 static struct throtl_grp *
-throtl_rb_first(struct throtl_service_queue *parent_sq)
+throtl_rb_first(struct throtl_service_queue *parent_sq, bool warn)
 {
 	struct rb_node *n;
 
 	n = rb_first_cached(&parent_sq->pending_tree);
-	WARN_ON_ONCE(!n);
+	if (warn)
+		WARN_ON_ONCE(!n);
 	if (!n)
 		return NULL;
 	return rb_entry_tg(n);
@@ -520,7 +521,7 @@ static void update_min_dispatch_time(struct throtl_service_queue *parent_sq)
 {
 	struct throtl_grp *tg;
 
-	tg = throtl_rb_first(parent_sq);
+	tg = throtl_rb_first(parent_sq, true);
 	if (!tg)
 		return;
 
@@ -1089,7 +1090,7 @@ static int throtl_select_dispatch(struct throtl_service_queue *parent_sq)
 		if (!parent_sq->nr_pending)
 			break;
 
-		tg = throtl_rb_first(parent_sq);
+		tg = throtl_rb_first(parent_sq, true);
 		if (!tg)
 			break;
 
@@ -2266,7 +2267,7 @@ static void tg_drain_bios(struct throtl_service_queue *parent_sq)
 {
 	struct throtl_grp *tg;
 
-	while ((tg = throtl_rb_first(parent_sq))) {
+	while ((tg = throtl_rb_first(parent_sq, false))) {
 		struct throtl_service_queue *sq = &tg->service_queue;
 		struct bio *bio;
 
-- 
2.31.1


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

* [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios()
  2021-11-27 10:10 [PATCH 0/4] cancel all throttled bios in del_gendisk() Yu Kuai
  2021-11-27 10:10 ` [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios" Yu Kuai
  2021-11-27 10:10 ` [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios() Yu Kuai
@ 2021-11-27 10:10 ` Yu Kuai
  2021-11-29 11:47   ` Christoph Hellwig
  2021-11-27 10:10 ` [PATCH 4/4] block: cancel all throttled bios in del_gendisk() Yu Kuai
  3 siblings, 1 reply; 10+ messages in thread
From: Yu Kuai @ 2021-11-27 10:10 UTC (permalink / raw)
  To: hch, tj, axboe; +Cc: cgroups, linux-block, linux-kernel, yukuai3, yi.zhang

This function is used to cancel all throttled bios. Noted this
modification is mainly from revertion of commit b77412372b68
("blk-throttle: remove blk_throtl_drain").

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/blk-throttle.c | 37 +++++++++++++++++++++++++++++++++++++
 block/blk-throttle.h |  2 ++
 2 files changed, 39 insertions(+)

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 25822c88bea1..b31ae8a2c8b5 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -2280,6 +2280,43 @@ static void tg_drain_bios(struct throtl_service_queue *parent_sq)
 	}
 }
 
+/**
+ * blk_throtl_cancel_bios - cancel throttled bios
+ * @q: request_queue to cancel throttled bios for
+ *
+ * This function is called to error all currently throttled bios on @q.
+ */
+void blk_throtl_cancel_bios(struct request_queue *q)
+{
+	struct throtl_data *td = q->td;
+	struct blkcg_gq *blkg;
+	struct cgroup_subsys_state *pos_css;
+	struct bio *bio;
+	int rw;
+
+	rcu_read_lock();
+
+	/*
+	 * Drain each tg while doing post-order walk on the blkg tree, so
+	 * that all bios are propagated to td->service_queue.  It'd be
+	 * better to walk service_queue tree directly but blkg walk is
+	 * easier.
+	 */
+	blkg_for_each_descendant_post(blkg, pos_css, td->queue->root_blkg)
+		tg_drain_bios(&blkg_to_tg(blkg)->service_queue);
+
+	/* finally, transfer bios from top-level tg's into the td */
+	tg_drain_bios(&td->service_queue);
+
+	rcu_read_unlock();
+
+	/* all bios now should be in td->service_queue, cancel them */
+	for (rw = READ; rw <= WRITE; rw++)
+		while ((bio = throtl_pop_queued(&td->service_queue.queued[rw],
+						NULL)))
+			bio_io_error(bio);
+}
+
 int blk_throtl_init(struct request_queue *q)
 {
 	struct throtl_data *td;
diff --git a/block/blk-throttle.h b/block/blk-throttle.h
index 175f03abd9e4..9d67d5139954 100644
--- a/block/blk-throttle.h
+++ b/block/blk-throttle.h
@@ -160,12 +160,14 @@ static inline void blk_throtl_exit(struct request_queue *q) { }
 static inline void blk_throtl_register_queue(struct request_queue *q) { }
 static inline void blk_throtl_charge_bio_split(struct bio *bio) { }
 static inline bool blk_throtl_bio(struct bio *bio) { return false; }
+#define blk_throtl_cancel_bios(q)  do { } while (0)
 #else /* CONFIG_BLK_DEV_THROTTLING */
 int blk_throtl_init(struct request_queue *q);
 void blk_throtl_exit(struct request_queue *q);
 void blk_throtl_register_queue(struct request_queue *q);
 void blk_throtl_charge_bio_split(struct bio *bio);
 bool __blk_throtl_bio(struct bio *bio);
+void blk_throtl_cancel_bios(struct request_queue *q);
 static inline bool blk_throtl_bio(struct bio *bio)
 {
 	struct throtl_grp *tg = blkg_to_tg(bio->bi_blkg);
-- 
2.31.1


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

* [PATCH 4/4] block: cancel all throttled bios in del_gendisk()
  2021-11-27 10:10 [PATCH 0/4] cancel all throttled bios in del_gendisk() Yu Kuai
                   ` (2 preceding siblings ...)
  2021-11-27 10:10 ` [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios() Yu Kuai
@ 2021-11-27 10:10 ` Yu Kuai
  3 siblings, 0 replies; 10+ messages in thread
From: Yu Kuai @ 2021-11-27 10:10 UTC (permalink / raw)
  To: hch, tj, axboe; +Cc: cgroups, linux-block, linux-kernel, yukuai3, yi.zhang

Throttled bios can't be issued after del_gendisk() is done, thus
it's better to cancel them immediately rather than waiting for
throttle is done.

For example, if user thread is throttled with low bps while it's
issuing large io, and the device is deleted. The user thread will
wait for a long time for io to return.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/genhd.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/block/genhd.c b/block/genhd.c
index 8e9cbf23c510..24fa3356d164 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -28,6 +28,7 @@
 
 #include "blk.h"
 #include "blk-rq-qos.h"
+#include "blk-throttle.h"
 
 static struct kobject *block_depr;
 
@@ -619,6 +620,7 @@ void del_gendisk(struct gendisk *disk)
 
 	blk_mq_freeze_queue_wait(q);
 
+	blk_throtl_cancel_bios(q);
 	rq_qos_exit(q);
 	blk_sync_queue(q);
 	blk_flush_integrity();
-- 
2.31.1


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

* Re: [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios"
  2021-11-27 10:10 ` [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios" Yu Kuai
@ 2021-11-29 11:45   ` Christoph Hellwig
  0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2021-11-29 11:45 UTC (permalink / raw)
  To: Yu Kuai; +Cc: hch, tj, axboe, cgroups, linux-block, linux-kernel, yi.zhang

On Sat, Nov 27, 2021 at 06:10:56PM +0800, Yu Kuai wrote:
> This reverts commit 32e3374304c7c317c05a61f3ddc315dbd46424f2.

Please re-add the function together with the actual users in a commit
that has a proper commit log.

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

* Re: [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios()
  2021-11-27 10:10 ` [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios() Yu Kuai
@ 2021-11-29 11:46   ` Christoph Hellwig
  0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2021-11-29 11:46 UTC (permalink / raw)
  To: Yu Kuai; +Cc: hch, tj, axboe, cgroups, linux-block, linux-kernel, yi.zhang

On Sat, Nov 27, 2021 at 06:10:57PM +0800, Yu Kuai wrote:
> tg_drain_bios() will iterate until throtl_rb_first() return NULL,
> don't warn in such situation.
> 
> Signed-off-by: Yu Kuai <yukuai3@huawei.com>
> ---
>  block/blk-throttle.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> index 230e300c5856..25822c88bea1 100644
> --- a/block/blk-throttle.c
> +++ b/block/blk-throttle.c
> @@ -497,12 +497,13 @@ static void throtl_pd_free(struct blkg_policy_data *pd)
>  }
>  
>  static struct throtl_grp *
> -throtl_rb_first(struct throtl_service_queue *parent_sq)
> +throtl_rb_first(struct throtl_service_queue *parent_sq, bool warn)
>  {
>  	struct rb_node *n;
>  
>  	n = rb_first_cached(&parent_sq->pending_tree);
> -	WARN_ON_ONCE(!n);
> +	if (warn)
> +		WARN_ON_ONCE(!n);
>  	if (!n)
>  		return NULL;

Just shift then WARN_ON_ONCE into the callers that care.

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

* Re: [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios()
  2021-11-27 10:10 ` [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios() Yu Kuai
@ 2021-11-29 11:47   ` Christoph Hellwig
  2021-11-29 13:58     ` yukuai (C)
  0 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2021-11-29 11:47 UTC (permalink / raw)
  To: Yu Kuai; +Cc: hch, tj, axboe, cgroups, linux-block, linux-kernel, yi.zhang

On Sat, Nov 27, 2021 at 06:10:58PM +0800, Yu Kuai wrote:
> This function is used to cancel all throttled bios. Noted this
> modification is mainly from revertion of commit b77412372b68
> ("blk-throttle: remove blk_throtl_drain").

This should also go into the last patch.

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

* Re: [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios()
  2021-11-29 11:47   ` Christoph Hellwig
@ 2021-11-29 13:58     ` yukuai (C)
  0 siblings, 0 replies; 10+ messages in thread
From: yukuai (C) @ 2021-11-29 13:58 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: tj, axboe, cgroups, linux-block, linux-kernel, yi.zhang

On 2021/11/29 19:47, Christoph Hellwig wrote:
> On Sat, Nov 27, 2021 at 06:10:58PM +0800, Yu Kuai wrote:
>> This function is used to cancel all throttled bios. Noted this
>> modification is mainly from revertion of commit b77412372b68
>> ("blk-throttle: remove blk_throtl_drain").
> 
> This should also go into the last patch.
> .
> 

I'll merge patch 1,3,4 into one patch,

Thanks,
Kuai

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

* [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios()
  2021-09-22 12:51 [PATCH 0/4] cancel all throttled bios in blk_cleanup_queue() Yu Kuai
@ 2021-09-22 12:51 ` Yu Kuai
  0 siblings, 0 replies; 10+ messages in thread
From: Yu Kuai @ 2021-09-22 12:51 UTC (permalink / raw)
  To: axboe, tj; +Cc: linux-block, linux-kernel, cgroups, yukuai3, yi.zhang

tg_drain_bios() will iterate until throtl_rb_first() return NULL,
don't warn in such situation.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/blk-throttle.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 43dee985170b..3892ead7a0b5 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -644,12 +644,13 @@ static void throtl_pd_free(struct blkg_policy_data *pd)
 }
 
 static struct throtl_grp *
-throtl_rb_first(struct throtl_service_queue *parent_sq)
+throtl_rb_first(struct throtl_service_queue *parent_sq, bool warn)
 {
 	struct rb_node *n;
 
 	n = rb_first_cached(&parent_sq->pending_tree);
-	WARN_ON_ONCE(!n);
+	if (warn)
+		WARN_ON_ONCE(!n);
 	if (!n)
 		return NULL;
 	return rb_entry_tg(n);
@@ -667,7 +668,7 @@ static void update_min_dispatch_time(struct throtl_service_queue *parent_sq)
 {
 	struct throtl_grp *tg;
 
-	tg = throtl_rb_first(parent_sq);
+	tg = throtl_rb_first(parent_sq, true);
 	if (!tg)
 		return;
 
@@ -1236,7 +1237,7 @@ static int throtl_select_dispatch(struct throtl_service_queue *parent_sq)
 		if (!parent_sq->nr_pending)
 			break;
 
-		tg = throtl_rb_first(parent_sq);
+		tg = throtl_rb_first(parent_sq, true);
 		if (!tg)
 			break;
 
@@ -2421,7 +2422,7 @@ static void tg_drain_bios(struct throtl_service_queue *parent_sq)
 {
 	struct throtl_grp *tg;
 
-	while ((tg = throtl_rb_first(parent_sq))) {
+	while ((tg = throtl_rb_first(parent_sq, false))) {
 		struct throtl_service_queue *sq = &tg->service_queue;
 		struct bio *bio;
 
-- 
2.31.1


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

end of thread, other threads:[~2021-11-29 14:00 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-27 10:10 [PATCH 0/4] cancel all throttled bios in del_gendisk() Yu Kuai
2021-11-27 10:10 ` [PATCH 1/4] Revert "blk-throttle: remove tg_drain_bios" Yu Kuai
2021-11-29 11:45   ` Christoph Hellwig
2021-11-27 10:10 ` [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios() Yu Kuai
2021-11-29 11:46   ` Christoph Hellwig
2021-11-27 10:10 ` [PATCH 3/4] blk-throtl: introduce blk_throtl_cancel_bios() Yu Kuai
2021-11-29 11:47   ` Christoph Hellwig
2021-11-29 13:58     ` yukuai (C)
2021-11-27 10:10 ` [PATCH 4/4] block: cancel all throttled bios in del_gendisk() Yu Kuai
  -- strict thread matches above, loose matches on Subject: below --
2021-09-22 12:51 [PATCH 0/4] cancel all throttled bios in blk_cleanup_queue() Yu Kuai
2021-09-22 12:51 ` [PATCH 2/4] blk-throtl: don't warn in tg_drain_bios() Yu Kuai

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).