f2fs: support issuing/waiting discard in range
Subsystems (2)
Chao Yu
maintainerPATCH v2 1/6 f2fs: support issuing/waiting discard in range
From: Chao Yu <[email protected]>
Fstrim intends to trim invalid blocks of filesystem only with specified range and granularity, but actually, it will issue all previous cached discard commands which may be out-of-range and be with unmatched granularity, it's unneeded.
In order to fix above issues, this patch introduces new helps to support to issue and wait discard in range and adds a new fstrim_list for tracking in-flight discard from ->fstrim.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/f2fs.h | 3 +- fs/f2fs/segment.c | 127 +++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 108 insertions(+), 22 deletions(-)
fs/f2fs/f2fs.h +2 -1
@@ -251,6 +251,7 @@ struct discard_cmd_control {struct list_head pend_list[MAX_PLIST_NUM ];/* store pending entries */ unsigned char pend_list_tag[MAX_PLIST_NUM ];/* tag for pending entries */ struct list_head wait_list;/* store on-flushing entries */ +struct list_head fstrim_list;/* in-flight discard from fstrim */ wait_queue_head_t discard_wait_queue;/* waiting queue for wake-up */ unsigned int discard_wake;/* to wake up discard thread */ struct mutex cmd_lock;
@@ -2547,7 +2548,7 @@ void invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr);bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi,bool umount); +void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);
fs/f2fs/segment.c +106 -21
232 lines not on this page · raw message
Signature · 1 line
2.14.1.145.gb3622a4ee
Chao Yu
maintainerPATCH v2 5/6 f2fs: trace f2fs_remove_discard
From: Chao Yu <[email protected]>
This patch adds tracepoint to trace f2fs_remove_discard.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/segment.c | 2 ++ include/trace/events/f2fs.h | 7 +++++++ 2 files changed, 9 insertions(+)
fs/f2fs/segment.c +2 -0
@@ -822,6 +822,8 @@ static void __remove_discard_cmd(struct f2fs_sb_info *sbi, {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info; +trace_f2fs_remove_discard (dc->bdev, dc->start, dc->len); +f2fs_bug_on (sbi, dc->ref);if (dc->error == -EOPNOTSUPP )
include/trace/events/f2fs.h +7 -0
@@ -1286,6 +1286,13 @@ DEFINE_EVENT(f2fs_discard, f2fs_issue_discard,TP_ARGS (dev, blkstart, blklen) ); +DEFINE_EVENT (f2fs_discard, f2fs_remove_discard, + + TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen), + +TP_ARGS (dev, blkstart, blklen) +); + TRACE_EVENT(f2fs_issue_reset_zone, TP_PROTO(struct block_device *dev, block_t blkstart),
Signature · 1 line
2.14.1.145.gb3622a4ee
Chao Yu
maintainerPATCH v2 6/6 f2fs: give up CP_TRIMMED_FLAG if it drops discards
In reply to Chao YuFrom: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set CP_TRIMMED_FLAG with another checkpoint.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)
fs/f2fs/f2fs.h +1 -1
@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);
fs/f2fs/segment.c +11 -4
@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {
@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,
@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }static int issue_discard_thread (void *data)
@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true; }else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;
fs/f2fs/super.c +3 -2
@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);
@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi); -if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };
Signature · 1 line
2.14.1.145.gb3622a4ee
Chao Yu
maintainerPATCH v2 2/6 f2fs: wrap discard policy
In reply to Chao YuFrom: Chao Yu <[email protected]>
This patch wraps scattered optional parameters into discard policy as below, later, with it we expect that we can adjust these parameters with proper strategy in different scenario.
struct discard_policy {
unsigned int min_interval; /* used for candidates exist */
unsigned int max_interval; /* used for candidates not exist */
unsigned int max_requests; /* # of discards issued per round */
unsigned int io_aware_gran; /* minimum granularity discard not be aware of I/O */
bool io_aware; /* issue discard in idle time */
bool sync; /* submit discard with REQ_SYNC flag */
};
This patch doesn't change any logic of codes.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/f2fs.h | 12 +++++++++++- fs/f2fs/segment.c | 38 +++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 10 deletions(-)
fs/f2fs/f2fs.h +11 -1
@@ -149,7 +149,7 @@ enum {#define BATCHED_TRIM_BLOCKS (sbi) \ (BATCHED_TRIM_SEGMENTS(sbi) << (sbi)->log_blocks_per_seg)#define MAX_DISCARD_BLOCKS (sbi) BLKS_PER_SEC(sbi) -#define DISCARD_ISSUE_RATE 8 +#define DEF_MAX_DISCARD_REQUEST 8/* issue 8 discards per round */ #define DEF_MIN_DISCARD_ISSUE_TIME 50/* 50 ms, if exists */ #define DEF_MAX_DISCARD_ISSUE_TIME 60000/* 60 s, if no candidates */ #define DEF_CP_INTERVAL 60/* 60 secs */
@@ -245,6 +245,15 @@ struct discard_cmd {int error;/* bio error */ }; +struct discard_policy { +unsigned int min_interval;/* used for candidates exist */ +unsigned int max_interval;/* used for candidates not exist */ +unsigned int max_requests;/* # of discards issued per round */ +unsigned int io_aware_gran;/* minimum granularity discard not be aware of I/O */ +bool io_aware;/* issue discard in idle time */ +bool sync;/* submit discard with REQ_SYNC flag */ +}; +struct discard_cmd_control {struct task_struct *f2fs_issue_discard;/* discard thread */ struct list_head entry_list;/* 4KB discard entry list */
@@ -263,6 +272,7 @@ struct discard_cmd_control {atomic_t issing_discard;/* # of issing discard */ atomic_t discard_cmd_cnt;/* # of cached cmd count */ struct rb_root root;/* root of discard rb-tree */ +struct discard_policy dpolicy;/* current discard policy */ };/* for the list of fsync inodes, used only during recovery */
fs/f2fs/segment.c +29 -9
@@ -879,6 +879,7 @@ static void __submit_discard_cmd(struct f2fs_sb_info *sbi,struct list_head *wait_list = fstrim ? &(dcc->fstrim_list) : &(dcc->wait_list);struct bio *bio =NULL ; +int flag = dcc->dpolicy.sync ?REQ_SYNC :0 ;if (dc->state !=D_PREP )return ;
@@ -897,7 +898,7 @@ static void __submit_discard_cmd(struct f2fs_sb_info *sbi,if (bio) { bio->bi_private = dc; bio->bi_end_io = f2fs_submit_discard_endio; - bio->bi_opf |=REQ_SYNC ; + bio->bi_opf |= flag;submit_bio (bio);list_move_tail (&dc->list, wait_list);__check_sit_bitmap (sbi, dc->start, dc->start + dc->len);
@@ -1092,6 +1093,7 @@ static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,struct discard_cmd *prev_dc =NULL , *next_dc =NULL ;struct rb_node **insert_p =NULL , *insert_parent =NULL ;struct discard_cmd *dc; +struct discard_policy *dpolicy = &dcc->dpolicy;struct blk_plug plug;int issued;
@@ -1124,7 +1126,7 @@ static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,__submit_discard_cmd (sbi, dc, true); -if (++issued >=DISCARD_ISSUE_RATE ) { +if (++issued >= dpolicy->max_requests) { start = dc->lstart + dc->len;blk_finish_plug (&plug);
@@ -1152,6 +1154,7 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, bool issue_cond)struct list_head *pend_list;struct discard_cmd *dc, *tmp;struct blk_plug plug; +struct discard_policy *dpolicy = &dcc->dpolicy;int iter =0 , issued =0 ;int i;bool io_interrupted = false;
@@ -1179,14 +1182,16 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, bool issue_cond)continue ; } -if (is_idle (sbi)) { -__submit_discard_cmd (sbi, dc, false); - issued++; - }else { +if (dpolicy->io_aware && i < dpolicy->io_aware_gran && + !is_idle (sbi)) { io_interrupted = true; + goto skip; } -if (++iter >=DISCARD_ISSUE_RATE ) +__submit_discard_cmd (sbi, dc, false); + issued++; +skip: +if (++iter >= dpolicy->max_requests) goto out; }if (list_empty (pend_list) && dcc->pend_list_tag[i] &P_TRIM )
@@ -1335,6 +1340,7 @@ static int issue_discard_thread(void *data)struct f2fs_sb_info *sbi = data;struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;wait_queue_head_t *q = &dcc->discard_wait_queue; +struct discard_policy *dpolicy = &dcc->dpolicy;unsigned int wait_ms =DEF_MIN_DISCARD_ISSUE_TIME ;int issued;
@@ -1361,9 +1367,9 @@ static int issue_discard_thread(void *data) issued =__issue_discard_cmd (sbi, true);if (issued) {__wait_all_discard_cmd (sbi, true); - wait_ms =DEF_MIN_DISCARD_ISSUE_TIME ; + wait_ms = dpolicy->min_interval; }else { - wait_ms =DEF_MAX_DISCARD_ISSUE_TIME ; + wait_ms = dpolicy->max_interval; }sb_end_intwrite (sbi->sb);
@@ -1648,6 +1654,18 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc)wake_up_discard_thread (sbi, false); } +static void inline init_discard_policy (struct discard_cmd_control *dcc) +{ +struct discard_policy *dpolicy = &dcc->dpolicy; + + dpolicy->min_interval =DEF_MIN_DISCARD_ISSUE_TIME ; + dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; + dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; + dpolicy->io_aware_gran =MAX_PLIST_NUM ; + dpolicy->io_aware = true; + dpolicy->sync = true; +} +static int create_discard_cmd_control (struct f2fs_sb_info *sbi) {dev_t dev = sbi->sb->s_bdev->bd_dev;
@@ -1681,6 +1699,8 @@ static int create_discard_cmd_control(struct f2fs_sb_info *sbi) dcc->undiscard_blks =0 ; dcc->root =RB_ROOT ; +init_discard_policy (dcc); +init_waitqueue_head (&dcc->discard_wait_queue);SM_I (sbi)->dcc_info = dcc; init_thread:
Signature · 1 line
2.14.1.145.gb3622a4ee
Chao Yu
maintainerPATCH v2 3/6 f2fs: split discard policy
In reply to Chao YuFrom: Chao Yu <[email protected]>
There are many different scenarios such as fstrim, umount, urgent or background where we will issue discards, actually, they need use different policy in aspect of io aware, discard granularity, delay interval and so on. But now they just share one common discard policy, so there will be race when changing policy in between these scenarios, the interference of changing discard policy will be very serious.
This patch changes to split discard policy for different scenarios.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/f2fs.h | 17 +++++-- fs/f2fs/segment.c | 149 ++++++++++++++++++++++++++---------------------------- fs/f2fs/segment.h | 5 +- fs/f2fs/sysfs.c | 13 ----- 4 files changed, 88 insertions(+), 96 deletions(-)
fs/f2fs/f2fs.h +12 -5
@@ -210,10 +210,6 @@ struct discard_entry {#define plist_idx (blk_num) ((blk_num) >= MAX_PLIST_NUM ? \ (MAX_PLIST_NUM - 1) : (blk_num - 1)) -#define P_ACTIVE 0x01 -#define P_TRIM 0x02 -#define plist_issue (tag) (((tag) & P_ACTIVE) || ((tag) & P_TRIM)) -enum {D_PREP ,D_SUBMIT ,
@@ -245,13 +241,23 @@ struct discard_cmd {int error;/* bio error */ }; +enum { +DPOLICY_BG , +DPOLICY_FORCE , +DPOLICY_FSTRIM , +DPOLICY_UMOUNT , +MAX_DPOLICY , +}; +struct discard_policy { +int type;/* type of discard */ unsigned int min_interval;/* used for candidates exist */ unsigned int max_interval;/* used for candidates not exist */ unsigned int max_requests;/* # of discards issued per round */ unsigned int io_aware_gran;/* minimum granularity discard not be aware of I/O */ bool io_aware;/* issue discard in idle time */ bool sync;/* submit discard with REQ_SYNC flag */ +unsigned int granularity;/* discard granularity */ };struct discard_cmd_control {
@@ -272,7 +278,6 @@ struct discard_cmd_control {atomic_t issing_discard;/* # of issing discard */ atomic_t discard_cmd_cnt;/* # of cached cmd count */ struct rb_root root;/* root of discard rb-tree */ -struct discard_policy dpolicy;/* current discard policy */ };/* for the list of fsync inodes, used only during recovery */
@@ -2556,6 +2561,8 @@ int f2fs_flush_device_cache(struct f2fs_sb_info *sbi);void destroy_flush_cmd_control (struct f2fs_sb_info *sbi,bool free);void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr);bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr); +void init_discard_policy (struct discard_policy *dpolicy,int discard_type, +unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi);void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);
fs/f2fs/segment.c +73 -76
301 lines not on this page · raw message
fs/f2fs/segment.h +3 -2
@@ -796,8 +796,9 @@ static inline void wake_up_discard_thread(struct f2fs_sb_info *sbi, bool force) goto wake_up;mutex_lock (&dcc->cmd_lock); -for (i =MAX_PLIST_NUM -1 ; - i >=0 &&plist_issue (dcc->pend_list_tag[i]); i--) { +for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) { +if (i +1 < dcc->discard_granularity) +break ;if (!list_empty (&dcc->pend_list[i])) { wakeup = true;break ;
fs/f2fs/sysfs.c +0 -13
@@ -157,23 +157,10 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a, }if (!strcmp (a->attr.name,"discard_granularity" )) { -struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info; -int i; -if (t ==0 || t >MAX_PLIST_NUM )return -EINVAL ;if (t == *ui)return count; - -mutex_lock (&dcc->cmd_lock); -for (i =0 ; i <MAX_PLIST_NUM ; i++) { -if (i >= t -1 ) - dcc->pend_list_tag[i] |=P_ACTIVE ; -else - dcc->pend_list_tag[i] &= (~P_ACTIVE ); - } -mutex_unlock (&dcc->cmd_lock); - *ui = t;return count; }
Signature · 6 lines
2.14.1.145.gb3622a4ee ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Chao Yu
maintainerPATCH v2 4/6 f2fs: reduce cmd_lock coverage in __issue_discard_cmd
In reply to Chao YuFrom: Chao Yu <[email protected]>
__submit_discard_cmd may lead long latency due to exhaustion of I/O request resource in block layer, so issuing all discard under cmd_lock may lead to hangtask, in order to avoid that, let's reduce it's coverage.
---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.
fs/f2fs/segment.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
fs/f2fs/segment.c +10 -8
@@ -1158,14 +1158,14 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,int i, iter =0 , issued =0 ;bool io_interrupted = false; -mutex_lock (&dcc->cmd_lock); -f2fs_bug_on (sbi, - !__check_rb_tree_consistence (sbi, &dcc->root)); -blk_start_plug (&plug);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {if (i +1 < dpolicy->granularity)break ; pend_list = &dcc->pend_list[i]; + +mutex_lock (&dcc->cmd_lock); +f2fs_bug_on (sbi, !__check_rb_tree_consistence (sbi, &dcc->root)); +blk_start_plug (&plug);list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );
@@ -1179,12 +1179,14 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, issued++; skip:if (++iter >= dpolicy->max_requests) - goto out; +break ; } +blk_finish_plug (&plug); +mutex_unlock (&dcc->cmd_lock); + +if (iter >= dpolicy->max_requests) +break ; } -out: -blk_finish_plug (&plug); -mutex_unlock (&dcc->cmd_lock);if (!issued && io_interrupted) issued =-1 ;
Signature · 6 lines
2.14.1.145.gb3622a4ee ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Re: [PATCH v2 6/6] f2fs: give up CP_TRIMMED_FLAG if it drops discards
In reply to Chao YuHi Jaegeuk,
Quoted 81 lines · Chao Yu
From: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set
CP_TRIMMED_FLAGwith another checkpoint.Signed-off-by Chao Yu <[email protected]>---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)fs/f2fs/f2fs.h +1
-1@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);fs/f2fs/segment.c +10
-3@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }static int issue_discard_thread (void *data)
fs/f2fs/segment.c void init_discard_policy(struct discard_policy *dpolicy, · line 1669
Quoted 5 lines
fs/f2fs/segment.c +1
-1@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true;
I notice this change should not belong to this patch, could you please help to move this into "f2fs: split discard policy" in your branch?
Thanks,
Quoted 28 lines
fs/f2fs/segment.c +0
-0}else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;fs/f2fs/super.c +3
-2@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi); -if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };
Jaegeuk Kim
maintainerRe: [PATCH v2 6/6] f2fs: give up CP_TRIMMED_FLAG if it drops discards
Quoted 82 lines · Chao Yu
Hi Jaegeuk,
Quoted 79 lines · Chao Yu
From: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set
CP_TRIMMED_FLAGwith another checkpoint.Signed-off-by Chao Yu <[email protected]>---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)fs/f2fs/f2fs.h +1
-1@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);fs/f2fs/segment.c +10
-3@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }
Quoted 10 lines
fs/f2fs/segment.c void init_discard_policy(struct discard_policy *dpolicy, · line 1669
Quoted 7 lines
fs/f2fs/segment.c +1
-1static int issue_discard_thread (void *data)@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true;I notice this change should not belong to this patch, could you please help to move this into "f2fs: split discard policy" in your branch?
Yup, done. Could you check it in dev-test?
Thanks,
Quoted 31 lines
Thanks,
Quoted 28 lines
fs/f2fs/segment.c +0
-0}else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;fs/f2fs/super.c +3
-2@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi); -if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };
Chao Yu
maintainerRe: [PATCH v2 6/6] f2fs: give up CP_TRIMMED_FLAG if it drops discards
Quoted 94 lines · Jaegeuk Kim
Quoted 82 lines · Chao Yu
Hi Jaegeuk,
Quoted 79 lines · Chao Yu
From: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set
CP_TRIMMED_FLAGwith another checkpoint.Signed-off-by Chao Yu <[email protected]>---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)fs/f2fs/f2fs.h +1
-1@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);fs/f2fs/segment.c +10
-3@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }Quoted 10 lines
fs/f2fs/segment.c void init_discard_policy(struct discard_policy *dpolicy, · line 1669
Quoted 7 lines
fs/f2fs/segment.c +1
-1static int issue_discard_thread (void *data)@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true;I notice this change should not belong to this patch, could you please help to move this into "f2fs: split discard policy" in your branch?
Quoted 1 line
Yup, done. Could you check it in dev-test?
I didn't find it, did you forget to push to that branch?
Thanks,
Quoted 34 lines
Thanks,
Quoted 31 lines
Thanks,
Quoted 28 lines
fs/f2fs/segment.c +0
-0}else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;fs/f2fs/super.c +3
-2@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi); -if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };
Jaegeuk Kim
maintainerRe: [PATCH v2 6/6] f2fs: give up CP_TRIMMED_FLAG if it drops discards
Quoted 95 lines · Chao Yu
Quoted 94 lines · Jaegeuk Kim
Quoted 92 lines · Chao Yu
Hi Jaegeuk,
Quoted 81 lines · Chao Yu
From: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set
CP_TRIMMED_FLAGwith another checkpoint.Signed-off-by Chao Yu <[email protected]>---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)fs/f2fs/f2fs.h +1
-1@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);fs/f2fs/segment.c +10
-3@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }static int issue_discard_thread (void *data)fs/f2fs/segment.c void init_discard_policy(struct discard_policy *dpolicy, · line 1669
Quoted 5 lines
fs/f2fs/segment.c +1
-1@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true;I notice this change should not belong to this patch, could you please help to move this into "f2fs: split discard policy" in your branch?
Quoted 3 lines
Quoted 1 line
Yup, done. Could you check it in dev-test?
I didn't find it, did you forget to push to that branch?
Yup, I pushed it. :)
Thanks,
Quoted 37 lines
Thanks,
Quoted 34 lines
Thanks,
Quoted 31 lines
Thanks,
Quoted 28 lines
fs/f2fs/segment.c +0
-0}else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;fs/f2fs/super.c +3
-2@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi); -if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };
Re: [PATCH v2 6/6] f2fs: give up CP_TRIMMED_FLAG if it drops discards
Quoted 96 lines · Jaegeuk Kim
Quoted 95 lines · Chao Yu
Quoted 94 lines · Jaegeuk Kim
Quoted 92 lines · Chao Yu
Hi Jaegeuk,
Quoted 81 lines · Chao Yu
From: Chao Yu <[email protected]>
In ->umount, once we drop remained discard entries, we should not set
CP_TRIMMED_FLAGwith another checkpoint.Signed-off-by Chao Yu <[email protected]>---
v2:
- rebase on last codes of Jaegeuk's dev-test branch.fs/f2fs/f2fs.h | 2 +- fs/f2fs/segment.c | 15 +++++++++++---- fs/f2fs/super.c | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-)fs/f2fs/f2fs.h +1
-1@@ -2565,7 +2565,7 @@ void init_discard_policy(struct discard_policy *dpolicy, int discard_type, unsigned int granularity);void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi); -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi); +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);void release_discard_addrs (struct f2fs_sb_info *sbi);int npages_for_summary_flush (struct f2fs_sb_info *sbi,bool for_ra);fs/f2fs/segment.c +10
-3@@ -1196,12 +1196,13 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,return issued; } -static void __drop_discard_cmd (struct f2fs_sb_info *sbi) +static bool __drop_discard_cmd (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct list_head *pend_list;struct discard_cmd *dc, *tmp;int i; +bool dropped = false;mutex_lock (&dcc->cmd_lock);for (i =MAX_PLIST_NUM -1 ; i >=0 ; i--) {@@ -1209,9 +1210,12 @@ static void __drop_discard_cmd(struct f2fs_sb_info *sbi)list_for_each_entry_safe (dc, tmp, pend_list, list) {f2fs_bug_on (sbi, dc->state !=D_PREP );__remove_discard_cmd (sbi, dc); + dropped = true; } }mutex_unlock (&dcc->cmd_lock); + +return dropped; } static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,@@ -1306,15 +1310,18 @@ void stop_discard_thread(struct f2fs_sb_info *sbi) }/* This comes from f2fs_put_super */ -void f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) +bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi) {struct discard_cmd_control *dcc =SM_I (sbi)->dcc_info;struct discard_policy dpolicy; +bool dropped;init_discard_policy (&dpolicy,DPOLICY_UMOUNT , dcc->discard_granularity);__issue_discard_cmd (sbi, &dpolicy); -__drop_discard_cmd (sbi); + dropped =__drop_discard_cmd (sbi);__wait_all_discard_cmd (sbi, &dpolicy); + +return dropped; }static int issue_discard_thread (void *data)fs/f2fs/segment.c void init_discard_policy(struct discard_policy *dpolicy, · line 1669
Quoted 5 lines
fs/f2fs/segment.c +1
-1@@ -1659,7 +1666,7 @@ void init_discard_policy(struct discard_policy *dpolicy, dpolicy->max_interval =DEF_MAX_DISCARD_ISSUE_TIME ; dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ; - dpolicy->io_aware = false; + dpolicy->io_aware = true;I notice this change should not belong to this patch, could you please help to move this into "f2fs: split discard policy" in your branch?
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Yup, done. Could you check it in dev-test?
I didn't find it, did you forget to push to that branch?
Yup, I pushed it. :)
I've checked that, it's OK to me now. :)
Thanks,
Quoted 43 lines
Thanks,
Quoted 31 lines
Thanks,
Quoted 28 lines
Thanks,
Quoted 25 lines
Thanks,
Quoted 22 lines
fs/f2fs/segment.c +0
-0}else if (discard_type ==DPOLICY_FSTRIM ) { dpolicy->max_requests =DEF_MAX_DISCARD_REQUEST ; dpolicy->io_aware_gran =MAX_PLIST_NUM ;fs/f2fs/super.c +2
-1@@ -807,6 +807,7 @@ static void f2fs_put_super(struct super_block *sb) {struct f2fs_sb_info *sbi =F2FS_SB (sb);int i; +bool dropped;f2fs_quota_off_umount (sb);@@ -827,9 +828,9 @@ static void f2fs_put_super(struct super_block *sb) }/* be sure to wait for any on-going discard commands */ -f2fs_wait_discard_bios (sbi, true); + dropped =f2fs_wait_discard_bios (sbi);Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
fs/f2fs/super.c static void f2fs_put_super(struct super_block *sb) · line 836
Quoted 6 lines
fs/f2fs/super.c +1
-1-if (f2fs_discard_en (sbi) && !sbi->discard_blks) { +if (f2fs_discard_en (sbi) && !sbi->discard_blks && !dropped) {struct cp_control cpc = { .reason =CP_UMOUNT |CP_TRIMMED , };.