From: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org, kernel-testers@vger.kernel.org,
linux-mm@kvack.org, Nick Piggin <npiggin@suse.de>,
Andy Whitcroft <apw@shadowen.org>,
"riel@redhat.com" <riel@redhat.com>
Subject: Re: [PATCH] fix double unlock_page() in 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!
Date: Tue, 17 Jun 2008 11:26:40 -0400 [thread overview]
Message-ID: <1213716401.8707.14.camel@lts-notebook> (raw)
In-Reply-To: <20080617113235.cc493c03.kamezawa.hiroyu@jp.fujitsu.com>
On Tue, 2008-06-17 at 11:32 +0900, KAMEZAWA Hiroyuki wrote:
> On Fri, 13 Jun 2008 11:30:46 -0400
> Lee Schermerhorn <Lee.Schermerhorn@hp.com> wrote:
>
> > 1) modified putback_lru_page() to drop page lock only if both page_mapping()
> > NULL and page_count() == 1 [rather than VM_BUG_ON(page_count(page) != 1].
>
> I'm sorry that I cannot catch the whole changes..
>
> I cannot convice that this implicit behavior won't cause lock-up in future, again.
> Even if there are enough comments...
>
> Why the page should be locked when it is put back to LRU ?
> I think this restriction is added by RvR patch set, right ?
> I'm sorry that I cannot catch the whole changes..
Kame-san: The restriction to put the page back to the LRU via
putback_lru_page() with the page locked does come from the unevictable
page infrastructure. Both page migration and vmscan can hold the page
isolated from the LRU, but unlocked, for quite some time. During this
time, a page can become nonreclaimable [or unevictable] or a
nonreclaimable page can become reclaimable. It's OK if an unevictable
pages gets on on the regular LRU lists, because we'll detect it and
"cull" it if/when vmscan attempts to reclaim it. However, if a
reclaimable page gets onto the unevictable LRU list, we may never get it
off, except via manual scan. Rik doesn't think we need the manual scan,
so we've been very careful to avoid conditions where we could "leak" a
reclaimable page permantently onto the unevictable list. Kosaki-san
found several scenarios where this could happen unless we check, under
page lock, the unevictable conditions when putting these pages back on
the LRU.
>
> Anyway, IMHO, lock <-> unlock should be visible as a pair as much as possible.
I've considered modifying putback_lru_page() not to unlock/put the page
when mapping == NULL and count == 1. Then all of the callers would have
to remember this state, drop the lock and call put page themselves. I
think this would duplicate code and look ugly, but if we need to do
that, I guess we'll do it.
Regards,
Lee
>
> Thanks,
> -Kame
>
> > I want to balance the put_page() from isolate_lru_page() here for vmscan
> > and, e.g., page migration rather than requiring explicit checks of the
> > page_mapping() and explicit put_page() in these areas. However, the page
> > could be truncated while one of these subsystems holds it isolated from
> > the LRU. So, need to handle this case. Callers of putback_lru_page()
> > need to be aware of this and only call it with a page with NULL
> > page_mapping() when they will no longer reference the page afterwards.
> > This is the case for vmscan and page migration.
> >
> > 2) m[un]lock_vma_page() already will not be called for page with NULL
> > mapping. Added VM_BUG_ON() to assert this.
> >
> > 3) modified clear_page_lock() to skip the isolate/putback shuffle for
> > pages with NULL mapping, as they are being truncated/freed. Thus,
> > any future callers of clear_page_lock() need not be concerned about
> > the putback_lru_page() semantics for truncated pages.
> >
> > Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
> >
> > mm/mlock.c | 29 +++++++++++++++++++----------
> > mm/vmscan.c | 12 +++++++-----
> > 2 files changed, 26 insertions(+), 15 deletions(-)
> >
> > Index: linux-2.6.26-rc5-mm3/mm/mlock.c
> > ===================================================================
> > --- linux-2.6.26-rc5-mm3.orig/mm/mlock.c 2008-06-12 11:42:59.000000000 -0400
> > +++ linux-2.6.26-rc5-mm3/mm/mlock.c 2008-06-13 09:47:14.000000000 -0400
> > @@ -59,27 +59,33 @@ void __clear_page_mlock(struct page *pag
> >
> > dec_zone_page_state(page, NR_MLOCK);
> > count_vm_event(NORECL_PGCLEARED);
> > - if (!isolate_lru_page(page)) {
> > - putback_lru_page(page);
> > - } else {
> > - /*
> > - * Page not on the LRU yet. Flush all pagevecs and retry.
> > - */
> > - lru_add_drain_all();
> > - if (!isolate_lru_page(page))
> > + if (page->mapping) { /* truncated ? */
> > + if (!isolate_lru_page(page)) {
> > putback_lru_page(page);
> > - else if (PageUnevictable(page))
> > - count_vm_event(NORECL_PGSTRANDED);
> > + } else {
> > + /*
> > + * Page not on the LRU yet.
> > + * Flush all pagevecs and retry.
> > + */
> > + lru_add_drain_all();
> > + if (!isolate_lru_page(page))
> > + putback_lru_page(page);
> > + else if (PageUnevictable(page))
> > + count_vm_event(NORECL_PGSTRANDED);
> > + }
> > }
> > }
> >
> > /*
> > * Mark page as mlocked if not already.
> > * If page on LRU, isolate and putback to move to unevictable list.
> > + *
> > + * Called with page locked and page_mapping() != NULL.
> > */
> > void mlock_vma_page(struct page *page)
> > {
> > BUG_ON(!PageLocked(page));
> > + VM_BUG_ON(!page_mapping(page));
> >
> > if (!TestSetPageMlocked(page)) {
> > inc_zone_page_state(page, NR_MLOCK);
> > @@ -92,6 +98,8 @@ void mlock_vma_page(struct page *page)
> > /*
> > * called from munlock()/munmap() path with page supposedly on the LRU.
> > *
> > + * Called with page locked and page_mapping() != NULL.
> > + *
> > * Note: unlike mlock_vma_page(), we can't just clear the PageMlocked
> > * [in try_to_munlock()] and then attempt to isolate the page. We must
> > * isolate the page to keep others from messing with its unevictable
> > @@ -110,6 +118,7 @@ void mlock_vma_page(struct page *page)
> > static void munlock_vma_page(struct page *page)
> > {
> > BUG_ON(!PageLocked(page));
> > + VM_BUG_ON(!page_mapping(page));
> >
> > if (TestClearPageMlocked(page)) {
> > dec_zone_page_state(page, NR_MLOCK);
> > Index: linux-2.6.26-rc5-mm3/mm/vmscan.c
> > ===================================================================
> > --- linux-2.6.26-rc5-mm3.orig/mm/vmscan.c 2008-06-12 11:39:09.000000000 -0400
> > +++ linux-2.6.26-rc5-mm3/mm/vmscan.c 2008-06-13 09:44:44.000000000 -0400
> > @@ -1,4 +1,4 @@
> > -/*
> > + /*
> > * linux/mm/vmscan.c
> > *
> > * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
> > @@ -488,6 +488,9 @@ int remove_mapping(struct address_space
> > * lru_lock must not be held, interrupts must be enabled.
> > * Must be called with page locked.
> > *
> > + * If page truncated [page_mapping() == NULL] and we hold the last reference,
> > + * the page will be freed here. For vmscan and page migration.
> > + *
> > * return 1 if page still locked [not truncated], else 0
> > */
> > int putback_lru_page(struct page *page)
> > @@ -502,12 +505,11 @@ int putback_lru_page(struct page *page)
> > lru = !!TestClearPageActive(page);
> > was_unevictable = TestClearPageUnevictable(page); /* for page_evictable() */
> >
> > - if (unlikely(!page->mapping)) {
> > + if (unlikely(!page->mapping && page_count(page) == 1)) {
> > /*
> > - * page truncated. drop lock as put_page() will
> > - * free the page.
> > + * page truncated and we hold last reference.
> > + * drop lock as put_page() will free the page.
> > */
> > - VM_BUG_ON(page_count(page) != 1);
> > unlock_page(page);
> > ret = 0;
> > } else if (page_evictable(page, NULL)) {
> >
> >
> >
>
--
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: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-06-17 15:26 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-12 5:59 2.6.26-rc5-mm3 Andrew Morton
2008-06-12 7:58 ` 2.6.26-rc5-mm3: kernel BUG at mm/vmscan.c:510 Alexey Dobriyan
2008-06-12 8:22 ` Andrew Morton
2008-06-12 8:23 ` Alexey Dobriyan
2008-06-12 8:44 ` [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575! Kamalesh Babulal
2008-06-12 8:57 ` Andrew Morton
2008-06-12 11:20 ` KAMEZAWA Hiroyuki
2008-06-13 1:44 ` [PATCH] fix double unlock_page() in " KAMEZAWA Hiroyuki
2008-06-13 2:13 ` Andrew Morton
2008-06-13 15:30 ` Lee Schermerhorn
2008-06-15 3:59 ` Kamalesh Babulal
2008-06-16 14:49 ` Lee Schermerhorn
2008-06-17 2:32 ` KAMEZAWA Hiroyuki
2008-06-17 15:26 ` Lee Schermerhorn [this message]
2008-06-13 4:34 ` Valdis.Kletnieks
2008-06-14 13:32 ` Kamalesh Babulal
2008-06-12 11:38 ` [BUG] " Nick Piggin
2008-06-13 0:25 ` KAMEZAWA Hiroyuki
2008-06-13 4:18 ` Valdis.Kletnieks
2008-06-13 7:16 ` Andrew Morton
2008-06-12 23:32 ` 2.6.26-rc5-mm3 Byron Bradley
2008-06-12 23:55 ` 2.6.26-rc5-mm3 Daniel Walker
2008-06-13 0:04 ` 2.6.26-rc5-mm3 Byron Bradley
2008-06-18 17:55 ` 2.6.26-rc5-mm3 Daniel Walker
2008-06-19 9:13 ` 2.6.26-rc5-mm3 Ingo Molnar
2008-06-19 14:39 ` 2.6.26-rc5-mm3 Daniel Walker
2008-06-17 7:35 ` [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26-rc5-mm3 Daisuke Nishimura
2008-06-17 7:47 ` [Bad page] trying to free locked page? (Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26-rc5-mm3) Daisuke Nishimura
2008-06-17 9:03 ` KAMEZAWA Hiroyuki
2008-06-17 9:14 ` KOSAKI Motohiro
2008-06-17 9:15 ` Daisuke Nishimura
2008-06-17 18:29 ` Lee Schermerhorn
2008-06-17 20:00 ` [PATCH] unevictable mlocked pages: initialize mm member of munlock mm_walk structure Lee Schermerhorn
2008-06-18 3:33 ` KOSAKI Motohiro
2008-06-18 2:40 ` [Bad page] trying to free locked page? (Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26-rc5-mm3) Daisuke Nishimura
2008-06-17 15:34 ` KOSAKI Motohiro
2008-06-18 2:32 ` Daisuke Nishimura
2008-06-18 10:20 ` KOSAKI Motohiro
2008-06-18 9:40 ` [Experimental][PATCH] putback_lru_page rework KAMEZAWA Hiroyuki
2008-06-18 11:36 ` KOSAKI Motohiro
2008-06-18 11:55 ` KAMEZAWA Hiroyuki
2008-06-19 8:00 ` Daisuke Nishimura
2008-06-19 8:24 ` KAMEZAWA Hiroyuki
2008-06-18 14:50 ` Daisuke Nishimura
2008-06-18 18:21 ` Lee Schermerhorn
2008-06-19 0:22 ` KAMEZAWA Hiroyuki
2008-06-19 14:45 ` Lee Schermerhorn
2008-06-20 0:47 ` KAMEZAWA Hiroyuki
2008-06-20 1:13 ` KAMEZAWA Hiroyuki
2008-06-20 17:10 ` Lee Schermerhorn
2008-06-20 20:41 ` Lee Schermerhorn
2008-06-21 8:56 ` KOSAKI Motohiro
2008-06-23 0:30 ` KAMEZAWA Hiroyuki
2008-06-21 8:41 ` KOSAKI Motohiro
2008-06-21 8:39 ` KOSAKI Motohiro
2008-06-19 15:32 ` kamezawa.hiroyu
2008-06-20 16:24 ` Lee Schermerhorn
2008-06-17 15:33 ` [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26-rc5-mm3 KOSAKI Motohiro
2008-06-18 1:54 ` Daisuke Nishimura
2008-06-18 4:41 ` Daisuke Nishimura
2008-06-18 4:59 ` KAMEZAWA Hiroyuki
2008-06-18 7:54 ` [PATCH][-mm] remove redundant page->mapping check KOSAKI Motohiro
2008-06-17 17:46 ` [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26-rc5-mm3 Lee Schermerhorn
2008-06-17 18:33 ` Hugh Dickins
2008-06-17 19:28 ` Lee Schermerhorn
2008-06-18 5:19 ` Nick Piggin
2008-06-18 2:59 ` Daisuke Nishimura
2008-06-18 1:13 ` KAMEZAWA Hiroyuki
2008-06-18 1:26 ` Daisuke Nishimura
2008-06-18 1:54 ` [PATCH] migration_entry_wait fix KAMEZAWA Hiroyuki
2008-06-18 5:26 ` KOSAKI Motohiro
2008-06-18 5:35 ` Nick Piggin
2008-06-18 6:04 ` KAMEZAWA Hiroyuki
2008-06-18 6:42 ` Nick Piggin
2008-06-18 6:52 ` KAMEZAWA Hiroyuki
2008-06-18 7:29 ` [PATCH -mm][BUGFIX] migration_entry_wait fix. v2 KAMEZAWA Hiroyuki
2008-06-18 7:26 ` KOSAKI Motohiro
2008-06-18 7:40 ` Nick Piggin
2008-06-19 6:59 ` [BUG][PATCH -mm] avoid BUG() in __stop_machine_run() Hidehiro Kawai
2008-06-19 10:12 ` Rusty Russell
2008-06-19 15:51 ` Jeremy Fitzhardinge
2008-06-20 13:21 ` Ingo Molnar
2008-06-23 3:55 ` Rusty Russell
2008-06-23 21:01 ` Ingo Molnar
2008-06-19 16:27 ` 2.6.26-rc5-mm3: BUG large value for HugePages_Rsvd Jon Tollefson
2008-06-19 17:16 ` Andy Whitcroft
2008-06-20 3:18 ` Jon Tollefson
2008-06-20 19:17 ` [RFC] hugetlb reservations -- MAP_PRIVATE fixes for split vmas Andy Whitcroft
2008-06-20 19:17 ` [PATCH 1/2] hugetlb reservations: move region tracking earlier Andy Whitcroft
2008-06-20 19:17 ` [PATCH 2/2] hugetlb reservations: fix hugetlb MAP_PRIVATE reservations across vma splits Andy Whitcroft
2008-06-23 7:33 ` Mel Gorman
2008-06-23 8:00 ` Mel Gorman
2008-06-23 9:53 ` Andy Whitcroft
2008-06-23 16:04 ` [RFC] hugetlb reservations -- MAP_PRIVATE fixes for split vmas Jon Tollefson
2008-06-23 17:35 ` [RFC] hugetlb reservations -- MAP_PRIVATE fixes for split vmas V2 Andy Whitcroft
2008-06-23 17:35 ` [PATCH 1/2] hugetlb reservations: move region tracking earlier Andy Whitcroft
2008-06-23 23:05 ` Mel Gorman
2008-06-23 17:35 ` [PATCH 2/2] hugetlb reservations: fix hugetlb MAP_PRIVATE reservations across vma splits V2 Andy Whitcroft
2008-06-23 23:08 ` Mel Gorman
2008-06-25 21:22 ` [RFC] hugetlb reservations -- MAP_PRIVATE fixes for split vmas V2 Jon Tollefson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1213716401.8707.14.camel@lts-notebook \
--to=lee.schermerhorn@hp.com \
--cc=akpm@linux-foundation.org \
--cc=apw@shadowen.org \
--cc=kamalesh@linux.vnet.ibm.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kernel-testers@vger.kernel.org \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=npiggin@suse.de \
--cc=riel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox