Currently f2fs stats are only available from /d/f2fs/status. This patch
adds some of the f2fs stats to sysfs so that they are accessible even
when debugfs is not mounted.

The following sysfs nodes are added:
-/sys/fs/f2fs/<disk>/free_segments
-/sys/fs/f2fs/<disk>/cp_foreground_calls
-/sys/fs/f2fs/<disk>/cp_background_calls
-/sys/fs/f2fs/<disk>/gc_foreground_calls
-/sys/fs/f2fs/<disk>/gc_background_calls
-/sys/fs/f2fs/<disk>/moved_blocks_foreground
-/sys/fs/f2fs/<disk>/moved_blocks_background
-/sys/fs/f2fs/<disk>/avg_vblocks

Signed-off-by: Hridya Valsaraju <[email protected]>
---
 Documentation/ABI/testing/sysfs-fs-f2fs |  47 +++++++++++
 fs/f2fs/debug.c                         |   2 +-
 fs/f2fs/f2fs.h                          |   2 +
 fs/f2fs/sysfs.c                         | 103 ++++++++++++++++++++++++
 4 files changed, 153 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs 
b/Documentation/ABI/testing/sysfs-fs-f2fs
index 8f79a9acefcf..ba4fadf4b78f 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -253,3 +253,50 @@ Contact:   "Daniel Rosenberg" <[email protected]>
 Description:   If checkpoint=disable, it displays the number of blocks that 
are unusable.
                If checkpoint=enable it displays the enumber of blocks that 
would be unusable
                if checkpoint=disable were to be set.
+
+What:          /sys/fs/f2fs/<disk>/free_segments
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of free segments in disk.
+
+What:          /sys/fs/f2fs/<disk>/cp_foreground_calls
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of checkpoint operations performed on demand. Available 
when
+               CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/cp_background_calls
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of checkpoint operations performed in the background to
+               free segments. Available when CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/gc_foreground_calls
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of garbage collection operations performed on demand.
+               Available when CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/gc_background_calls
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of garbage collection operations triggered in background.
+               Available when CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/moved_blocks_foreground
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of blocks moved by garbage collection in foreground.
+               Available when CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/moved_blocks_background
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Number of blocks moved by garbage collection in background.
+               Available when CONFIG_F2FS_STAT_FS=y.
+
+What:          /sys/fs/f2fs/<disk>/avg_vblocks
+Date:          September 2019
+Contact:       "Hridya Valsaraju" <[email protected]>
+Description:   Average number of valid blocks.
+               Available when CONFIG_F2FS_STAT_FS=y.
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
index 7706049d23bf..75ecebf7f168 100644
--- a/fs/f2fs/debug.c
+++ b/fs/f2fs/debug.c
@@ -148,7 +148,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
 /*
  * This function calculates BDF of every segments
  */
-static void update_sit_info(struct f2fs_sb_info *sbi)
+void update_sit_info(struct f2fs_sb_info *sbi)
 {
        struct f2fs_stat_info *si = F2FS_STAT(sbi);
        unsigned long long blks_per_sec, hblks_per_sec, total_vblocks;
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 17382da7f0bd..fffce57755e4 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -3391,6 +3391,7 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi);
 void f2fs_destroy_stats(struct f2fs_sb_info *sbi);
 void __init f2fs_create_root_stats(void);
 void f2fs_destroy_root_stats(void);
+void update_sit_info(struct f2fs_sb_info *sbi);
 #else
 #define stat_inc_cp_count(si)                          do { } while (0)
 #define stat_inc_bg_cp_count(si)                       do { } while (0)
@@ -3429,6 +3430,7 @@ static inline int f2fs_build_stats(struct f2fs_sb_info 
*sbi) { return 0; }
 static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
 static inline void __init f2fs_create_root_stats(void) { }
 static inline void f2fs_destroy_root_stats(void) { }
+static inline void update_sit_info(struct f2fs_sb_info *sbi) {}
 #endif
 
 extern const struct file_operations f2fs_dir_operations;
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 3aeacd0aacfd..c1d111abe5f2 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -24,6 +24,9 @@ enum {
        DCC_INFO,       /* struct discard_cmd_control */
        NM_INFO,        /* struct f2fs_nm_info */
        F2FS_SBI,       /* struct f2fs_sb_info */
+#ifdef CONFIG_F2FS_STAT_FS
+       STAT_INFO,      /* struct f2fs_stat_info */
+#endif
 #ifdef CONFIG_F2FS_FAULT_INJECTION
        FAULT_INFO_RATE,        /* struct f2fs_fault_info */
        FAULT_INFO_TYPE,        /* struct f2fs_fault_info */
@@ -41,6 +44,9 @@ struct f2fs_attr {
        int id;
 };
 
+static ssize_t f2fs_sbi_show(struct f2fs_attr *a,
+                            struct f2fs_sb_info *sbi, char *buf);
+
 static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type)
 {
        if (struct_type == GC_THREAD)
@@ -57,10 +63,89 @@ static unsigned char *__struct_ptr(struct f2fs_sb_info 
*sbi, int struct_type)
        else if (struct_type == FAULT_INFO_RATE ||
                                        struct_type == FAULT_INFO_TYPE)
                return (unsigned char *)&F2FS_OPTION(sbi).fault_info;
+#endif
+#ifdef CONFIG_F2FS_STAT_FS
+       else if (struct_type == STAT_INFO)
+               return (unsigned char *)F2FS_STAT(sbi);
 #endif
        return NULL;
 }
 
