From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754894AbdKCHqd (ORCPT ); Fri, 3 Nov 2017 03:46:33 -0400 Received: from mail-oi0-f67.google.com ([209.85.218.67]:49107 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751370AbdKCHqc (ORCPT ); Fri, 3 Nov 2017 03:46:32 -0400 X-Google-Smtp-Source: ABhQp+SH43FJobQD+4n2M/vE28VgDMSXywsKqJumCisezbUgQg6AshsRYCoiX0Yle6wqXS6FmSsTOQ== Date: Fri, 3 Nov 2017 00:46:18 -0700 (PDT) From: Hugh Dickins X-X-Sender: hugh@eggly.anvils To: Michal Hocko cc: linux-mm@kvack.org, Peter Zijlstra , Thomas Gleixner , Johannes Weiner , Mel Gorman , Tejun Heo , LKML , Michal Hocko , David Herrmann , Hugh Dickins Subject: Re: [PATCH 1/2] shmem: drop lru_add_drain_all from shmem_wait_for_pins In-Reply-To: <20171102093613.3616-2-mhocko@kernel.org> Message-ID: References: <20171102093613.3616-1-mhocko@kernel.org> <20171102093613.3616-2-mhocko@kernel.org> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2 Nov 2017, Michal Hocko wrote: > From: Michal Hocko > > syzkaller has reported the following lockdep splat > ====================================================== > WARNING: possible circular locking dependency detected > 4.13.0-next-20170911+ #19 Not tainted > ------------------------------------------------------ > syz-executor5/6914 is trying to acquire lock: > (cpu_hotplug_lock.rw_sem){++++}, at: [] get_online_cpus include/linux/cpu.h:126 [inline] > (cpu_hotplug_lock.rw_sem){++++}, at: [] lru_add_drain_all+0xe/0x20 mm/swap.c:729 > > but task is already holding lock: > (&sb->s_type->i_mutex_key#9){++++}, at: [] inode_lock include/linux/fs.h:712 [inline] > (&sb->s_type->i_mutex_key#9){++++}, at: [] shmem_add_seals+0x197/0x1060 mm/shmem.c:2768 > > more details [1] and dependencies explained [2]. The problem seems to be > the usage of lru_add_drain_all from shmem_wait_for_pins. While the lock > dependency is subtle as hell and we might want to make lru_add_drain_all > less dependent on the hotplug locks the usage of lru_add_drain_all seems > dubious here. The whole function cares only about radix tree tags, page > count and page mapcount. None of those are touched from the draining > context. So it doesn't make much sense to drain pcp caches. Moreover > this looks like a wrong thing to do because it basically induces > unpredictable latency to the call because draining is not for free > (especially on larger machines with many cpus). > > Let's simply drop the call to lru_add_drain_all to address both issues. > > [1] http://lkml.kernel.org/r/089e0825eec8955c1f055c83d476@google.com > [2] http://lkml.kernel.org/r/http://lkml.kernel.org/r/20171030151009.ip4k7nwan7muouca@hirez.programming.kicks-ass.net > > Cc: David Herrmann > Cc: Hugh Dickins > Signed-off-by: Michal Hocko NAK. shmem_wait_for_pins() is waiting for temporary pins on the pages to go away, and using lru_add_drain_all() in the usual way, to lower the refcount of pages temporarily pinned in a pagevec somewhere. Page count is touched by draining pagevecs: I'm surprised to see you say that it isn't - or have pagevec page references been eliminated by a recent commit that I missed? I hope your other patch, or another cpu hotplug locking fix, can deal with this. If not, I might be forced to spend some hours understanding the story that lockdep is telling us there - you're probably way ahead of me on that. Maybe a separate inode lock initializer for shmem inodes would offer a way out. Hugh > --- > mm/shmem.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/mm/shmem.c b/mm/shmem.c > index d6947d21f66c..e784f311d4ed 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2668,9 +2668,7 @@ static int shmem_wait_for_pins(struct address_space *mapping) > if (!radix_tree_tagged(&mapping->page_tree, SHMEM_TAG_PINNED)) > break; > > - if (!scan) > - lru_add_drain_all(); > - else if (schedule_timeout_killable((HZ << scan) / 200)) > + if (scan && schedule_timeout_killable((HZ << scan) / 200)) > scan = LAST_SCAN; > > start = 0; > -- > 2.14.2 > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi0-f71.google.com (mail-oi0-f71.google.com [209.85.218.71]) by kanga.kvack.org (Postfix) with ESMTP id 954C46B0038 for ; Fri, 3 Nov 2017 03:46:38 -0400 (EDT) Received: by mail-oi0-f71.google.com with SMTP id f66so2067321oib.1 for ; Fri, 03 Nov 2017 00:46:38 -0700 (PDT) Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id t76sor1974745oie.63.2017.11.03.00.46.31 for (Google Transport Security); Fri, 03 Nov 2017 00:46:32 -0700 (PDT) Date: Fri, 3 Nov 2017 00:46:18 -0700 (PDT) From: Hugh Dickins Subject: Re: [PATCH 1/2] shmem: drop lru_add_drain_all from shmem_wait_for_pins In-Reply-To: <20171102093613.3616-2-mhocko@kernel.org> Message-ID: References: <20171102093613.3616-1-mhocko@kernel.org> <20171102093613.3616-2-mhocko@kernel.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-linux-mm@kvack.org List-ID: To: Michal Hocko Cc: linux-mm@kvack.org, Peter Zijlstra , Thomas Gleixner , Johannes Weiner , Mel Gorman , Tejun Heo , LKML , Michal Hocko , David Herrmann , Hugh Dickins On Thu, 2 Nov 2017, Michal Hocko wrote: > From: Michal Hocko > > syzkaller has reported the following lockdep splat > ====================================================== > WARNING: possible circular locking dependency detected > 4.13.0-next-20170911+ #19 Not tainted > ------------------------------------------------------ > syz-executor5/6914 is trying to acquire lock: > (cpu_hotplug_lock.rw_sem){++++}, at: [] get_online_cpus include/linux/cpu.h:126 [inline] > (cpu_hotplug_lock.rw_sem){++++}, at: [] lru_add_drain_all+0xe/0x20 mm/swap.c:729 > > but task is already holding lock: > (&sb->s_type->i_mutex_key#9){++++}, at: [] inode_lock include/linux/fs.h:712 [inline] > (&sb->s_type->i_mutex_key#9){++++}, at: [] shmem_add_seals+0x197/0x1060 mm/shmem.c:2768 > > more details [1] and dependencies explained [2]. The problem seems to be > the usage of lru_add_drain_all from shmem_wait_for_pins. While the lock > dependency is subtle as hell and we might want to make lru_add_drain_all > less dependent on the hotplug locks the usage of lru_add_drain_all seems > dubious here. The whole function cares only about radix tree tags, page > count and page mapcount. None of those are touched from the draining > context. So it doesn't make much sense to drain pcp caches. Moreover > this looks like a wrong thing to do because it basically induces > unpredictable latency to the call because draining is not for free > (especially on larger machines with many cpus). > > Let's simply drop the call to lru_add_drain_all to address both issues. > > [1] http://lkml.kernel.org/r/089e0825eec8955c1f055c83d476@google.com > [2] http://lkml.kernel.org/r/http://lkml.kernel.org/r/20171030151009.ip4k7nwan7muouca@hirez.programming.kicks-ass.net > > Cc: David Herrmann > Cc: Hugh Dickins > Signed-off-by: Michal Hocko NAK. shmem_wait_for_pins() is waiting for temporary pins on the pages to go away, and using lru_add_drain_all() in the usual way, to lower the refcount of pages temporarily pinned in a pagevec somewhere. Page count is touched by draining pagevecs: I'm surprised to see you say that it isn't - or have pagevec page references been eliminated by a recent commit that I missed? I hope your other patch, or another cpu hotplug locking fix, can deal with this. If not, I might be forced to spend some hours understanding the story that lockdep is telling us there - you're probably way ahead of me on that. Maybe a separate inode lock initializer for shmem inodes would offer a way out. Hugh > --- > mm/shmem.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/mm/shmem.c b/mm/shmem.c > index d6947d21f66c..e784f311d4ed 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2668,9 +2668,7 @@ static int shmem_wait_for_pins(struct address_space *mapping) > if (!radix_tree_tagged(&mapping->page_tree, SHMEM_TAG_PINNED)) > break; > > - if (!scan) > - lru_add_drain_all(); > - else if (schedule_timeout_killable((HZ << scan) / 200)) > + if (scan && schedule_timeout_killable((HZ << scan) / 200)) > scan = LAST_SCAN; > > start = 0; > -- > 2.14.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