This patch adds a new proc entry to show discard_plist
information in more detail, which is very helpful to
know the discard pend list count clearly.

Such as:

Discard pending list(Show diacrd command count on each entry):
0                4943         138          66          29          21           
9           8          12
8                   4           7           4           6           3           
2           0           1
16                  1           2           2           0           0           
1           0           0
24                  0           1           1           0           0           
1           1           0
32                  0           1           0           0           0           
0           0           0
......

Signed-off-by: Yangtao Li <[email protected]>
---
 fs/f2fs/f2fs.h    |  1 +
 fs/f2fs/segment.c | 22 ++++++++++++++++------
 fs/f2fs/sysfs.c   | 29 +++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 04ef4cce3d7f..a0226c970cbc 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -405,6 +405,7 @@ struct discard_cmd_control {
        wait_queue_head_t discard_wait_queue;   /* waiting queue for wake-up */
        unsigned int discard_wake;              /* to wake up discard thread */
        struct mutex cmd_lock;
+       unsigned int nr_pending[MAX_PLIST_NUM]; /* # of pending discards */
        unsigned int nr_discards;               /* # of discards in the list */
        unsigned int max_discards;              /* max. discards to be issued */
        unsigned int max_discard_request;       /* max. discard request per 
round */
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index aa4be7f25963..72e60d5ee70f 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -921,6 +921,7 @@ static struct discard_cmd *__create_discard_cmd(struct 
f2fs_sb_info *sbi,
        dc->bio_ref = 0;
        atomic_inc(&dcc->discard_cmd_cnt);
        dcc->undiscard_blks += len;
+       dcc->nr_pending[plist_idx(len)]++;
 
        return dc;
 }
@@ -1169,6 +1170,7 @@ static int __submit_discard_cmd(struct f2fs_sb_info *sbi,
                submit_bio(bio);
 
                atomic_inc(&dcc->issued_discard);
+               dcc->nr_pending[plist_idx(len)]--;
 
                f2fs_update_iostat(sbi, NULL, FS_DISCARD, 1);
 
@@ -1210,9 +1212,11 @@ static void __insert_discard_tree(struct f2fs_sb_info 
*sbi,
 }
 
 static void __relocate_discard_cmd(struct discard_cmd_control *dcc,
-                                               struct discard_cmd *dc)
+                                               struct discard_cmd *dc, 
unsigned int index)
 {
        list_move_tail(&dc->list, &dcc->pend_list[plist_idx(dc->len)]);
+       dcc->nr_pending[plist_idx(dc->len)]++;
+       dcc->nr_pending[index]--;
 }
 
 static void __punch_discard_cmd(struct f2fs_sb_info *sbi,
@@ -1230,9 +1234,10 @@ static void __punch_discard_cmd(struct f2fs_sb_info *sbi,
        dcc->undiscard_blks -= di.len;
 
        if (blkaddr > di.lstart) {
+               block_t old_len = dc->len;
                dc->len = blkaddr - dc->lstart;
                dcc->undiscard_blks += dc->len;
-               __relocate_discard_cmd(dcc, dc);
+               __relocate_discard_cmd(dcc, dc, plist_idx(old_len));
                modified = true;
        }
 
@@ -1243,11 +1248,12 @@ static void __punch_discard_cmd(struct f2fs_sb_info 
*sbi,
                                        di.lstart + di.len - 1 - blkaddr,
                                        NULL, NULL);
                } else {
+                       block_t old_len = dc->len;
                        dc->lstart++;
                        dc->len--;
                        dc->start++;
                        dcc->undiscard_blks += dc->len;
-                       __relocate_discard_cmd(dcc, dc);
+                       __relocate_discard_cmd(dcc, dc, plist_idx(old_len));
                }
        }
 }
@@ -1306,9 +1312,10 @@ static void __update_discard_tree_range(struct 
f2fs_sb_info *sbi,
                        prev_dc->bdev == bdev &&
                        __is_discard_back_mergeable(&di, &prev_dc->di,
                                                        max_discard_blocks)) {
+                       block_t old_len = prev_dc->di.len;
                        prev_dc->di.len += di.len;
                        dcc->undiscard_blks += di.len;
-                       __relocate_discard_cmd(dcc, prev_dc);
+                       __relocate_discard_cmd(dcc, prev_dc, 
plist_idx(old_len));
                        di = prev_dc->di;
                        tdc = prev_dc;
                        merged = true;
@@ -1318,13 +1325,16 @@ static void __update_discard_tree_range(struct 
f2fs_sb_info *sbi,
                        next_dc->bdev == bdev &&
                        __is_discard_front_mergeable(&di, &next_dc->di,
                                                        max_discard_blocks)) {
+                       block_t old_len = next_dc->di.len;
                        next_dc->di.lstart = di.lstart;
                        next_dc->di.len += di.len;
                        next_dc->di.start = di.start;
                        dcc->undiscard_blks += di.len;
-                       __relocate_discard_cmd(dcc, next_dc);
-                       if (tdc)
+                       __relocate_discard_cmd(dcc, next_dc, 
plist_idx(old_len));
+                       if (tdc) {
+                               dcc->nr_pending[plist_idx(tdc->len)]--;
                                __remove_discard_cmd(sbi, tdc);
+                       }
                        merged = true;
                }
 
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 032c03e09580..2176553f97c9 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -1252,6 +1252,32 @@ static int __maybe_unused victim_bits_seq_show(struct 
seq_file *seq,
        return 0;
 }
 
+static int __maybe_unused discard_plist_seq_show(struct seq_file *seq,
+                                               void *offset)
+{
+       struct super_block *sb = seq->private;
+       struct f2fs_sb_info *sbi = F2FS_SB(sb);
+       struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+       int i;
+
+       seq_puts(seq, "Discard pending list(Show diacrd command count on each 
entry):\n");
+       if (!f2fs_realtime_discard_enable(sbi))
+               return 0;
+
+       for (i = 0; i < MAX_PLIST_NUM; i++) {
+               if (i % 8 == 0)
+                       seq_printf(seq, "%-10d", i);
+               seq_printf(seq, " %10d", dcc->nr_pending[i]);
+               if (i % 8 == 7)
+                       seq_putc(seq, '\n');
+               else
+                       seq_putc(seq, ' ');
+       }
+       seq_putc(seq, '\n');
+
+       return 0;
+}
+
 int __init f2fs_init_sysfs(void)
 {
        int ret;
@@ -1322,6 +1348,8 @@ int f2fs_register_sysfs(struct f2fs_sb_info *sbi)
 #endif
                proc_create_single_data("victim_bits", 0444, sbi->s_proc,
                                victim_bits_seq_show, sb);
+               proc_create_single_data("discard_plist", 0444, sbi->s_proc,
+                               discard_plist_seq_show, sb);
        }
        return 0;
 put_feature_list_kobj:
@@ -1345,6 +1373,7 @@ void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi)
                remove_proc_entry("segment_info", sbi->s_proc);
                remove_proc_entry("segment_bits", sbi->s_proc);
                remove_proc_entry("victim_bits", sbi->s_proc);
+               remove_proc_entry("discard_plist", sbi->s_proc);
                remove_proc_entry(sbi->sb->s_id, f2fs_proc_root);
        }
 
-- 
2.25.1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to