Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Mark Fasheh
Date: Thursday, May 31, 2007 - 10:20 pm

On Fri, Jun 01, 2007 at 03:53:49AM +0200, Nick Piggin wrote:

Ok. So how about the attached patch? It's a bit different than discussed,
but I think it's much cleaner because it preserves the current behavior of
the callback and keeps that bit of page locking inside core code. Not tested
as of yet, but I can run it tommorrow.
	--Mark

--
Mark Fasheh
Senior Software Developer, Oracle
mark.fasheh@oracle.com

From: Mark Fasheh <mark.fasheh@oracle.com>

[PATCH] Release page lock before calling ->page_mkwrite

__do_fault() was calling ->page_mkwrite() with the page lock held, which
violates the locking rules for that callback. Release and retake the page
lock around the callback to avoid deadlocking file systems which manually
take it.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
---
 mm/memory.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/mm/memory.c b/mm/memory.c
index 7221618..491cc27 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2378,11 +2378,14 @@ static int __do_fault(struct mm_struct *
 			 * address space wants to know that the page is about
 			 * to become writable
 			 */
-			if (vma->vm_ops->page_mkwrite &&
-			    vma->vm_ops->page_mkwrite(vma, page) < 0) {
-				fdata.type = VM_FAULT_SIGBUS;
-				anon = 1; /* no anon but release faulted_page */
-				goto out;
+			if (vma->vm_ops->page_mkwrite) {
+				unlock_page(page);
+				if (vma->vm_ops->page_mkwrite(vma, page) < 0) {
+					fdata.type = VM_FAULT_SIGBUS;
+					anon = 1; /* no anon but release faulted_page */
+					goto out_unlocked;
+				}
+				lock_page(page);
 			}
 		}
 
@@ -2434,6 +2437,7 @@ static int __do_fault(struct mm_struct *
 
 out:
 	unlock_page(faulted_page);
+out_unlocked:
 	if (anon)
 		page_cache_release(faulted_page);
 	else if (dirty_page) {
-- 
1.4.2.3

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

Messages in current thread:
2.6.22-rc3-mm1, Andrew Morton, (Wed May 30, 11:58 pm)
Re: 2.6.22-rc3-mm1, Cornelia Huck, (Thu May 31, 5:09 am)
Re: 2.6.22-rc3-mm1, Matthew Wilcox, (Thu May 31, 5:15 am)
Re: 2.6.22-rc3-mm1, Cornelia Huck, (Thu May 31, 5:20 am)
Re: 2.6.22-rc3-mm1, Jeff Garzik, (Thu May 31, 5:35 am)
Re: 2.6.22-rc3-mm1, Cornelia Huck, (Thu May 31, 8:11 am)
Re: 2.6.22-rc3-mm1, Christoph Hellwig, (Thu May 31, 8:13 am)
Re: 2.6.22-rc3-mm1, Michal Piotrowski, (Thu May 31, 8:29 am)
Re: 2.6.22-rc3-mm1, Michal Piotrowski, (Thu May 31, 10:53 am)
Re: 2.6.22-rc3-mm1, Michal Piotrowski, (Thu May 31, 11:08 am)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Thu May 31, 11:31 am)
Re: 2.6.22-rc3-mm1, Christoph Lameter, (Thu May 31, 11:41 am)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Thu May 31, 11:53 am)
Re: 2.6.22-rc3-mm1, Christoph Lameter, (Thu May 31, 11:57 am)
Re: 2.6.22-rc3-mm1, Rafael J. Wysocki, (Thu May 31, 12:58 pm)
Re: 2.6.22-rc3-mm1, Mariusz Kozlowski, (Thu May 31, 1:43 pm)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Thu May 31, 2:19 pm)
[PATCH -mm] Freezer: migration_thread should not be freeza ..., Rafael J. Wysocki, (Thu May 31, 2:30 pm)
Re: 2.6.22-rc3-mm1 - works-for-me and a meta-question..., Valdis.Kletnieks, (Thu May 31, 3:05 pm)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Thu May 31, 3:10 pm)
Re: 2.6.22-rc3-mm1 - works-for-me and a meta-question..., Andrew Morton, (Thu May 31, 3:16 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Thu May 31, 4:13 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Nick Piggin, (Thu May 31, 6:01 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Thu May 31, 6:24 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Nick Piggin, (Thu May 31, 6:34 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Thu May 31, 6:45 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Nick Piggin, (Thu May 31, 6:53 pm)
Re: 2.6.22-rc3-mm1, Arnaldo Carvalho de Melo, (Thu May 31, 7:01 pm)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Thu May 31, 7:12 pm)
Re: 2.6.22-rc3-mm1, Arnaldo Carvalho de Melo, (Thu May 31, 7:24 pm)
Re: 2.6.22-rc3-mm1, Michael Ellerman, (Thu May 31, 8:52 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Thu May 31, 10:20 pm)
Re: 2.6.22-rc3-mm1, Eric W. Biederman, (Thu May 31, 10:55 pm)
Re: 2.6.22-rc3-mm1, Cornelia Huck, (Fri Jun 1, 12:09 am)
2.6.22-rc3-mm1: IA64 make allnoconfig broken, Mel Gorman, (Fri Jun 1, 9:42 am)
Re: 2.6.22-rc3-mm1: IA64 make allnoconfig broken, Andrew Morton, (Fri Jun 1, 10:00 am)
Re: 2.6.22-rc3-mm1: IA64 make allnoconfig broken, Mel Gorman, (Fri Jun 1, 11:50 am)
Re: 2.6.22-rc3-mm1, Mariusz Kozlowski, (Fri Jun 1, 1:50 pm)
[PATCH] Fix problem with IA64 make allnoconfig, Mel Gorman, (Fri Jun 1, 1:55 pm)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Fri Jun 1, 2:02 pm)
Re: 2.6.22-rc3-mm1, Mariusz Kozlowski, (Fri Jun 1, 2:21 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Fri Jun 1, 3:01 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Andrew Morton, (Fri Jun 1, 3:25 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Fri Jun 1, 3:33 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Andrew Morton, (Fri Jun 1, 3:47 pm)
Re: 2.6.22-rc3-mm1 - page_mkwrite() breakage, Mark Fasheh, (Fri Jun 1, 3:53 pm)
Re: 2.6.22-rc3-mm1, Benjamin Herrenschmidt, (Fri Jun 1, 4:30 pm)
Re: 2.6.22-rc3-mm1, Segher Boessenkool, (Sat Jun 2, 1:40 am)
2.6.22-rc3-mm1: Xen compile error with X86_CMPXCHG=n, Adrian Bunk, (Sat Jun 2, 6:57 am)
[-mm patch] fix XEN_BLKDEV_FRONTEND Makefile entry, Adrian Bunk, (Sat Jun 2, 10:06 am)
[-mm patch] make xpad_play_effect() static, Adrian Bunk, (Sun Jun 3, 1:54 pm)
[-mm patch] fix the tea5761 tuner support, Adrian Bunk, (Sun Jun 3, 1:54 pm)
[-mm patch] e1000: #if 0 two functions, Adrian Bunk, (Mon Jun 4, 3:12 pm)
[-mm patch] drivers/mmc/core/core.{h,c}: cleanups, Adrian Bunk, (Mon Jun 4, 3:13 pm)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:11 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:18 am)
Re: 2.6.22-rc3-mm1, Andrew Morton, (Tue Jun 5, 2:24 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:33 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:39 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:42 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:45 am)
Re: 2.6.22-rc3-mm1, Ingo Molnar, (Tue Jun 5, 2:50 am)
Re: 2.6.22-rc3 nmi watchdog hang, Ingo Molnar, (Tue Jun 5, 2:56 am)
Re: 2.6.22-rc3-mm1, Rusty Russell, (Tue Jun 5, 8:16 am)
[-mm patch] kernel/power/disk.c: make code static, Adrian Bunk, (Tue Jun 5, 2:50 pm)
[-mm patch] kernel/sched{,_fair}.c: make code static, Adrian Bunk, (Tue Jun 5, 2:50 pm)
[-mm patch] fs/proc/base.c: make a struct static, Adrian Bunk, (Tue Jun 5, 2:51 pm)
Re: [-mm patch] kernel/power/disk.c: make code static, Rafael J. Wysocki, (Tue Jun 5, 3:10 pm)
Re: [-mm patch] kernel/sched{,_fair}.c: make code static, Andrew Morton, (Tue Jun 5, 11:54 pm)
Re: [-mm patch] fs/proc/base.c: make a struct static, Ingo Molnar, (Wed Jun 6, 12:32 am)
Re: [-mm patch] drivers/mmc/core/core.{h,c}: cleanups, Pierre Ossman, (Wed Jun 6, 11:36 am)
Re: 2.6.22-rc3 nmi watchdog hang, Björn, (Sun Jun 10, 11:10 am)
Re: 2.6.22-rc3 nmi watchdog hang, Ingo Molnar, (Mon Jun 18, 5:11 am)
Re: 2.6.22-rc3 nmi watchdog hang, Björn, (Mon Jun 18, 7:31 am)
Re: 2.6.22-rc3 nmi watchdog hang, Ingo Molnar, (Sun Jun 24, 11:18 pm)
Re: 2.6.22-rc3 nmi watchdog hang, Ingo Molnar, (Sun Jun 24, 11:59 pm)
[patch, 2.6.22-rc6] fix nmi_watchdog=2 bootup hang, Ingo Molnar, (Mon Jun 25, 1:05 am)
Re: [patch, 2.6.22-rc6] fix nmi_watchdog=2 bootup hang, Ingo Molnar, (Mon Jun 25, 1:26 am)
Re: [patch, 2.6.22-rc6] fix nmi_watchdog=2 bootup hang, Jeremy Fitzhardinge, (Mon Jun 25, 5:40 am)
Re: [patch, 2.6.22-rc6] fix nmi_watchdog=2 bootup hang, Jeremy Fitzhardinge, (Mon Jun 25, 5:49 am)
Re: 2.6.22-rc3-mm1: Xen compile error with X86_CMPXCHG=n, Jeremy Fitzhardinge, (Thu Jun 28, 8:21 pm)