f2fs: don't split checkpoint in fstrim
Chao Yu
maintainerPATCH 1/1 f2fs: don't split checkpoint in fstrim
From: Chao Yu <[email protected]>
Now, we issue discard asynchronously in separated thread instead of in checkpoint, after that, we won't encounter long latency in checkpoint due to huge number of synchronous discard command handling, so, we don't need to split checkpoint to do trim in batch, merge it and obsolete related sysfs entry.
Signed-off-by Chao Yu <[email protected]>
--- Documentation/ABI/testing/sysfs-fs-f2fs | 1 + fs/f2fs/f2fs.h | 5 ----- fs/f2fs/segment.c | 33 +++++++++------------------------ fs/f2fs/sysfs.c | 3 +++ 4 files changed, 13 insertions(+), 29 deletions(-)
Documentation/ABI/testing/sysfs-fs-f2fs +1 -0
@@ -101,6 +101,7 @@ Date: February 2015 Contact: "Jaegeuk Kim" <[email protected]> Description: Controls the trimming rate in batch mode. + <deprecated> What: /sys/fs/f2fs/<disk>/cp_interval Date: October 2015
fs/f2fs/f2fs.h +0 -5
@@ -178,11 +178,6 @@ enum {#define CP_DISCARD 0x00000010#define CP_TRIMMED 0x00000020 -#define DEF_BATCHED_TRIM_SECTIONS 2048 -#define BATCHED_TRIM_SEGMENTS (sbi) \ - (GET_SEG_FROM_SEC(sbi, SM_I(sbi)->trim_sections)) -#define BATCHED_TRIM_BLOCKS (sbi) \ - (BATCHED_TRIM_SEGMENTS(sbi) << (sbi)->log_blocks_per_seg)#define MAX_DISCARD_BLOCKS (sbi) BLKS_PER_SEC(sbi)#define DEF_MAX_DISCARD_REQUEST 8/* issue 8 discards per round */ #define DEF_MIN_DISCARD_ISSUE_TIME 50/* 50 ms, if exists */
fs/f2fs/segment.c +9 -24
@@ -2450,30 +2450,17 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) cpc.reason =CP_DISCARD ; cpc.trim_minlen =max_t (__u64,1 ,F2FS_BYTES_TO_BLK (range->minlen)); + cpc.trim_start = start_segno; + cpc.trim_end = end_segno; -/* do checkpoint to issue discard commands safely */ -for (cur_segno = start_segno; cur_segno <= end_segno; - cur_segno = cpc.trim_end +1 ) { - cpc.trim_start = cur_segno; - -if (sbi->discard_blks ==0 ) -break ; -else if (sbi->discard_blks <BATCHED_TRIM_BLOCKS (sbi)) - cpc.trim_end = end_segno; -else - cpc.trim_end = min_t(unsigned int, -rounddown (cur_segno + -BATCHED_TRIM_SEGMENTS (sbi), - sbi->segs_per_sec) -1 , end_segno); - -mutex_lock (&sbi->gc_mutex); - err =write_checkpoint (sbi, &cpc); -mutex_unlock (&sbi->gc_mutex); -if (err) -break ; +if (sbi->discard_blks ==0 ) + goto out; -schedule (); - } +mutex_lock (&sbi->gc_mutex); + err =write_checkpoint (sbi, &cpc); +mutex_unlock (&sbi->gc_mutex); +if (err) + goto out; start_block =START_BLOCK (sbi, start_segno); end_block =START_BLOCK (sbi,min (cur_segno, end_segno) +1 );
@@ -3869,8 +3856,6 @@ int build_segment_manager(struct f2fs_sb_info *sbi) sm_info->min_hot_blocks =DEF_MIN_HOT_BLOCKS ; sm_info->min_ssr_sections =reserved_sections (sbi); - sm_info->trim_sections =DEF_BATCHED_TRIM_SECTIONS ; -INIT_LIST_HEAD (&sm_info->sit_entry_set);init_rwsem (&sm_info->curseg_lock);
fs/f2fs/sysfs.c +3 -0
@@ -251,6 +251,9 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"trim_sections" )) +return -EINVAL ; + *ui = t;if (!strcmp (a->attr.name,"iostat_enable" ) && *ui ==0 )
Signature · 1 line
2.16.2.17.g38e79b1fd