diff options
| author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-06-02 15:24:24 -0700 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-04-13 12:33:44 +0200 |
| commit | d8a895984e4de73fcbc4addeec2f39e80633f96c (patch) | |
| tree | b9753b9c4b8df35076cdca1eba946552628038f5 | |
| parent | 6c333eebdd9a955a8411f0586c66d954b2711f7a (diff) | |
f2fs: control not to exceed # of cached nat entries
This is to avoid cache entry management overhead including radix tree.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
| -rw-r--r-- | fs/f2fs/node.c | 4 | ||||
| -rw-r--r-- | fs/f2fs/node.h | 7 | ||||
| -rw-r--r-- | fs/f2fs/segment.c | 5 |
3 files changed, 16 insertions, 0 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 33c2d6c9c..da445f412 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -62,6 +62,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->dirty_exceeded) return false; diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h index 2c2a797e1..673ce926c 100644 --- a/fs/f2fs/node.h +++ b/fs/f2fs/node.h @@ -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 */ diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0406ca0e9..0b059c783 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -404,6 +404,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. |
