2022-10-19 13:56:16

by Yu Kuai

[permalink] [raw]
Subject: [PATCH v5 0/6] blk-wbt: simple improvment to enable wbt correctly

From: Yu Kuai <[email protected]>

changes in v5:
- code adjustment in patch 4, as suggested by Christoph.
- add review tag by Christop.

changes in v4:
- remove patch 3 from v3
- add patch 2,3 in v4

changes in v3:
- instead of check elevator name, add a flag in elevator_queue, as
suggested by Christoph.
- add patch 3 and patch 5 to this patchset.

changes in v2:
- define new api if wbt config is not enabled in patch 1.

Yu Kuai (6):
elevator: remove redundant code in elv_unregister_queue()
blk-wbt: remove unnecessary check in wbt_enable_default()
blk-wbt: make enable_state more accurate
blk-wbt: don't show valid wbt_lat_usec in sysfs while wbt is disabled
elevator: add new field flags in struct elevator_queue
blk-wbt: don't enable throttling if default elevator is bfq

block/bfq-iosched.c | 2 ++
block/blk-sysfs.c | 3 +++
block/blk-wbt.c | 26 ++++++++++++++++++++++----
block/blk-wbt.h | 17 ++++++++++++-----
block/elevator.c | 8 ++------
block/elevator.h | 5 ++++-
6 files changed, 45 insertions(+), 16 deletions(-)

--
2.31.1


2022-10-19 13:58:00

by Yu Kuai

[permalink] [raw]
Subject: [PATCH v5 1/6] elevator: remove redundant code in elv_unregister_queue()

From: Yu Kuai <[email protected]>

"elevator_queue *e" is already declared and initialized in the beginning
of elv_unregister_queue().

Signed-off-by: Yu Kuai <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Eric Biggers <[email protected]>
---
block/elevator.c | 2 --
1 file changed, 2 deletions(-)

diff --git a/block/elevator.c b/block/elevator.c
index bd71f0fc4e4b..20e70fd3f77f 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -524,8 +524,6 @@ void elv_unregister_queue(struct request_queue *q)
lockdep_assert_held(&q->sysfs_lock);

if (e && e->registered) {
- struct elevator_queue *e = q->elevator;
-
kobject_uevent(&e->kobj, KOBJ_REMOVE);
kobject_del(&e->kobj);

--
2.31.1

2022-10-19 14:08:57

by Yu Kuai

[permalink] [raw]
Subject: [PATCH v5 2/6] blk-wbt: remove unnecessary check in wbt_enable_default()

From: Yu Kuai <[email protected]>

If CONFIG_BLK_WBT_MQ is disabled, wbt_init() won't do anything.

Signed-off-by: Yu Kuai <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
---
block/blk-wbt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index c293e08b301f..c5a8c10028a0 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -651,7 +651,7 @@ void wbt_enable_default(struct request_queue *q)
if (!blk_queue_registered(q))
return;

- if (queue_is_mq(q) && IS_ENABLED(CONFIG_BLK_WBT_MQ))
+ if (queue_is_mq(q))
wbt_init(q);
}
EXPORT_SYMBOL_GPL(wbt_enable_default);
--
2.31.1

2022-10-19 14:37:52

by Yu Kuai

[permalink] [raw]
Subject: [PATCH v5 4/6] blk-wbt: don't show valid wbt_lat_usec in sysfs while wbt is disabled

From: Yu Kuai <[email protected]>

Currently, if wbt is initialized and then disabled by
wbt_disable_default(), sysfs will still show valid wbt_lat_usec, which
will confuse users that wbt is still enabled.

This patch shows wbt_lat_usec as zero if it's disabled.

Signed-off-by: Yu Kuai <[email protected]>
Reported-and-tested-by: Holger Hoffstätte <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
---
block/blk-sysfs.c | 3 +++
block/blk-wbt.c | 8 ++++++++
block/blk-wbt.h | 5 +++++
3 files changed, 16 insertions(+)

diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index e71b3b43927c..7b98c7074771 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -470,6 +470,9 @@ static ssize_t queue_wb_lat_show(struct request_queue *q, char *page)
if (!wbt_rq_qos(q))
return -EINVAL;

