From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Fri, 14 Apr 2017 17:40:09 -0700 (PDT) From: Hugh Dickins To: Bart Van Assche cc: Andrew Morton , Oleg Nesterov , Michal Hocko , Mel Gorman , Hugh Dickins , Mike Snitzer , Jan Kara , Hannes Reinecke , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH] mm: Make truncate_inode_pages_range() killable In-Reply-To: <20170414215507.27682-1-bart.vanassche@sandisk.com> Message-ID: References: <20170414215507.27682-1-bart.vanassche@sandisk.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-linux-mm@kvack.org List-ID: On Fri, 14 Apr 2017, Bart Van Assche wrote: > 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 Changing a fundamental function, silently not to do its essential job, when something in the kernel has forgotten (or is slow to) unlock_page(): that seems very wrong to me in many ways. But linux-fsdevel, Cc'ed, will be a better forum to advise on how to solve the problem you're seeing. Hugh > --- > 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