Modified stats collection to collect stats for all the writeback
contexts within a bdi.

Signed-off-by: Kundan Kumar <kundan.ku...@samsung.com>
Signed-off-by: Anuj Gupta <anuj2...@samsung.com>
---
 mm/backing-dev.c | 72 ++++++++++++++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 30 deletions(-)

diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 5479e2d34160..d416122e2914 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -50,6 +50,7 @@ struct wb_stats {
        unsigned long nr_written;
        unsigned long dirty_thresh;
        unsigned long wb_thresh;
+       unsigned long state;
 };
 
 static struct dentry *bdi_debug_root;
@@ -81,6 +82,7 @@ static void collect_wb_stats(struct wb_stats *stats,
        stats->nr_dirtied += wb_stat(wb, WB_DIRTIED);
        stats->nr_written += wb_stat(wb, WB_WRITTEN);
        stats->wb_thresh += wb_calc_thresh(wb, stats->dirty_thresh);
+       stats->state |= wb->state;
 }
 
 #ifdef CONFIG_CGROUP_WRITEBACK
@@ -89,22 +91,27 @@ static void bdi_collect_stats(struct backing_dev_info *bdi,
                              struct wb_stats *stats)
 {
        struct bdi_writeback *wb;
+       struct bdi_writeback_ctx *bdi_wb_ctx;
 
        rcu_read_lock();
-       list_for_each_entry_rcu(wb, &bdi->wb_ctx_arr[0]->wb_list, bdi_node) {
-               if (!wb_tryget(wb))
-                       continue;
+       for_each_bdi_wb_ctx(bdi, bdi_wb_ctx)
+               list_for_each_entry_rcu(wb, &bdi_wb_ctx->wb_list, bdi_node) {
+                       if (!wb_tryget(wb))
+                               continue;
 
-               collect_wb_stats(stats, wb);
-               wb_put(wb);
-       }
+                       collect_wb_stats(stats, wb);
+                       wb_put(wb);
+               }
        rcu_read_unlock();
 }
 #else
 static void bdi_collect_stats(struct backing_dev_info *bdi,
                              struct wb_stats *stats)
 {
-       collect_wb_stats(stats, &bdi->wb_ctx_arr[0]->wb);
+       struct bdi_writeback_ctx *bdi_wb_ctx;
+
+       for_each_bdi_wb_ctx(bdi, bdi_wb_ctx)
+               collect_wb_stats(stats, &bdi_wb_ctx->wb);
 }
 #endif
 
@@ -150,7 +157,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
                   stats.nr_io,
                   stats.nr_more_io,
                   stats.nr_dirty_time,
-                  !list_empty(&bdi->bdi_list), bdi->wb_ctx_arr[0]->wb.state);
+                  !list_empty(&bdi->bdi_list), stats.state);
 
        return 0;
 }
@@ -195,35 +202,40 @@ static int cgwb_debug_stats_show(struct seq_file *m, void 
*v)
 {
        struct backing_dev_info *bdi = m->private;
        struct bdi_writeback *wb;
+       struct bdi_writeback_ctx *bdi_wb_ctx;
        unsigned long background_thresh;
        unsigned long dirty_thresh;
+       struct wb_stats stats;
 
        global_dirty_limits(&background_thresh, &dirty_thresh);
+       stats.dirty_thresh = dirty_thresh;
 
        rcu_read_lock();
-       list_for_each_entry_rcu(wb, &bdi->wb_ctx_arr[0]->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();
+       for_each_bdi_wb_ctx(bdi, bdi_wb_ctx) {
+               list_for_each_entry_rcu(wb, &bdi_wb_ctx->wb_list, bdi_node) {
+                       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);
                }
-
-               wb_stats_show(m, wb, &stats);
-
-               wb_put(wb);
        }
        rcu_read_unlock();
 
-- 
2.25.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to