From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt0-f197.google.com (mail-qt0-f197.google.com [209.85.216.197]) by kanga.kvack.org (Postfix) with ESMTP id 54A686B03A0 for ; Fri, 14 Apr 2017 17:55:20 -0400 (EDT) Received: by mail-qt0-f197.google.com with SMTP id l25so17746983qtf.11 for ; Fri, 14 Apr 2017 14:55:20 -0700 (PDT) Received: from esa3.hgst.iphmx.com (esa3.hgst.iphmx.com. [216.71.153.141]) by mx.google.com with ESMTPS id l90si2871918qte.273.2017.04.14.14.55.18 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 14 Apr 2017 14:55:18 -0700 (PDT) From: Bart Van Assche Subject: [PATCH] mm: Make truncate_inode_pages_range() killable Date: Fri, 14 Apr 2017 14:55:07 -0700 Message-ID: <20170414215507.27682-1-bart.vanassche@sandisk.com> MIME-Version: 1.0 Content-Type: text/plain Sender: owner-linux-mm@kvack.org List-ID: To: Andrew Morton Cc: Bart Van Assche , Oleg Nesterov , Michal Hocko , Mel Gorman , Hugh Dickins , Mike Snitzer , Jan Kara , Hannes Reinecke , linux-mm@kvack.org The default behavior of multipathd is to run kpartx against newly discovered paths. Avoid that these kpartx processes become unkillable if there are no paths left and when using queue_if_no_path. This patch avoids that kpartx sporadically hangs as follows: Call Trace: __schedule+0x3df/0xc10 schedule+0x3d/0x90 io_schedule+0x16/0x40 __lock_page+0x111/0x140 truncate_inode_pages_range+0x462/0x790 truncate_inode_pages+0x15/0x20 kill_bdev+0x35/0x40 __blkdev_put+0x76/0x220 blkdev_put+0x4e/0x170 blkdev_close+0x25/0x30 __fput+0xed/0x1f0 ____fput+0xe/0x10 task_work_run+0x85/0xc0 do_exit+0x311/0xc70 do_group_exit+0x50/0xd0 get_signal+0x2c7/0x930 do_signal+0x28/0x6b0 exit_to_usermode_loop+0x62/0xa0 do_syscall_64+0xda/0x140 entry_SYSCALL64_slow_path+0x25/0x25 Signed-off-by: Bart Van Assche Cc: Oleg Nesterov Cc: Michal Hocko Cc: Mel Gorman Cc: Hugh Dickins Cc: Mike Snitzer Cc: Jan Kara Cc: Hannes Reinecke Cc: linux-mm@kvack.org --- mm/truncate.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/truncate.c b/mm/truncate.c index 6263affdef88..91abd16d74f8 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -20,6 +20,7 @@ #include #include /* grr. try_to_release_page, do_invalidatepage */ +#include #include #include #include @@ -366,7 +367,7 @@ void truncate_inode_pages_range(struct address_space *mapping, return; index = start; - for ( ; ; ) { + for ( ; !signal_pending_state(TASK_WAKEKILL, current); ) { cond_resched(); if (!pagevec_lookup_entries(&pvec, mapping, index, min(end - index, (pgoff_t)PAGEVEC_SIZE), indices)) { @@ -400,7 +401,8 @@ void truncate_inode_pages_range(struct address_space *mapping, continue; } - lock_page(page); + if (lock_page_killable(page)) + break; WARN_ON(page_to_index(page) != index); wait_on_page_writeback(page); truncate_inode_page(mapping, page); -- 2.12.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org