f2fs: add proc entry to show discard_plist info
authorYangtao Li <frank.li@vivo.com>
Tue, 25 Oct 2022 13:26:38 +0000 (21:26 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 11 Nov 2022 17:48:24 +0000 (09:48 -0800)
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 pend list(Show diacrd_cmd count on each entry, .:not exist):
  0       390     156      85      67      46      37      26      14
  8        17      12       9       9       6      12      11      10
  16        5       9       2       4       8       3       4       1
  24        3       2       2       5       2       4       5       4
  32        3       3       2       3       .       3       3       1
  40        .       4       1       3       2       1       2       1
  48        1       .       1       1       .       1       1       .
  56        .       1       1       1       .       2       .       1
  64        1       2       .       .       .       .       .       .
  72        .       1       .       .       .       .       .       .
  80        3       1       .       .       1       1       .       .
  88        1       .       .       .       1       .       .       1
......

Signed-off-by: Yangtao Li <frank.li@vivo.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/sysfs.c

index 032c03e09580d6d94d412a5d3785545c52612308..97bf0dbb0974b2c6510b915ecc15b6acb130fb31 100644 (file)
@@ -1252,6 +1252,44 @@ 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, count;
+
+       seq_puts(seq, "Discard pend list(Show diacrd_cmd count on each entry, .:not exist):\n");
+       if (!f2fs_realtime_discard_enable(sbi))
+               return 0;
+
+       if (dcc) {
+               mutex_lock(&dcc->cmd_lock);
+               for (i = 0; i < MAX_PLIST_NUM; i++) {
+                       struct list_head *pend_list;
+                       struct discard_cmd *dc, *tmp;
+
+                       if (i % 8 == 0)
+                               seq_printf(seq, "  %-3d", i);
+                       count = 0;
+                       pend_list = &dcc->pend_list[i];
+                       list_for_each_entry_safe(dc, tmp, pend_list, list)
+                               count++;
+                       if (count)
+                               seq_printf(seq, " %7d", count);
+                       else
+                               seq_puts(seq, "       .");
+                       if (i % 8 == 7)
+                               seq_putc(seq, '\n');
+               }
+               seq_putc(seq, '\n');
+               mutex_unlock(&dcc->cmd_lock);
+       }
+
+       return 0;
+}
+
 int __init f2fs_init_sysfs(void)
 {
        int ret;
@@ -1322,6 +1360,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_info", 0444, sbi->s_proc,
+                               discard_plist_seq_show, sb);
        }
        return 0;
 put_feature_list_kobj:
@@ -1345,6 +1385,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_info", sbi->s_proc);
                remove_proc_entry(sbi->sb->s_id, f2fs_proc_root);
        }