On Sat, Nov 08, 2014 at 11:36:07PM -0800, Jaegeuk Kim wrote: > This patch adds to control the memory footprint used by ino entries. > This will conduct best effort, not strictly. > > Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> > --- > fs/f2fs/node.c | 28 ++++++++++++++++++++++------ > fs/f2fs/node.h | 3 ++- > fs/f2fs/segment.c | 3 ++- > 3 files changed, 26 insertions(+), 8 deletions(-) > > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index 44b8afe..4ea2c47 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -31,22 +31,38 @@ bool available_free_memory(struct f2fs_sb_info *sbi, int type) > { > struct f2fs_nm_info *nm_i = NM_I(sbi); > struct sysinfo val; > + unsigned long avail_ram; > unsigned long mem_size = 0; > bool res = false; > > si_meminfo(&val); > - /* give 25%, 25%, 50% memory for each components respectively */ > + > + /* only uses low memory */ > + avail_ram = val.totalram - val.totalhigh; > + > + /* give 25%, 25%, 50%, 50% memory for each components respectively */ Hi Jaegeuk, The memory usage of nm_i should be 100% but it's 125%. Mistake or intended? > if (type == FREE_NIDS) { > - mem_size = (nm_i->fcnt * sizeof(struct free_nid)) >> 12; > - res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2); > + mem_size = (nm_i->fcnt * sizeof(struct free_nid)) >> > + PAGE_CACHE_SHIFT; > + res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2); > } else if (type == NAT_ENTRIES) { > - mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >> 12; > - res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2); > + mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >> > + PAGE_CACHE_SHIFT; > + res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2); > } else if (type == DIRTY_DENTS) { > if (sbi->sb->s_bdi->dirty_exceeded) > return false; > mem_size = get_pages(sbi, F2FS_DIRTY_DENTS); > - res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 1); > + res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1); > + } else if (type == INO_ENTRIES) { > + int i; > + > + if (sbi->sb->s_bdi->dirty_exceeded) > + return false; > + for (i = 0; i <= UPDATE_INO; i++) > + mem_size += (sbi->ino_num[i] * sizeof(struct ino_entry)) > + >> PAGE_CACHE_SHIFT; > + res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1); > } > return res; > } > diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h > index acb71e5..d10b644 100644 > --- a/fs/f2fs/node.h > +++ b/fs/f2fs/node.h > @@ -106,7 +106,8 @@ static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne, > enum mem_type { > FREE_NIDS, /* indicates the free nid list */ > NAT_ENTRIES, /* indicates the cached nat entry */ > - DIRTY_DENTS /* indicates dirty dentry pages */ > + DIRTY_DENTS, /* indicates dirty dentry pages */ > + INO_ENTRIES, /* indicates inode entries */ > }; > > struct nat_entry_set { > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 16721b5d..e094675 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -276,7 +276,8 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) > { > /* check the # of cached NAT entries and prefree segments */ > if (try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK) || > - excess_prefree_segs(sbi)) > + excess_prefree_segs(sbi) || > + available_free_memory(sbi, INO_ENTRIES)) > f2fs_sync_fs(sbi->sb, true); > } > > -- > 2.1.1 > > > ------------------------------------------------------------------------------ > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html