mm: Make task in balance_dirty_pages() killable
authorJan Kara <jack@suse.cz>
Wed, 16 Nov 2011 11:34:48 +0000 (19:34 +0800)
committerWu Fengguang <fengguang.wu@intel.com>
Wed, 16 Nov 2011 11:53:44 +0000 (19:53 +0800)
There is no reason why task in balance_dirty_pages() shouldn't be killable
and it helps in recovering from some error conditions (like when filesystem
goes in error state and cannot accept writeback anymore but we still want to
kill processes using it to be able to unmount it).

There will be follow up patches to further abort the generic_perform_write()
and other filesystem write loops, to avoid large write + SIGKILL combination
exceeding the dirty limit and possibly strange OOM.

Reported-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Tested-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
mm/page-writeback.c

index a3278f005230a07ac5bf42717ae55bfb114f0239..79c34419faddc909bb913fb588012f33c1ae3c3c 100644 (file)
@@ -1133,7 +1133,7 @@ pause:
                                          pages_dirtied,
                                          pause,
                                          start_time);
-               __set_current_state(TASK_UNINTERRUPTIBLE);
+               __set_current_state(TASK_KILLABLE);
                io_schedule_timeout(pause);
 
                dirty_thresh = hard_dirty_limit(dirty_thresh);
@@ -1145,6 +1145,9 @@ pause:
                 */
                if (nr_dirty < dirty_thresh)
                        break;
+
+               if (fatal_signal_pending(current))
+                       break;
        }
 
        if (!dirty_exceeded && bdi->dirty_exceeded)