+static ssize_t free_segments_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       return sprintf(buf, "%llu\n", (unsigned long long)(free_segments(sbi)));
+}
+
+#ifdef CONFIG_F2FS_STAT_FS
+
+#define F2FS_STAT_ATTR(_struct_type, _struct_name, _name, _elname)     \
+static struct f2fs_attr f2fs_attr_##_name = {                  \
+       .attr = {.name = __stringify(_name), .mode = 0444 },    \
+       .show = f2fs_sbi_show,                                  \
+       .struct_type = _struct_type,                            \
+       .offset = offsetof(struct _struct_name, _elname),       \
+}
+
+F2FS_STAT_ATTR(STAT_INFO, f2fs_stat_info, cp_background_calls, bg_cp_count);
+F2FS_STAT_ATTR(STAT_INFO, f2fs_stat_info, gc_background_calls, bg_gc);
+
+static ssize_t cp_foreground_calls_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si;
+
+       si = F2FS_STAT(sbi);
+       return sprintf(buf, "%llu\n",
+                      (unsigned long long)(si->cp_count - si->bg_cp_count));
+}
+
+static ssize_t gc_foreground_calls_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si;
+
+       si = F2FS_STAT(sbi);
+       return sprintf(buf, "%llu\n",
+                      (unsigned long long)(si->call_count - si->bg_gc));
+}
+
+static ssize_t moved_blocks_foreground_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si;
+
+       si = F2FS_STAT(sbi);
+       return sprintf(buf, "%llu\n",
+                      (unsigned long long)(si->tot_blks -
+                                           (si->bg_data_blks +
+                                            si->bg_node_blks)));
+}
+
+static ssize_t moved_blocks_background_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si;
+
+       si = F2FS_STAT(sbi);
+       return sprintf(buf, "%llu\n",
+                      (unsigned long long)(si->bg_data_blks +
+                                           si->bg_node_blks));
+}
+
+static ssize_t avg_vblocks_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si;
+
+       si = F2FS_STAT(sbi);
+       si->dirty_count = dirty_segments(sbi);
+       update_sit_info(sbi);
+       return sprintf(buf, "%llu\n",
+                      (unsigned long long)(si->avg_vblocks));
+}
+#endif
+
 static ssize_t dirty_segments_show(struct f2fs_attr *a,
                struct f2fs_sb_info *sbi, char *buf)
 {
@@ -451,6 +536,14 @@ F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, 
inject_rate, inject_rate);
 F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
 #endif
 F2FS_GENERAL_RO_ATTR(dirty_segments);
+F2FS_GENERAL_RO_ATTR(free_segments);
+#ifdef CONFIG_F2FS_STAT_FS
+F2FS_GENERAL_RO_ATTR(cp_foreground_calls);
+F2FS_GENERAL_RO_ATTR(gc_foreground_calls);
+F2FS_GENERAL_RO_ATTR(moved_blocks_background);
+F2FS_GENERAL_RO_ATTR(moved_blocks_foreground);
+F2FS_GENERAL_RO_ATTR(avg_vblocks);
+#endif
 F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes);
 F2FS_GENERAL_RO_ATTR(features);
 F2FS_GENERAL_RO_ATTR(current_reserved_blocks);
@@ -515,6 +608,16 @@ static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(features),
        ATTR_LIST(reserved_blocks),
        ATTR_LIST(current_reserved_blocks),
+       ATTR_LIST(free_segments),
+#ifdef CONFIG_F2FS_STAT_FS
+       ATTR_LIST(cp_foreground_calls),
+       ATTR_LIST(cp_background_calls),
+       ATTR_LIST(gc_foreground_calls),
+       ATTR_LIST(gc_background_calls),
+       ATTR_LIST(moved_blocks_foreground),
+       ATTR_LIST(moved_blocks_background),
+       ATTR_LIST(avg_vblocks),
+#endif
        NULL,
 };
 ATTRIBUTE_GROUPS(f2fs);
-- 
2.23.0.866.gb869b98d4c-goog



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

Reply via email to