+ if (wbt_disabled(q))
+ return sprintf(page, "0\n");
+
return sprintf(page, "%llu\n", div_u64(wbt_get_min_lat(q), 1000));
}

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 4680691a96bc..07ed0b0aee1f 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -422,6 +422,14 @@ static void wbt_update_limits(struct rq_wb *rwb)
rwb_wake_all(rwb);
}

+bool wbt_disabled(struct request_queue *q)
+{
+ struct rq_qos *rqos = wbt_rq_qos(q);
+
+ return !rqos || RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT ||
+ RQWB(rqos)->enable_state == WBT_STATE_OFF_MANUAL;
+}
+
u64 wbt_get_min_lat(struct request_queue *q)
{
struct rq_qos *rqos = wbt_rq_qos(q);
diff --git a/block/blk-wbt.h b/block/blk-wbt.h
index 7fe98638fff5..e3ea6e7e2900 100644
--- a/block/blk-wbt.h
+++ b/block/blk-wbt.h
@@ -96,6 +96,7 @@ void wbt_enable_default(struct request_queue *);

u64 wbt_get_min_lat(struct request_queue *q);
void wbt_set_min_lat(struct request_queue *q, u64 val);
+bool wbt_disabled(struct request_queue *);

void wbt_set_write_cache(struct request_queue *, bool);

@@ -127,6 +128,10 @@ static inline u64 wbt_default_latency_nsec(struct request_queue *q)
{
return 0;
}
+static inline bool wbt_disabled(struct request_queue *q)
+{
+ return true;
+}

#endif /* CONFIG_BLK_WBT */

--
2.31.1

2022-10-19 15:54:13

by Yu Kuai

[permalink] [raw]
Subject: [PATCH v5 6/6] blk-wbt: don't enable throttling if default elevator is bfq

From: Yu Kuai <[email protected]>

Commit b5dc5d4d1f4f ("block,bfq: Disable writeback throttling") tries to
disable wbt for bfq, it's done by calling wbt_disable_default() in
bfq_init_queue(). However, wbt is still enabled if default elevator is
bfq:

device_add_disk
elevator_init_mq
bfq_init_queue
wbt_disable_default -> done nothing

blk_register_queue
wbt_enable_default -> wbt is enabled

Fix the problem by adding a new flag ELEVATOR_FLAG_DISBALE_WBT, bfq
will set the flag in bfq_init_queue, and following wbt_enable_default()
won't enable wbt while the flag is set.

Signed-off-by: Yu Kuai <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
---
block/bfq-iosched.c | 2 ++
block/blk-wbt.c | 11 ++++++++---
block/elevator.h | 3 ++-
3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 24649c34cd35..42aa5fc7f17b 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -6994,6 +6994,7 @@ static void bfq_exit_queue(struct elevator_queue *e)
#endif

blk_stat_disable_accounting(bfqd->queue);
+ clear_bit(ELEVATOR_FLAG_DISABLE_WBT, &e->flags);
wbt_enable_default(bfqd->queue);

kfree(bfqd);
@@ -7139,6 +7140,7 @@ static int bfq_init_queue(struct request_queue *q, struct elevator_type *e)
/* We dispatch from request queue wide instead of hw queue */
blk_queue_flag_set(QUEUE_FLAG_SQ_SCHED, q);

+ set_bit(ELEVATOR_FLAG_DISABLE_WBT, &eq->flags);
wbt_disable_default(q);
blk_stat_enable_accounting(q);

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 07ed0b0aee1f..68a774d7a7c9 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -27,6 +27,7 @@

#include "blk-wbt.h"
#include "blk-rq-qos.h"
+#include "elevator.h"

#define CREATE_TRACE_POINTS
#include <trace/events/wbt.h>
@@ -651,11 +652,15 @@ void wbt_set_write_cache(struct request_queue *q, bool write_cache_on)
*/
void wbt_enable_default(struct request_queue *q)
{
- struct rq_qos *rqos = wbt_rq_qos(q);
+ struct rq_qos *rqos;
+ bool disable_flag = q->elevator &&
+ test_bit(ELEVATOR_FLAG_DISABLE_WBT, &q->elevator->flags);

/* Throttling already enabled? */
+ rqos = wbt_rq_qos(q);
if (rqos) {
- if (RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT)
+ if (!disable_flag &&
+ RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT)
RQWB(rqos)->enable_state = WBT_STATE_ON_DEFAULT;
return;
}
@@ -664,7 +669,7 @@ void wbt_enable_default(struct request_queue *q)
if (!blk_queue_registered(q))
return;

- if (queue_is_mq(q))
+ if (queue_is_mq(q) && !disable_flag)
wbt_init(q);
}
EXPORT_SYMBOL_GPL(wbt_enable_default);
diff --git a/block/elevator.h b/block/elevator.h
index ed574bf3e629..75382471222d 100644
--- a/block/elevator.h
+++ b/block/elevator.h
@@ -104,7 +104,8 @@ struct elevator_queue
DECLARE_HASHTABLE(hash, ELV_HASH_BITS);
};

