f2fs: export ra_nid_pages to sysfs
authorChao Yu <chao2.yu@samsung.com>
Mon, 12 Oct 2015 09:08:48 +0000 (17:08 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 12 Oct 2015 21:03:43 +0000 (14:03 -0700)
After finishing building free nid cache, we will try to readahead
asynchronously 4 more pages for the next reloading, the count of
readahead nid pages is fixed.

In some case, like SMR drive, read less sectors with fixed count
each time we trigger RA may be low efficient, since we will face
high seeking overhead, so we'd better let user to configure this
parameter from sysfs in specific workload.

Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Documentation/ABI/testing/sysfs-fs-f2fs
fs/f2fs/f2fs.h
fs/f2fs/node.c
fs/f2fs/node.h
fs/f2fs/super.c

index e066281dfd4e3cb88128ca222a330eb8a7d585e5..0345f2d1c7278ffebb1406c2b6ecf10fb7f430ff 100644 (file)
@@ -86,3 +86,9 @@ Date:         October 2015
 Contact:       "Jaegeuk Kim" <jaegeuk@kernel.org>
 Description:
                 Controls the checkpoint timing.
+
+What:          /sys/fs/f2fs/<disk>/ra_nid_pages
+Date:          October 2015
+Contact:       "Chao Yu" <chao2.yu@samsung.com>
+Description:
+                Controls the count of nid pages to be readaheaded.
index 5f372c03de325b3013e621c28c8eb9918efac1c2..94cf6bc1303fca49da876260b738c335e3a40c72 100644 (file)
@@ -510,6 +510,7 @@ struct f2fs_nm_info {
        nid_t available_nids;           /* maximum available node ids */
        nid_t next_scan_nid;            /* the next nid to be scanned */
        unsigned int ram_thresh;        /* control the memory footprint */
+       unsigned int ra_nid_pages;      /* # of nid pages to be readaheaded */
 
        /* NAT cache management */
        struct radix_tree_root nat_root;/* root of the nat entry cache */
index 14f46067817ad2e7c7d80d90c33afcbd8e67fb83..7bcbc6e9c40d4fde4f65c230809d173aba11249e 100644 (file)
@@ -1562,7 +1562,7 @@ static void build_free_nids(struct f2fs_sb_info *sbi)
        mutex_unlock(&curseg->curseg_mutex);
 
        ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nm_i->next_scan_nid),
-                                       FREE_NID_PAGES, META_NAT, false);
+                                       nm_i->ra_nid_pages, META_NAT, false);
 }
 
 /*
@@ -2005,6 +2005,7 @@ static int init_node_manager(struct f2fs_sb_info *sbi)
        nm_i->fcnt = 0;
        nm_i->nat_cnt = 0;
        nm_i->ram_thresh = DEF_RAM_THRESHOLD;
+       nm_i->ra_nid_pages = DEF_RA_NID_PAGES;
 
        INIT_RADIX_TREE(&nm_i->free_nid_root, GFP_ATOMIC);
        INIT_LIST_HEAD(&nm_i->free_nid_list);
index 7427e956ad81431be9e890354b7535d9a366575e..e4fffd2d98c4b99f88a64e447395fe3f907d6dbc 100644 (file)
 /* node block offset on the NAT area dedicated to the given start node id */
 #define        NAT_BLOCK_OFFSET(start_nid) (start_nid / NAT_ENTRY_PER_BLOCK)
 
-/* # of pages to perform readahead before building free nids */
+/* # of pages to perform synchronous readahead before building free nids */
 #define FREE_NID_PAGES 4
 
+#define DEF_RA_NID_PAGES       4       /* # of nid pages to be readaheaded */
+
 /* maximum readahead size for node during getting data blocks */
 #define MAX_RA_NODE            128
 
index cb23d85a4ed3dfa69ac47b9441a0535f93878cf6..3a65e013235283e2b0fd1f8e6afe6790b0af41a6 100644 (file)
@@ -213,6 +213,7 @@ F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy);
 F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util);
 F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_fsync_blocks, min_fsync_blocks);
 F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ram_thresh, ram_thresh);
+F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ra_nid_pages, ra_nid_pages);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, cp_interval);
@@ -232,6 +233,7 @@ static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(max_victim_search),
        ATTR_LIST(dir_level),
        ATTR_LIST(ram_thresh),
+       ATTR_LIST(ra_nid_pages),
        ATTR_LIST(cp_interval),
        NULL,
 };