f2fs: let discard thread wait a little longer if dev is busy
authorYunlei He <heyunlei@huawei.com>
Sun, 8 Apr 2018 07:11:11 +0000 (15:11 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 31 May 2018 18:31:51 +0000 (11:31 -0700)
This patch modify discard thread wait policy as below:
issued       io_interrupted     wait time(ms)
1.        8                 0               50
2.      (0,8)               1               50
3.        0                 1              500 (dev is busy)
4.        0                 0            60000 (no candidates)

Signed-off-by: Yunlei He <heyunlei@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/segment.c

index 2036223..1280ac4 100644 (file)
@@ -180,6 +180,7 @@ enum {
 #define DEF_MAX_DISCARD_REQUEST                8       /* issue 8 discards per round */
 #define DEF_MAX_DISCARD_LEN            512     /* Max. 2MB per discard */
 #define DEF_MIN_DISCARD_ISSUE_TIME     50      /* 50 ms, if exists */
+#define DEF_MID_DISCARD_ISSUE_TIME     500     /* 500 ms, if device busy */
 #define DEF_MAX_DISCARD_ISSUE_TIME     60000   /* 60 s, if no candidates */
 #define DEF_DISCARD_URGENT_UTIL                80      /* do more discard over 80% */
 #define DEF_CP_INTERVAL                        60      /* 60 secs */
@@ -282,6 +283,7 @@ enum {
 struct discard_policy {
        int type;                       /* type of discard */
        unsigned int min_interval;      /* used for candidates exist */
+       unsigned int mid_interval;      /* used for device busy */
        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 */
index cc2d8f8..d61f5ca 100644 (file)
@@ -937,6 +937,7 @@ static void __init_discard_policy(struct f2fs_sb_info *sbi,
 
        if (discard_type == DPOLICY_BG) {
                dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME;
+               dpolicy->mid_interval = DEF_MID_DISCARD_ISSUE_TIME;
                dpolicy->max_interval = DEF_MAX_DISCARD_ISSUE_TIME;
                dpolicy->io_aware = true;
                dpolicy->sync = false;
@@ -946,6 +947,7 @@ static void __init_discard_policy(struct f2fs_sb_info *sbi,
                }
        } else if (discard_type == DPOLICY_FORCE) {
                dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME;
+               dpolicy->mid_interval = DEF_MID_DISCARD_ISSUE_TIME;
                dpolicy->max_interval = DEF_MAX_DISCARD_ISSUE_TIME;
                dpolicy->io_aware = false;
        } else if (discard_type == DPOLICY_FSTRIM) {
@@ -1420,9 +1422,11 @@ static int issue_discard_thread(void *data)
                sb_start_intwrite(sbi->sb);
 
                issued = __issue_discard_cmd(sbi, &dpolicy);
-               if (issued) {
+               if (issued > 0) {
                        __wait_all_discard_cmd(sbi, &dpolicy);
                        wait_ms = dpolicy.min_interval;
+               } else if (issued == -1){
+                       wait_ms = dpolicy.mid_interval;
                } else {
                        wait_ms = dpolicy.max_interval;
                }