-#define ELEVATOR_FLAG_REGISTERED 0
+#define ELEVATOR_FLAG_REGISTERED 0
+#define ELEVATOR_FLAG_DISABLE_WBT 1

/*
* block elevator interface
--
2.31.1

2022-10-23 02:52:09

by Yu Kuai

[permalink] [raw]
Subject: Re: [PATCH v5 0/6] blk-wbt: simple improvment to enable wbt correctly

Hi, Jens

Can you apply this patchset?

Thanks,
Kuai

在 2022/10/19 20:15, Yu Kuai 写道:
> From: Yu Kuai <[email protected]>
>
> changes in v5:
> - code adjustment in patch 4, as suggested by Christoph.
> - add review tag by Christop.
>
> changes in v4:
> - remove patch 3 from v3
> - add patch 2,3 in v4
>
> changes in v3:
> - instead of check elevator name, add a flag in elevator_queue, as
> suggested by Christoph.
> - add patch 3 and patch 5 to this patchset.
>
> changes in v2:
> - define new api if wbt config is not enabled in patch 1.
>
> Yu Kuai (6):
> elevator: remove redundant code in elv_unregister_queue()
> blk-wbt: remove unnecessary check in wbt_enable_default()
> blk-wbt: make enable_state more accurate
> blk-wbt: don't show valid wbt_lat_usec in sysfs while wbt is disabled
> elevator: add new field flags in struct elevator_queue
> blk-wbt: don't enable throttling if default elevator is bfq
>
> block/bfq-iosched.c | 2 ++
> block/blk-sysfs.c | 3 +++
> block/blk-wbt.c | 26 ++++++++++++++++++++++----
> block/blk-wbt.h | 17 ++++++++++++-----
> block/elevator.c | 8 ++------
> block/elevator.h | 5 ++++-
> 6 files changed, 45 insertions(+), 16 deletions(-)
>

2022-10-23 04:34:16

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH v5 0/6] blk-wbt: simple improvment to enable wbt correctly

On Wed, 19 Oct 2022 20:15:12 +0800, Yu Kuai wrote:
> From: Yu Kuai <[email protected]>
>
> changes in v5:
> - code adjustment in patch 4, as suggested by Christoph.
> - add review tag by Christop.
>
> changes in v4:
> - remove patch 3 from v3
> - add patch 2,3 in v4
>
> [...]

Applied, thanks!

[1/6] elevator: remove redundant code in elv_unregister_queue()
commit: 4321c1ad4abe05fb3683745ed52d0ca17918d537
[2/6] blk-wbt: remove unnecessary check in wbt_enable_default()
commit: e2c2a27a4fef0af09bfb50c017d1d1962aa8784b
[3/6] blk-wbt: make enable_state more accurate
commit: 563ee8c7ebfa01d43fa9a785c562318b3f6a587b
[4/6] blk-wbt: don't show valid wbt_lat_usec in sysfs while wbt is disabled
commit: a66d2566505c819261591fb2462a99069c43db55
[5/6] elevator: add new field flags in struct elevator_queue
commit: dd58a3a032d5b53571e9934b23a4ceae7b158db0
[6/6] blk-wbt: don't enable throttling if default elevator is bfq
commit: b192851f14d980f8ce794e747adc4a2418527a75

Best regards,
--
Jens Axboe