]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs: try to freeze in gc and discard threads
authorJaegeuk Kim <jaegeuk@kernel.org>
Wed, 17 May 2017 17:36:58 +0000 (10:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jul 2017 22:10:15 +0000 (15:10 -0700)
commit 1d7be2708277edfef95171d52fb65ee26eaa076b upstream.

This allows to freeze gc and discard threads.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/f2fs/gc.c
fs/f2fs/segment.c

index 026522107ca3f843dee496b0f1ab5359c10eeb6a..3af905ce6c27ce4e47961f121f3c4a30db131ae2 100644 (file)
@@ -32,13 +32,14 @@ static int gc_thread_func(void *data)
 
        wait_ms = gc_th->min_sleep_time;
 
+       set_freezable();
        do {
+               wait_event_interruptible_timeout(*wq,
+                               kthread_should_stop() || freezing(current),
+                               msecs_to_jiffies(wait_ms));
+
                if (try_to_freeze())
                        continue;
-               else
-                       wait_event_interruptible_timeout(*wq,
-                                               kthread_should_stop(),
-                                               msecs_to_jiffies(wait_ms));
                if (kthread_should_stop())
                        break;
 
index e7bfde80f665dc1f11466217e9219322f2ebc0fb..3222e2be41974715edd3fd174fcf21d30a6d08a1 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/kthread.h>
 #include <linux/swap.h>
 #include <linux/timer.h>
+#include <linux/freezer.h>
 
 #include "f2fs.h"
 #include "segment.h"
@@ -1060,18 +1061,24 @@ 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;
-repeat:
-       if (kthread_should_stop())
-               return 0;
 
-       __issue_discard_cmd(sbi, true);
-       __wait_discard_cmd(sbi, true);
+       set_freezable();
 
-       congestion_wait(BLK_RW_SYNC, HZ/50);
+       do {
+               wait_event_interruptible(*q, kthread_should_stop() ||
+                                       freezing(current) ||
+                                       atomic_read(&dcc->discard_cmd_cnt));
+               if (try_to_freeze())
+                       continue;
+               if (kthread_should_stop())
+                       return 0;
 
-       wait_event_interruptible(*q, kthread_should_stop() ||
-                               atomic_read(&dcc->discard_cmd_cnt));
-       goto repeat;
+               __issue_discard_cmd(sbi, true);
+               __wait_discard_cmd(sbi, true);
+
+               congestion_wait(BLK_RW_SYNC, HZ/50);
+       } while (!kthread_should_stop());
+       return 0;
 }
 
 #ifdef CONFIG_BLK_DEV_ZONED