Add /sys/kernel/debug/bdi/xxx/wb_stats to show per group writeback stats
of bdi.
Following domain hierarchy is tested:
global domain (320G)
/ \
cgroup domain1(10G) cgroup domain2(10G)
| |
bdi wb1 wb2
/* per wb writeback info of bdi is collected */
cat /sys/kernel/debug/bdi/252:16/wb_stats
WbCgIno: 1
WbWriteback: 0 kB
WbReclaimable: 0 kB
WbDirtyThresh: 0 kB
WbDirtied: 0 kB
WbWritten: 0 kB
WbWriteBandwidth: 102400 kBps
b_dirty: 0
b_io: 0
b_more_io: 0
b_dirty_time: 0
state: 1
WbCgIno: 4094
WbWriteback: 54432 kB
WbReclaimable: 766080 kB
WbDirtyThresh: 3094760 kB
WbDirtied: 1656480 kB
WbWritten: 837088 kB
WbWriteBandwidth: 132772 kBps
b_dirty: 1
b_io: 1
b_more_io: 0
b_dirty_time: 0
state: 7
WbCgIno: 4135
WbWriteback: 15232 kB
WbReclaimable: 786688 kB
WbDirtyThresh: 2909984 kB
WbDirtied: 1482656 kB
WbWritten: 681408 kB
WbWriteBandwidth: 124848 kBps
b_dirty: 0
b_io: 1
b_more_io: 0
b_dirty_time: 0
state: 7
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
---
include/linux/writeback.h | 1 +
mm/backing-dev.c | 78 ++++++++++++++++++++++++++++++++++++++-
mm/page-writeback.c | 19 ++++++++++
3 files changed, 96 insertions(+), 2 deletions(-)
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
index 9845cb62e40b..112d806ddbe4 100644
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -355,6 +355,7 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh);
+unsigned long cgwb_calc_thresh(struct bdi_writeback *wb);
void wb_update_bandwidth(struct bdi_writeback *wb);
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 089146feb830..6ecd11bdce6e 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -155,19 +155,93 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
}
DEFINE_SHOW_ATTRIBUTE(bdi_debug_stats);
+static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
+ struct wb_stats *stats)
+{
+
+ seq_printf(m,
+ "WbCgIno: %10lu\n"
+ "WbWriteback: %10lu kB\n"
+ "WbReclaimable: %10lu kB\n"
+ "WbDirtyThresh: %10lu kB\n"
+ "WbDirtied: %10lu kB\n"
+ "WbWritten: %10lu kB\n"
+ "WbWriteBandwidth: %10lu kBps\n"
+ "b_dirty: %10lu\n"
+ "b_io: %10lu\n"
+ "b_more_io: %10lu\n"
+ "b_dirty_time: %10lu\n"
+ "state: %10lx\n\n",
+ cgroup_ino(wb->memcg_css->cgroup),
+ K(stats->nr_writeback),
+ K(stats->nr_reclaimable),
+ K(stats->wb_thresh),
+ K(stats->nr_dirtied),
+ K(stats->nr_written),
+ K(wb->avg_write_bandwidth),
+ stats->nr_dirty,
+ stats->nr_io,
+ stats->nr_more_io,
+ stats->nr_dirty_time,
+ wb->state);
+}
+
+static int cgwb_debug_stats_show(struct seq_file *m, void *v)
+{
+ struct backing_dev_info *bdi = m->private;
+ unsigned long background_thresh;
+ unsigned long dirty_thresh;
+ struct bdi_writeback *wb;
+ struct wb_stats stats;
+
+ global_dirty_limits(&background_thresh, &dirty_thresh);
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) {
+ struct wb_stats stats = { .dirty_thresh = dirty_thresh };
+
+ if (!wb_tryget(wb))
+ continue;
+
+ collect_wb_stats(&stats, wb);
+
+ /*
+ * Calculate thresh of wb in writeback cgroup which is min of
+ * thresh in global domain and thresh in cgroup domain. Drop
+ * rcu lock because cgwb_calc_thresh may sleep in
+ * cgroup_rstat_flush. We can do so here because we have a ref.
+ */
+ if (mem_cgroup_wb_domain(wb)) {
+ rcu_read_unlock();
+ stats.wb_thresh = min(stats.wb_thresh, cgwb_calc_thresh(wb));
+ rcu_read_lock();
+ }
+
+ wb_stats_show(m, wb, &stats);
+
+ wb_put(wb);
+ }
+ rcu_read_unlock();
+
+ return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(cgwb_debug_stats);
+
static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
{
bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
debugfs_create_file("stats", 0444, bdi->debug_dir, bdi,
&bdi_debug_stats_fops);
+ debugfs_create_file("wb_stats", 0444, bdi->debug_dir, bdi,
+ &cgwb_debug_stats_fops);
}
static void bdi_debug_unregister(struct backing_dev_info *bdi)
{
debugfs_remove_recursive(bdi->debug_dir);
}
-#else
+#else /* CONFIG_DEBUG_FS */
static inline void bdi_debug_init(void)
{
}
@@ -178,7 +252,7 @@ static inline void bdi_debug_register(struct backing_dev_info *bdi,
static inline void bdi_debug_unregister(struct backing_dev_info *bdi)
{
}
-#endif
+#endif /* CONFIG_DEBUG_FS */
static ssize_t read_ahead_kb_store(struct device *dev,
struct device_attribute *attr,
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 3e19b87049db..3bb3bed102ef 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -892,6 +892,25 @@ unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh)
return __wb_calc_thresh(&gdtc);
}
+unsigned long cgwb_calc_thresh(struct bdi_writeback *wb)
+{
+ struct dirty_throttle_control gdtc = { GDTC_INIT_NO_WB };
+ struct dirty_throttle_control mdtc = { MDTC_INIT(wb, &gdtc) };
+ unsigned long filepages = 0, headroom = 0, writeback = 0;
+
+ gdtc.avail = global_dirtyable_memory();
+ gdtc.dirty = global_node_page_state(NR_FILE_DIRTY) +
+ global_node_page_state(NR_WRITEBACK);
+
+ mem_cgroup_wb_stats(wb, &filepages, &headroom,
+ &mdtc.dirty, &writeback);
+ mdtc.dirty += writeback;
+ mdtc_calc_avail(&mdtc, filepages, headroom);
+ domain_dirty_limits(&mdtc);
+
+ return __wb_calc_thresh(&mdtc);
+}
+
/*
* setpoint - dirty 3
* f(dirty) := 1.0 + (----------------)
--
2.30.0
Hi Kemeng,
On Tue, 23 Apr 2024 00:48:06 +0800 Kemeng Shi <shikemeng@huaweicloud.com> wrote:
> Add /sys/kernel/debug/bdi/xxx/wb_stats to show per group writeback stats
> of bdi.
>
> Following domain hierarchy is tested:
> global domain (320G)
> / \
> cgroup domain1(10G) cgroup domain2(10G)
> | |
> bdi wb1 wb2
>
> /* per wb writeback info of bdi is collected */
> cat /sys/kernel/debug/bdi/252:16/wb_stats
> WbCgIno: 1
> WbWriteback: 0 kB
> WbReclaimable: 0 kB
> WbDirtyThresh: 0 kB
> WbDirtied: 0 kB
> WbWritten: 0 kB
> WbWriteBandwidth: 102400 kBps
> b_dirty: 0
> b_io: 0
> b_more_io: 0
> b_dirty_time: 0
> state: 1
> WbCgIno: 4094
> WbWriteback: 54432 kB
> WbReclaimable: 766080 kB
> WbDirtyThresh: 3094760 kB
> WbDirtied: 1656480 kB
> WbWritten: 837088 kB
> WbWriteBandwidth: 132772 kBps
> b_dirty: 1
> b_io: 1
> b_more_io: 0
> b_dirty_time: 0
> state: 7
> WbCgIno: 4135
> WbWriteback: 15232 kB
> WbReclaimable: 786688 kB
> WbDirtyThresh: 2909984 kB
> WbDirtied: 1482656 kB
> WbWritten: 681408 kB
> WbWriteBandwidth: 124848 kBps
> b_dirty: 0
> b_io: 1
> b_more_io: 0
> b_dirty_time: 0
> state: 7
>
> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
> ---
> include/linux/writeback.h | 1 +
> mm/backing-dev.c | 78 ++++++++++++++++++++++++++++++++++++++-
> mm/page-writeback.c | 19 ++++++++++
> 3 files changed, 96 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/writeback.h b/include/linux/writeback.h
> index 9845cb62e40b..112d806ddbe4 100644
> --- a/include/linux/writeback.h
> +++ b/include/linux/writeback.h
> @@ -355,6 +355,7 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
>
> void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
> unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh);
> +unsigned long cgwb_calc_thresh(struct bdi_writeback *wb);
>
> void wb_update_bandwidth(struct bdi_writeback *wb);
>
> diff --git a/mm/backing-dev.c b/mm/backing-dev.c
> index 089146feb830..6ecd11bdce6e 100644
> --- a/mm/backing-dev.c
> +++ b/mm/backing-dev.c
> @@ -155,19 +155,93 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
> }
> DEFINE_SHOW_ATTRIBUTE(bdi_debug_stats);
>
> +static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
> + struct wb_stats *stats)
> +{
> +
> + seq_printf(m,
> + "WbCgIno: %10lu\n"
> + "WbWriteback: %10lu kB\n"
> + "WbReclaimable: %10lu kB\n"
> + "WbDirtyThresh: %10lu kB\n"
> + "WbDirtied: %10lu kB\n"
> + "WbWritten: %10lu kB\n"
> + "WbWriteBandwidth: %10lu kBps\n"
> + "b_dirty: %10lu\n"
> + "b_io: %10lu\n"
> + "b_more_io: %10lu\n"
> + "b_dirty_time: %10lu\n"
> + "state: %10lx\n\n",
> + cgroup_ino(wb->memcg_css->cgroup),
I'm getting below kunit build failure from the latest mm-unstable tree, and
'git bisect' points this patch.
ERROR:root:.../linux/mm/backing-dev.c: In function ‘wb_stats_show’:
.../linux/mm/backing-dev.c:175:20: error: implicit declaration of function ‘cgroup_ino’; did you mean ‘cgroup_init’? [-Werror=implicit-function-declaration]
175 | cgroup_ino(wb->memcg_css->cgroup),
| ^~~~~~~~~~
| cgroup_init
.../linux/mm/backing-dev.c:175:33: error: ‘struct bdi_writeback’ has no member named ‘memcg_css’
175 | cgroup_ino(wb->memcg_css->cgroup),
| ^~
The kunit build config is not having CONFIG_CGROUPS. I guess we need to check
the case? I confirmed below dumb change is fixing the issue, but I guess it
could be cleaner. May I ask your opinion?
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -160,7 +160,9 @@ static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
{
seq_printf(m,
+#ifdef CONFIG_CGROUPS
"WbCgIno: %10lu\n"
+#endif
"WbWriteback: %10lu kB\n"
"WbReclaimable: %10lu kB\n"
"WbDirtyThresh: %10lu kB\n"
@@ -172,7 +174,9 @@ static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
"b_more_io: %10lu\n"
"b_dirty_time: %10lu\n"
"state: %10lx\n\n",
+#ifdef CONFIG_CGROUPS
cgroup_ino(wb->memcg_css->cgroup),
+#endif
K(stats->nr_writeback),
K(stats->nr_reclaimable),
K(stats->wb_thresh),
> + K(stats->nr_writeback),
> + K(stats->nr_reclaimable),
> + K(stats->wb_thresh),
> + K(stats->nr_dirtied),
> + K(stats->nr_written),
> + K(wb->avg_write_bandwidth),
> + stats->nr_dirty,
> + stats->nr_io,
> + stats->nr_more_io,
> + stats->nr_dirty_time,
> + wb->state);
> +}
> +
> +static int cgwb_debug_stats_show(struct seq_file *m, void *v)
> +{
> + struct backing_dev_info *bdi = m->private;
> + unsigned long background_thresh;
> + unsigned long dirty_thresh;
> + struct bdi_writeback *wb;
> + struct wb_stats stats;
Kunit build also shows below warning:
.../linux/mm/backing-dev.c: In function ‘cgwb_debug_stats_show’:
.../linux/mm/backing-dev.c:195:25: warning: unused variable ‘stats’ [-Wunused-variable]
195 | struct wb_stats stats;
| ^~~~~
I guess above line can simply removed?
> +
> + global_dirty_limits(&background_thresh, &dirty_thresh);
> +
> + rcu_read_lock();
> + list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) {
> + struct wb_stats stats = { .dirty_thresh = dirty_thresh };
> +
> + if (!wb_tryget(wb))
> + continue;
> +
> + collect_wb_stats(&stats, wb);
> +
> + /*
> + * Calculate thresh of wb in writeback cgroup which is min of
> + * thresh in global domain and thresh in cgroup domain. Drop
> + * rcu lock because cgwb_calc_thresh may sleep in
> + * cgroup_rstat_flush. We can do so here because we have a ref.
> + */
> + if (mem_cgroup_wb_domain(wb)) {
> + rcu_read_unlock();
> + stats.wb_thresh = min(stats.wb_thresh, cgwb_calc_thresh(wb));
> + rcu_read_lock();
> + }
> +
> + wb_stats_show(m, wb, &stats);
> +
> + wb_put(wb);
> + }
> + rcu_read_unlock();
> +
> + return 0;
> +}
Thanks,
SJ
[...]
Hello
on 4/23/2024 8:44 AM, SeongJae Park wrote:
> Hi Kemeng,
>
> On Tue, 23 Apr 2024 00:48:06 +0800 Kemeng Shi <shikemeng@huaweicloud.com> wrote:
>
>> Add /sys/kernel/debug/bdi/xxx/wb_stats to show per group writeback stats
>> of bdi.
>>
>> Following domain hierarchy is tested:
>> global domain (320G)
>> / \
>> cgroup domain1(10G) cgroup domain2(10G)
>> | |
>> bdi wb1 wb2
>>
>> /* per wb writeback info of bdi is collected */
>> cat /sys/kernel/debug/bdi/252:16/wb_stats
>> WbCgIno: 1
>> WbWriteback: 0 kB
>> WbReclaimable: 0 kB
>> WbDirtyThresh: 0 kB
>> WbDirtied: 0 kB
>> WbWritten: 0 kB
>> WbWriteBandwidth: 102400 kBps
>> b_dirty: 0
>> b_io: 0
>> b_more_io: 0
>> b_dirty_time: 0
>> state: 1
>> WbCgIno: 4094
>> WbWriteback: 54432 kB
>> WbReclaimable: 766080 kB
>> WbDirtyThresh: 3094760 kB
>> WbDirtied: 1656480 kB
>> WbWritten: 837088 kB
>> WbWriteBandwidth: 132772 kBps
>> b_dirty: 1
>> b_io: 1
>> b_more_io: 0
>> b_dirty_time: 0
>> state: 7
>> WbCgIno: 4135
>> WbWriteback: 15232 kB
>> WbReclaimable: 786688 kB
>> WbDirtyThresh: 2909984 kB
>> WbDirtied: 1482656 kB
>> WbWritten: 681408 kB
>> WbWriteBandwidth: 124848 kBps
>> b_dirty: 0
>> b_io: 1
>> b_more_io: 0
>> b_dirty_time: 0
>> state: 7
>>
>> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
>> ---
>> include/linux/writeback.h | 1 +
>> mm/backing-dev.c | 78 ++++++++++++++++++++++++++++++++++++++-
>> mm/page-writeback.c | 19 ++++++++++
>> 3 files changed, 96 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/linux/writeback.h b/include/linux/writeback.h
>> index 9845cb62e40b..112d806ddbe4 100644
>> --- a/include/linux/writeback.h
>> +++ b/include/linux/writeback.h
>> @@ -355,6 +355,7 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
>>
>> void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
>> unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh);
>> +unsigned long cgwb_calc_thresh(struct bdi_writeback *wb);
>>
>> void wb_update_bandwidth(struct bdi_writeback *wb);
>>
>> diff --git a/mm/backing-dev.c b/mm/backing-dev.c
>> index 089146feb830..6ecd11bdce6e 100644
>> --- a/mm/backing-dev.c
>> +++ b/mm/backing-dev.c
>> @@ -155,19 +155,93 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
>> }
>> DEFINE_SHOW_ATTRIBUTE(bdi_debug_stats);
>>
>> +static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
>> + struct wb_stats *stats)
>> +{
>> +
>> + seq_printf(m,
>> + "WbCgIno: %10lu\n"
>> + "WbWriteback: %10lu kB\n"
>> + "WbReclaimable: %10lu kB\n"
>> + "WbDirtyThresh: %10lu kB\n"
>> + "WbDirtied: %10lu kB\n"
>> + "WbWritten: %10lu kB\n"
>> + "WbWriteBandwidth: %10lu kBps\n"
>> + "b_dirty: %10lu\n"
>> + "b_io: %10lu\n"
>> + "b_more_io: %10lu\n"
>> + "b_dirty_time: %10lu\n"
>> + "state: %10lx\n\n",
>> + cgroup_ino(wb->memcg_css->cgroup),
>
> I'm getting below kunit build failure from the latest mm-unstable tree, and
> 'git bisect' points this patch.
>
> ERROR:root:.../linux/mm/backing-dev.c: In function ‘wb_stats_show’:
> .../linux/mm/backing-dev.c:175:20: error: implicit declaration of function ‘cgroup_ino’; did you mean ‘cgroup_init’? [-Werror=implicit-function-declaration]
> 175 | cgroup_ino(wb->memcg_css->cgroup),
> | ^~~~~~~~~~
> | cgroup_init
> .../linux/mm/backing-dev.c:175:33: error: ‘struct bdi_writeback’ has no member named ‘memcg_css’
> 175 | cgroup_ino(wb->memcg_css->cgroup),
> | ^~
>
> The kunit build config is not having CONFIG_CGROUPS. I guess we need to check
> the case? I confirmed below dumb change is fixing the issue, but I guess it
> could be cleaner. May I ask your opinion?
Thanks for report the issue. As discussed before, we try to keep the same output
whether CGROUP is enable or not. So we'd better show cgroup number 0 for bdi->wb
instead remove cgroup number from output.
>
> --- a/mm/backing-dev.c
> +++ b/mm/backing-dev.c
> @@ -160,7 +160,9 @@ static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
> {
>
> seq_printf(m,
> +#ifdef CONFIG_CGROUPS
> "WbCgIno: %10lu\n"
> +#endif
> "WbWriteback: %10lu kB\n"
> "WbReclaimable: %10lu kB\n"
> "WbDirtyThresh: %10lu kB\n"
> @@ -172,7 +174,9 @@ static void wb_stats_show(struct seq_file *m, struct bdi_writeback *wb,
> "b_more_io: %10lu\n"
> "b_dirty_time: %10lu\n"
> "state: %10lx\n\n",
> +#ifdef CONFIG_CGROUPS
> cgroup_ino(wb->memcg_css->cgroup),
> +#endif
> K(stats->nr_writeback),
> K(stats->nr_reclaimable),
> K(stats->wb_thresh),
>
>
>> + K(stats->nr_writeback),
>> + K(stats->nr_reclaimable),
>> + K(stats->wb_thresh),
>> + K(stats->nr_dirtied),
>> + K(stats->nr_written),
>> + K(wb->avg_write_bandwidth),
>> + stats->nr_dirty,
>> + stats->nr_io,
>> + stats->nr_more_io,
>> + stats->nr_dirty_time,
>> + wb->state);
>> +}
>> +
>> +static int cgwb_debug_stats_show(struct seq_file *m, void *v)
>> +{
>> + struct backing_dev_info *bdi = m->private;
>> + unsigned long background_thresh;
>> + unsigned long dirty_thresh;
>> + struct bdi_writeback *wb;
>> + struct wb_stats stats;
>
> Kunit build also shows below warning:
>
> .../linux/mm/backing-dev.c: In function ‘cgwb_debug_stats_show’:
> .../linux/mm/backing-dev.c:195:25: warning: unused variable ‘stats’ [-Wunused-variable]
> 195 | struct wb_stats stats;
> | ^~~~~
>
> I guess above line can simply removed?
Yes, this could be simply removed.
I'd submit a new series to fix this very soon.
Thanks.
>
>> +
>> + global_dirty_limits(&background_thresh, &dirty_thresh);
>> +
>> + rcu_read_lock();
>> + list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) {
>> + struct wb_stats stats = { .dirty_thresh = dirty_thresh };
>> +
>> + if (!wb_tryget(wb))
>> + continue;
>> +
>> + collect_wb_stats(&stats, wb);
>> +
>> + /*
>> + * Calculate thresh of wb in writeback cgroup which is min of
>> + * thresh in global domain and thresh in cgroup domain. Drop
>> + * rcu lock because cgwb_calc_thresh may sleep in
>> + * cgroup_rstat_flush. We can do so here because we have a ref.
>> + */
>> + if (mem_cgroup_wb_domain(wb)) {
>> + rcu_read_unlock();
>> + stats.wb_thresh = min(stats.wb_thresh, cgwb_calc_thresh(wb));
>> + rcu_read_lock();
>> + }
>> +
>> + wb_stats_show(m, wb, &stats);
>> +
>> + wb_put(wb);
>> + }
>> + rcu_read_unlock();
>> +
>> + return 0;
>> +}
>
>
> Thanks,
> SJ
>
> [...]
>
Hello, On Tue, Apr 23, 2024 at 12:48:06AM +0800, Kemeng Shi wrote: > Add /sys/kernel/debug/bdi/xxx/wb_stats to show per group writeback stats > of bdi. > > Following domain hierarchy is tested: > global domain (320G) > / \ > cgroup domain1(10G) cgroup domain2(10G) > | | > bdi wb1 wb2 > > /* per wb writeback info of bdi is collected */ > cat /sys/kernel/debug/bdi/252:16/wb_stats > WbCgIno: 1 > WbWriteback: 0 kB > WbReclaimable: 0 kB > WbDirtyThresh: 0 kB > WbDirtied: 0 kB > WbWritten: 0 kB > WbWriteBandwidth: 102400 kBps > b_dirty: 0 > b_io: 0 > b_more_io: 0 > b_dirty_time: 0 > state: 1 > WbCgIno: 4094 > WbWriteback: 54432 kB > WbReclaimable: 766080 kB > WbDirtyThresh: 3094760 kB > WbDirtied: 1656480 kB > WbWritten: 837088 kB > WbWriteBandwidth: 132772 kBps > b_dirty: 1 > b_io: 1 > b_more_io: 0 > b_dirty_time: 0 > state: 7 > WbCgIno: 4135 > WbWriteback: 15232 kB > WbReclaimable: 786688 kB > WbDirtyThresh: 2909984 kB > WbDirtied: 1482656 kB > WbWritten: 681408 kB > WbWriteBandwidth: 124848 kBps > b_dirty: 0 > b_io: 1 > b_more_io: 0 > b_dirty_time: 0 > state: 7 > > Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Maybe it'd be useful to delineate each wb better in the output? It's a bit difficult to parse visually. Other than that, Acked-by: Tejun Heo <tj@kernel.org> Thanks. -- tejun
on 4/23/2024 2:32 AM, Tejun Heo wrote: > Hello, > > On Tue, Apr 23, 2024 at 12:48:06AM +0800, Kemeng Shi wrote: >> Add /sys/kernel/debug/bdi/xxx/wb_stats to show per group writeback stats >> of bdi. >> >> Following domain hierarchy is tested: >> global domain (320G) >> / \ >> cgroup domain1(10G) cgroup domain2(10G) >> | | >> bdi wb1 wb2 >> >> /* per wb writeback info of bdi is collected */ >> cat /sys/kernel/debug/bdi/252:16/wb_stats >> WbCgIno: 1 >> WbWriteback: 0 kB >> WbReclaimable: 0 kB >> WbDirtyThresh: 0 kB >> WbDirtied: 0 kB >> WbWritten: 0 kB >> WbWriteBandwidth: 102400 kBps >> b_dirty: 0 >> b_io: 0 >> b_more_io: 0 >> b_dirty_time: 0 >> state: 1 >> WbCgIno: 4094 >> WbWriteback: 54432 kB >> WbReclaimable: 766080 kB >> WbDirtyThresh: 3094760 kB >> WbDirtied: 1656480 kB >> WbWritten: 837088 kB >> WbWriteBandwidth: 132772 kBps >> b_dirty: 1 >> b_io: 1 >> b_more_io: 0 >> b_dirty_time: 0 >> state: 7 >> WbCgIno: 4135 >> WbWriteback: 15232 kB >> WbReclaimable: 786688 kB >> WbDirtyThresh: 2909984 kB >> WbDirtied: 1482656 kB >> WbWritten: 681408 kB >> WbWriteBandwidth: 124848 kBps >> b_dirty: 0 >> b_io: 1 >> b_more_io: 0 >> b_dirty_time: 0 >> state: 7 >> >> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> > > Maybe it'd be useful to delineate each wb better in the output? It's a bit > difficult to parse visually. Other than that, Sorry for this. A blank line was added at end of each wb in this patch but I forgot to update the changelog. As there is some kunit build problem reported, I will correct changelog with the fix to build problem. Thanks a lot for review. Kemeng > > Acked-by: Tejun Heo <tj@kernel.org> > > Thanks. >
© 2016 - 2026 Red Hat, Inc.