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)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 24 May 2017 04:07:18 +0000 (21:07 -0700)
This allows to freeze gc and discard threads.

Cc: stable@vger.kernel.org
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/gc.c
fs/f2fs/segment.c

index 81392970fb2da6a9b528e06e937f204177b7d91f..570480571d72238ddd39ef6189e9df6a64f83c5c 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 3bc36769ec9f7b73320acbfeb76b7e4251bf36e6..4591239dbae2287d45f764f454190cac0eec65c5 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"
@@ -1059,18 +1060,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