f2fs: control not to exceed # of cached nat entries
authorJaegeuk Kim <jaegeuk@kernel.org>
Thu, 2 Jun 2016 22:24:24 +0000 (15:24 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 7 Jun 2016 17:18:08 +0000 (10:18 -0700)
This is to avoid cache entry management overhead including radix tree.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/node.c
fs/f2fs/node.h
fs/f2fs/segment.c

index 16532b31dcd65ebc96898b3d8c0cab603c212683..b448c8fec7fc06ca8838f1e235698dac3e5dc30c 100644 (file)
@@ -52,6 +52,10 @@ bool available_free_memory(struct f2fs_sb_info *sbi, int type)
                mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >>
                                                        PAGE_SHIFT;
                res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
+               if (excess_cached_nats(sbi))
+                       res = false;
+               if (nm_i->nat_cnt > DEF_NAT_CACHE_THRESHOLD)
+                       res = false;
        } else if (type == DIRTY_DENTS) {
                if (sbi->sb->s_bdi->wb.dirty_exceeded)
                        return false;
index 2c2a797e18a84ee10265d0d336a1b9f706f3c0bc..673ce926cf0903580e340e506a5158ee429e561a 100644 (file)
@@ -27,6 +27,8 @@
 
 /* control dirty nats ratio threshold (default: 10% over max nid count) */
 #define DEF_DIRTY_NAT_RATIO_THRESHOLD          10
+/* control total # of nats */
+#define DEF_NAT_CACHE_THRESHOLD                        100000
 
 /* vector size for gang look-up from nat cache that consists of radix tree */
 #define NATVEC_SIZE    64
@@ -126,6 +128,11 @@ static inline bool excess_dirty_nats(struct f2fs_sb_info *sbi)
                                        NM_I(sbi)->dirty_nats_ratio / 100;
 }
 
+static inline bool excess_cached_nats(struct f2fs_sb_info *sbi)
+{
+       return NM_I(sbi)->nat_cnt >= DEF_NAT_CACHE_THRESHOLD;
+}
+
 enum mem_type {
        FREE_NIDS,      /* indicates the free nid list */
        NAT_ENTRIES,    /* indicates the cached nat entry */
index 34a9159cf5ac3f3dfc4d6930e7e8ef542ce96a6f..9011bffd1dd0a39405fa018206b2220470aec1c0 100644 (file)
@@ -345,6 +345,11 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
 {
        if (!need)
                return;
+
+       /* balance_fs_bg is able to be pending */
+       if (excess_cached_nats(sbi))
+               f2fs_balance_fs_bg(sbi);
+
        /*
         * We should do GC or end up with checkpoint, if there are so many dirty
         * dir/node pages without enough free segments.