On Mon, Sep 15, 2014 at 11:13:15AM +0900, Changman Lee wrote: > Hi JK, > > I think it' nicer if this can be used as 'OR' with other policy > together. If so, we can also cover the weakness in high utilization. Agreed. I'll send another patch for that. Thanks, > > Regard, > Changman > > On Sun, Sep 14, 2014 at 03:14:18PM -0700, Jaegeuk Kim wrote: > > If user wrote F2FS_IPU_FSYNC:4 in /sys/fs/f2fs/ipu_policy, f2fs_sync_file > > only starts to try in-place-updates. > > And, if the number of dirty pages is over /sys/fs/f2fs/min_fsync_blocks, it > > keeps out-of-order manner. Otherwise, it triggers in-place-updates. > > > > This may be used by storage showing very high random write performance. > > > > For example, it can be used when, > > > > Seq. writes (Data) + wait + Seq. writes (Node) > > > > is pretty much slower than, > > > > Rand. writes (Data) > > > > Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> > > --- > > Documentation/ABI/testing/sysfs-fs-f2fs | 7 +++++++ > > Documentation/filesystems/f2fs.txt | 9 ++++++++- > > fs/f2fs/f2fs.h | 1 + > > fs/f2fs/file.c | 7 +++---- > > fs/f2fs/segment.c | 3 ++- > > fs/f2fs/segment.h | 14 ++++++++++---- > > fs/f2fs/super.c | 2 ++ > > 7 files changed, 33 insertions(+), 10 deletions(-) > > > > diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs > > index 62dd725..6f9157f 100644 > > --- a/Documentation/ABI/testing/sysfs-fs-f2fs > > +++ b/Documentation/ABI/testing/sysfs-fs-f2fs > > @@ -44,6 +44,13 @@ Description: > > Controls the FS utilization condition for the in-place-update > > policies. > > > > +What: /sys/fs/f2fs/<disk>/min_fsync_blocks > > +Date: September 2014 > > +Contact: "Jaegeuk Kim" <jaegeuk@xxxxxxxxxx> > > +Description: > > + Controls the dirty page count condition for the in-place-update > > + policies. > > + > > What: /sys/fs/f2fs/<disk>/max_small_discards > > Date: November 2013 > > Contact: "Jaegeuk Kim" <jaegeuk.kim@xxxxxxxxxxx> > > diff --git a/Documentation/filesystems/f2fs.txt b/Documentation/filesystems/f2fs.txt > > index a2046a7..d010da8 100644 > > --- a/Documentation/filesystems/f2fs.txt > > +++ b/Documentation/filesystems/f2fs.txt > > @@ -194,13 +194,20 @@ Files in /sys/fs/f2fs/<devname> > > updates in f2fs. There are five policies: > > 0: F2FS_IPU_FORCE, 1: F2FS_IPU_SSR, > > 2: F2FS_IPU_UTIL, 3: F2FS_IPU_SSR_UTIL, > > - 4: F2FS_IPU_DISABLE. > > + 4: F2FS_IPU_FSYNC, 5: F2FS_IPU_DISABLE. > > > > min_ipu_util This parameter controls the threshold to trigger > > in-place-updates. The number indicates percentage > > of the filesystem utilization, and used by > > F2FS_IPU_UTIL and F2FS_IPU_SSR_UTIL policies. > > > > + min_fsync_blocks This parameter controls the threshold to trigger > > + in-place-updates when F2FS_IPU_FSYNC mode is set. > > + The number indicates the number of dirty pages > > + when fsync needs to flush on its call path. If > > + the number is less than this value, it triggers > > + in-place-updates. > > + > > max_victim_search This parameter controls the number of trials to > > find a victim segment when conducting SSR and > > cleaning operations. The default value is 4096 > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > > index 2756c16..4f84d2a 100644 > > --- a/fs/f2fs/f2fs.h > > +++ b/fs/f2fs/f2fs.h > > @@ -386,6 +386,7 @@ struct f2fs_sm_info { > > > > unsigned int ipu_policy; /* in-place-update policy */ > > unsigned int min_ipu_util; /* in-place-update threshold */ > > + unsigned int min_fsync_blocks; /* threshold for fsync */ > > > > /* for flush command control */ > > struct flush_cmd_control *cmd_control_info; > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > > index 77426c7..af06e22 100644 > > --- a/fs/f2fs/file.c > > +++ b/fs/f2fs/file.c > > @@ -154,12 +154,11 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) > > trace_f2fs_sync_file_enter(inode); > > > > /* if fdatasync is triggered, let's do in-place-update */ > > - if (datasync) > > + if (get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks) > > set_inode_flag(fi, FI_NEED_IPU); > > - > > ret = filemap_write_and_wait_range(inode->i_mapping, start, end); > > - if (datasync) > > - clear_inode_flag(fi, FI_NEED_IPU); > > + clear_inode_flag(fi, FI_NEED_IPU); > > + > > if (ret) { > > trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); > > return ret; > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > > index e158d63..c6f627b 100644 > > --- a/fs/f2fs/segment.c > > +++ b/fs/f2fs/segment.c > > @@ -1928,8 +1928,9 @@ int build_segment_manager(struct f2fs_sb_info *sbi) > > sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr); > > sm_info->rec_prefree_segments = sm_info->main_segments * > > DEF_RECLAIM_PREFREE_SEGMENTS / 100; > > - sm_info->ipu_policy = F2FS_IPU_DISABLE; > > + sm_info->ipu_policy = F2FS_IPU_FSYNC; > > sm_info->min_ipu_util = DEF_MIN_IPU_UTIL; > > + sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS; > > > > INIT_LIST_HEAD(&sm_info->discard_list); > > sm_info->nr_discards = 0; > > diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h > > index bed0dc9..013aed2 100644 > > --- a/fs/f2fs/segment.h > > +++ b/fs/f2fs/segment.h > > @@ -472,15 +472,20 @@ static inline int utilization(struct f2fs_sb_info *sbi) > > * F2FS_IPU_UTIL - if FS utilization is over threashold, > > * F2FS_IPU_SSR_UTIL - if SSR mode is activated and FS utilization is over > > * threashold, > > + * F2FS_IPU_FSYNC - activated in fsync path only for high performance flash > > + * storages. IPU will be triggered only if the # of dirty > > + * pages over min_fsync_blocks. > > * F2FS_IPUT_DISABLE - disable IPU. (=default option) > > */ > > #define DEF_MIN_IPU_UTIL 70 > > +#define DEF_MIN_FSYNC_BLOCKS 8 > > > > enum { > > F2FS_IPU_FORCE, > > F2FS_IPU_SSR, > > F2FS_IPU_UTIL, > > F2FS_IPU_SSR_UTIL, > > + F2FS_IPU_FSYNC, > > F2FS_IPU_DISABLE, > > }; > > > > @@ -492,10 +497,6 @@ static inline bool need_inplace_update(struct inode *inode) > > if (S_ISDIR(inode->i_mode)) > > return false; > > > > - /* this is only set during fdatasync */ > > - if (is_inode_flag_set(F2FS_I(inode), FI_NEED_IPU)) > > - return true; > > - > > switch (SM_I(sbi)->ipu_policy) { > > case F2FS_IPU_FORCE: > > return true; > > @@ -511,6 +512,11 @@ static inline bool need_inplace_update(struct inode *inode) > > if (need_SSR(sbi) && utilization(sbi) > SM_I(sbi)->min_ipu_util) > > return true; > > break; > > + case F2FS_IPU_FSYNC: > > + /* this is only set during fdatasync */ > > + if (is_inode_flag_set(F2FS_I(inode), FI_NEED_IPU)) > > + return true; > > + break; > > case F2FS_IPU_DISABLE: > > break; > > } > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > > index b5af9be..ed4095e 100644 > > --- a/fs/f2fs/super.c > > +++ b/fs/f2fs/super.c > > @@ -190,6 +190,7 @@ F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments); > > F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, max_small_discards, max_discards); > > 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(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search); > > F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level); > > @@ -204,6 +205,7 @@ static struct attribute *f2fs_attrs[] = { > > ATTR_LIST(max_small_discards), > > ATTR_LIST(ipu_policy), > > ATTR_LIST(min_ipu_util), > > + ATTR_LIST(min_fsync_blocks), > > ATTR_LIST(max_victim_search), > > ATTR_LIST(dir_level), > > ATTR_LIST(ram_thresh), > > -- > > 1.8.5.2 (Apple Git-48) > > > > > > ------------------------------------------------------------------------------ > > Want excitement? > > Manually upgrade your production database. > > When you want reliability, choose Perforce > > Perforce version control. Predictably reliable. > > http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk > > _______________________________________________ > > 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