public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
To: linux-kernel <linux-kernel@vger.kernel.org>,
	stable@kernel.org, Andrew Morton <akpm@linux-foundation.org>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Keir Fraser <keir.fraser@eu.citrix.com>,
	Christophe Saout <christophe@saout.de>,
	Alex Williamson <alex.williamson@hp.com>,
	Nick Piggin <npiggin@suse.de>
Subject: [PATCH] mm: rearrange exit_mmap() to unlock before arch_exit_mmap
Date: Mon, 09 Feb 2009 12:29:48 -0500	[thread overview]
Message-ID: <1234200588.22359.30.camel@lts-notebook> (raw)

From: Jeremy Fitzhardinge <jeremy@goop.org>

Subject: mm: rearrange exit_mmap() to unlock before arch_exit_mmap

Applicable to 29-rc4 and 28-stable

Christophe Saout reported [in precursor to:
http://marc.info/?l=linux-kernel&m=123209902707347&w=4]:

> Note that I also some a different issue with CONFIG_UNEVICTABLE_LRU.
> Seems like Xen tears down current->mm early on process termination, so
> that __get_user_pages in exit_mmap causes nasty messages when the
> process had any mlocked pages.  (in fact, it somehow manages to get into
> the swapping code and produces a null pointer dereference trying to get
> a swap token)

Jeremy explained:

Yes.  In the normal case under Xen, an in-use pagetable is "pinned", 
meaning that it is RO to the kernel, and all updates must go via 
hypercall (or writes are trapped and emulated, which is much the same 
thing).  An unpinned pagetable is not currently in use by any process, 
and can be directly accessed as normal RW pages.

As an optimisation at process exit time, we unpin the pagetable as early 
as possible (switching the process to init_mm), so that all the normal 
pagetable teardown can happen with direct memory accesses.

This happens in exit_mmap() -> arch_exit_mmap().  The munlocking happens 
a few lines below.  The obvious thing to do would be to move 
arch_exit_mmap() to below the munlock code, but I think we'd want to 
call it even if mm->mmap is NULL, just to be on the safe side.

Thus, this patch:

exit_mmap() needs to unlock any locked vmas before calling
arch_exit_mmap, as the latter may switch the current mm to init_mm,
which would cause the former to fail.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by:  Lee Schermerhorn <lee.schermerhorn@hp.com>

---
 mm/mmap.c |   10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

===================================================================
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2078,12 +2078,8 @@
 	unsigned long end;
 
 	/* mm's last user has gone, and its about to be pulled down */
-	arch_exit_mmap(mm);
 	mmu_notifier_release(mm);
 
-	if (!mm->mmap)	/* Can happen if dup_mmap() received an OOM */
-		return;
-
 	if (mm->locked_vm) {
 		vma = mm->mmap;
 		while (vma) {
@@ -2092,7 +2088,13 @@
 			vma = vma->vm_next;
 		}
 	}
+
+	arch_exit_mmap(mm);
+
 	vma = mm->mmap;
+	if (!vma)	/* Can happen if dup_mmap() received an OOM */
+		return;
+
 	lru_add_drain();
 	flush_cache_mm(mm);
 	tlb = tlb_gather_mmu(mm, 1);






             reply	other threads:[~2009-02-09 17:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-09 17:29 Lee Schermerhorn [this message]
2009-02-10 21:31 ` [PATCH] mm: rearrange exit_mmap() to unlock before arch_exit_mmap Andrew Morton
2009-02-10 21:45   ` Lee Schermerhorn

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=1234200588.22359.30.camel@lts-notebook \
    --to=lee.schermerhorn@hp.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.williamson@hp.com \
    --cc=christophe@saout.de \
    --cc=jeremy@goop.org \
    --cc=keir.fraser@eu.citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=npiggin@suse.de \
    --cc=stable@kernel.org \
    /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