f2fs: init discard policy after thread wakeup
authorYangtao Li <frank.li@vivo.com>
Fri, 18 Nov 2022 03:46:00 +0000 (11:46 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 28 Nov 2022 20:50:19 +0000 (12:50 -0800)
Under the current logic, after the discard thread wakes up, it will not
run according to the expected policy, but will use the expected policy
before sleep. Move the strategy selection to after the thread wakes up,
so that the running state of the thread meets expectations.

Signed-off-by: Yangtao Li <frank.li@vivo.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/segment.c

index 37c721e1eb0348affb5a3d20e5316f31b4176518..73ad8dc9a4d3c8a9e131459daa5ea4f6cf5a6587 100644 (file)
@@ -1679,6 +1679,11 @@ static int issue_discard_thread(void *data)
        set_freezable();
 
        do {
+               wait_event_interruptible_timeout(*q,
+                               kthread_should_stop() || freezing(current) ||
+                               dcc->discard_wake,
+                               msecs_to_jiffies(wait_ms));
+
                if (sbi->gc_mode == GC_URGENT_HIGH ||
                        !f2fs_available_free_memory(sbi, DISCARD_CACHE))
                        __init_discard_policy(sbi, &dpolicy, DPOLICY_FORCE, 1);
@@ -1686,14 +1691,6 @@ static int issue_discard_thread(void *data)
                        __init_discard_policy(sbi, &dpolicy, DPOLICY_BG,
                                                dcc->discard_granularity);
 
-               if (!atomic_read(&dcc->discard_cmd_cnt))
-                      wait_ms = dpolicy.max_interval;
-
-               wait_event_interruptible_timeout(*q,
-                               kthread_should_stop() || freezing(current) ||
-                               dcc->discard_wake,
-                               msecs_to_jiffies(wait_ms));
-
                if (dcc->discard_wake)
                        dcc->discard_wake = 0;
 
@@ -1707,12 +1704,11 @@ static int issue_discard_thread(void *data)
                        continue;
                if (kthread_should_stop())
                        return 0;
-               if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
+               if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) ||
+                       !atomic_read(&dcc->discard_cmd_cnt)) {
                        wait_ms = dpolicy.max_interval;
                        continue;
                }
-               if (!atomic_read(&dcc->discard_cmd_cnt))
-                       continue;
 
                sb_start_intwrite(sbi->sb);
 
@@ -1727,6 +1723,8 @@ static int issue_discard_thread(void *data)
                } else {
                        wait_ms = dpolicy.max_interval;
                }
+               if (!atomic_read(&dcc->discard_cmd_cnt))
+                       wait_ms = dpolicy.max_interval;
 
                sb_end_intwrite(sbi->sb);