Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: rearrange exit_mmap() to unlock before arch_exit_mmap

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>
Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Christophe Saout <christophe@saout.de>
Cc: Keir Fraser <keir.fraser@eu.citrix.com>
Cc: Christophe Saout <christophe@saout.de>
Cc: Alex Williamson <alex.williamson@hp.com>
Cc: <stable@kernel.org> [2.6.28.x]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Jeremy Fitzhardinge and committed by
Linus Torvalds
9480c53e 3abdbf90

+6 -4
+6 -4
mm/mmap.c
··· 2084 2084 unsigned long end; 2085 2085 2086 2086 /* mm's last user has gone, and its about to be pulled down */ 2087 - arch_exit_mmap(mm); 2088 2087 mmu_notifier_release(mm); 2089 - 2090 - if (!mm->mmap) /* Can happen if dup_mmap() received an OOM */ 2091 - return; 2092 2088 2093 2089 if (mm->locked_vm) { 2094 2090 vma = mm->mmap; ··· 2094 2098 vma = vma->vm_next; 2095 2099 } 2096 2100 } 2101 + 2102 + arch_exit_mmap(mm); 2103 + 2097 2104 vma = mm->mmap; 2105 + if (!vma) /* Can happen if dup_mmap() received an OOM */ 2106 + return; 2107 + 2098 2108 lru_add_drain(); 2099 2109 flush_cache_mm(mm); 2100 2110 tlb = tlb_gather_mmu(mm, 1);