[PATCH -mm][BUGFIX] migration_entry_wait fix. v2

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: KAMEZAWA Hiroyuki
Date: Wednesday, June 18, 2008 - 12:29 am

In speculative page cache look up protocol, page_count(page) is set to 0
while radix-tree modification is going on, truncation, migration, etc...

While page migration, a page fault to page under migration does
 - look up page table
 - find it is migration_entry_pte
 - decode pfn from migration_entry_pte and get page of pfn_page(pfn)
 - wait until page is unlocked 

It does get_page() -> wait_on_page_locked() -> put_page() now.

In page migration's radix-tree replacement, page_freeze_refs() ->
page_unfreeze_refs() is called. And page_count(page) turns to be zero
and must be kept to be zero while radix-tree replacement.

If get_page() is called against a page under radix-tree replacement,
the kernel panics(). To avoid this, we shouldn't increment page_count()
if it is zero. This patch uses get_page_unless_zero().

Even if get_page_unless_zero() fails, the caller just retries.
But will be a bit busier.

Change log v1->v2:
 - rewrote the patch description and added comments.

From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
 mm/migrate.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Index: test-2.6.26-rc5-mm3/mm/migrate.c
===================================================================
--- test-2.6.26-rc5-mm3.orig/mm/migrate.c
+++ test-2.6.26-rc5-mm3/mm/migrate.c
@@ -242,8 +242,15 @@ void migration_entry_wait(struct mm_stru
 		goto out;
 
 	page = migration_entry_to_page(entry);
-
-	get_page(page);
+	/*
+	 * Once radix-tree replacement of page migration started, page_count
+	 * *must* be zero. And, we don't want to call wait_on_page_locked()
+	 * against a page without get_page().
+	 * So, we use get_page_unless_zero(), here. Even failed, page fault
+	 * will occur again.
+	 */
+	if (!get_page_unless_zero(page))
+		goto out;
 	pte_unmap_unlock(ptep, ptl);
 	wait_on_page_locked(page);
 	put_page(page);

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
2.6.26-rc5-mm3, Andrew Morton, (Wed Jun 11, 10:59 pm)
2.6.26-rc5-mm3: kernel BUG at mm/vmscan.c:510, Alexey Dobriyan, (Thu Jun 12, 12:58 am)
Re: 2.6.26-rc5-mm3: kernel BUG at mm/vmscan.c:510, Andrew Morton, (Thu Jun 12, 1:22 am)
Re: 2.6.26-rc5-mm3: kernel BUG at mm/vmscan.c:510, Alexey Dobriyan, (Thu Jun 12, 1:23 am)
[BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, Kamalesh Babulal, (Thu Jun 12, 1:44 am)
Re: [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, Andrew Morton, (Thu Jun 12, 1:57 am)
Re: [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, KAMEZAWA Hiroyuki, (Thu Jun 12, 4:20 am)
Re: 2.6.26-rc5-mm3, Byron Bradley, (Thu Jun 12, 4:32 pm)
Re: 2.6.26-rc5-mm3, Daniel Walker, (Thu Jun 12, 4:55 pm)
Re: 2.6.26-rc5-mm3, Byron Bradley, (Thu Jun 12, 5:04 pm)
Re: [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, KAMEZAWA Hiroyuki, (Thu Jun 12, 5:25 pm)
[PATCH] fix double unlock_page() in 2.6.26-rc5-mm3 kernel ..., KAMEZAWA Hiroyuki, (Thu Jun 12, 6:44 pm)
Re: [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, Valdis.Kletnieks, (Thu Jun 12, 9:18 pm)
Re: [BUG] 2.6.26-rc5-mm3 kernel BUG at mm/filemap.c:575!, Andrew Morton, (Fri Jun 13, 12:16 am)
Re: [PATCH] fix double unlock_page() in 2.6.26-rc5-mm3 ker ..., KAMEZAWA Hiroyuki, (Mon Jun 16, 7:32 pm)
[PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2.6.26 ..., Daisuke Nishimura, (Tue Jun 17, 12:35 am)
[Bad page] trying to free locked page? (Re: [PATCH][RFC] f ..., Daisuke Nishimura, (Tue Jun 17, 12:47 am)
Re: [Bad page] trying to free locked page? (Re: [PATCH][RF ..., KAMEZAWA Hiroyuki, (Tue Jun 17, 2:03 am)
Re: [Bad page] trying to free locked page? (Re: [PATCH][RF ..., Daisuke Nishimura, (Tue Jun 17, 2:15 am)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Lee Schermerhorn, (Tue Jun 17, 10:46 am)
Re: [Bad page] trying to free locked page? (Re: [PATCH][RF ..., Lee Schermerhorn, (Tue Jun 17, 11:29 am)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Lee Schermerhorn, (Tue Jun 17, 12:28 pm)
[PATCH] unevictable mlocked pages: initialize mm member o ..., Lee Schermerhorn, (Tue Jun 17, 1:00 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., KAMEZAWA Hiroyuki, (Tue Jun 17, 6:13 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Daisuke Nishimura, (Tue Jun 17, 6:26 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Daisuke Nishimura, (Tue Jun 17, 6:54 pm)
[PATCH] migration_entry_wait fix., KAMEZAWA Hiroyuki, (Tue Jun 17, 6:54 pm)
Re: [Bad page] trying to free locked page? (Re: [PATCH][RF ..., Daisuke Nishimura, (Tue Jun 17, 7:32 pm)
Re: [Bad page] trying to free locked page? (Re: [PATCH][RF ..., Daisuke Nishimura, (Tue Jun 17, 7:40 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Daisuke Nishimura, (Tue Jun 17, 7:59 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., Daisuke Nishimura, (Tue Jun 17, 9:41 pm)
Re: [PATCH][RFC] fix kernel BUG at mm/migrate.c:719! in 2. ..., KAMEZAWA Hiroyuki, (Tue Jun 17, 9:59 pm)
Re: [PATCH] migration_entry_wait fix., KOSAKI Motohiro, (Tue Jun 17, 10:26 pm)
Re: [PATCH] migration_entry_wait fix., Nick Piggin, (Tue Jun 17, 10:35 pm)
Re: [PATCH] migration_entry_wait fix., KAMEZAWA Hiroyuki, (Tue Jun 17, 11:04 pm)
Re: [PATCH] migration_entry_wait fix., Nick Piggin, (Tue Jun 17, 11:42 pm)
Re: [PATCH] migration_entry_wait fix., KAMEZAWA Hiroyuki, (Tue Jun 17, 11:52 pm)
Re: [PATCH -mm][BUGFIX] migration_entry_wait fix. v2, KOSAKI Motohiro, (Wed Jun 18, 12:26 am)
[PATCH -mm][BUGFIX] migration_entry_wait fix. v2, KAMEZAWA Hiroyuki, (Wed Jun 18, 12:29 am)
Re: [PATCH -mm][BUGFIX] migration_entry_wait fix. v2, Nick Piggin, (Wed Jun 18, 12:40 am)
[PATCH][-mm] remove redundant page-&gt;mapping check, KOSAKI Motohiro, (Wed Jun 18, 12:54 am)
[Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Wed Jun 18, 2:40 am)
Re: [Experimental][PATCH] putback_lru_page rework, KOSAKI Motohiro, (Wed Jun 18, 4:36 am)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Wed Jun 18, 4:55 am)
Re: [Experimental][PATCH] putback_lru_page rework, Daisuke Nishimura, (Wed Jun 18, 7:50 am)
Re: 2.6.26-rc5-mm3, Daniel Walker, (Wed Jun 18, 10:55 am)
Re: [Experimental][PATCH] putback_lru_page rework, Lee Schermerhorn, (Wed Jun 18, 11:21 am)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Wed Jun 18, 5:22 pm)
[BUG][PATCH -mm] avoid BUG() in __stop_machine_run(), Hidehiro Kawai, (Wed Jun 18, 11:59 pm)
Re: [Experimental][PATCH] putback_lru_page rework, Daisuke Nishimura, (Thu Jun 19, 1:00 am)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Thu Jun 19, 1:24 am)
Re: 2.6.26-rc5-mm3, Ingo Molnar, (Thu Jun 19, 2:13 am)
Re: [BUG][PATCH -mm] avoid BUG() in __stop_machine_run(), Rusty Russell, (Thu Jun 19, 3:12 am)
Re: 2.6.26-rc5-mm3, Daniel Walker, (Thu Jun 19, 7:39 am)
Re: [Experimental][PATCH] putback_lru_page rework, Lee Schermerhorn, (Thu Jun 19, 7:45 am)
Re: Re: [Experimental][PATCH] putback_lru_page rework, kamezawa.hiroyu, (Thu Jun 19, 8:32 am)
Re: [BUG][PATCH -mm] avoid BUG() in __stop_machine_run(), Jeremy Fitzhardinge, (Thu Jun 19, 8:51 am)
Re: 2.6.26-rc5-mm3: BUG large value for HugePages_Rsvd, Jon Tollefson, (Thu Jun 19, 9:27 am)
Re: 2.6.26-rc5-mm3: BUG large value for HugePages_Rsvd, Andy Whitcroft, (Thu Jun 19, 10:16 am)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Thu Jun 19, 5:47 pm)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Thu Jun 19, 6:13 pm)
Re: 2.6.26-rc5-mm3: BUG large value for HugePages_Rsvd, Jon Tollefson, (Thu Jun 19, 8:18 pm)
Re: Re: [Experimental][PATCH] putback_lru_page rework, Lee Schermerhorn, (Fri Jun 20, 9:24 am)
Re: [Experimental][PATCH] putback_lru_page rework, Lee Schermerhorn, (Fri Jun 20, 10:10 am)
Re: [Experimental][PATCH] putback_lru_page rework, Lee Schermerhorn, (Fri Jun 20, 1:41 pm)
Re: [Experimental][PATCH] putback_lru_page rework, KOSAKI Motohiro, (Sat Jun 21, 1:39 am)
Re: [Experimental][PATCH] putback_lru_page rework, KOSAKI Motohiro, (Sat Jun 21, 1:41 am)
Re: [Experimental][PATCH] putback_lru_page rework, KOSAKI Motohiro, (Sat Jun 21, 1:56 am)
Re: [Experimental][PATCH] putback_lru_page rework, KAMEZAWA Hiroyuki, (Sun Jun 22, 5:30 pm)
Re: [BUG][PATCH -mm] avoid BUG() in __stop_machine_run(), Rusty Russell, (Sun Jun 22, 8:55 pm)