linux/arch/x86/mm
Mel Gorman 32b154c0b0 x86: ignore VM_LOCKED when determining if hugetlb-backed page tables can be shared or not
Addresses http://bugzilla.kernel.org/show_bug.cgi?id=13302

On x86 and x86-64, it is possible that page tables are shared beween
shared mappings backed by hugetlbfs.  As part of this,
page_table_shareable() checks a pair of vma->vm_flags and they must match
if they are to be shared.  All VMA flags are taken into account, including
VM_LOCKED.

The problem is that VM_LOCKED is cleared on fork().  When a process with a
shared memory segment forks() to exec() a helper, there will be shared
VMAs with different flags.  The impact is that the shared segment is
sometimes considered shareable and other times not, depending on what
process is checking.

What happens is that the segment page tables are being shared but the
count is inaccurate depending on the ordering of events.  As the page
tables are freed with put_page(), bad pmd's are found when some of the
children exit.  The hugepage counters also get corrupted and the Total and
Free count will no longer match even when all the hugepage-backed regions
are freed.  This requires a reboot of the machine to "fix".

This patch addresses the problem by comparing all flags except VM_LOCKED
when deciding if pagetables should be shared or not for hugetlbfs-backed
mapping.

Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Acked-by: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: <stable@kernel.org>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: <starlight@binnacle.cx>
Cc: Eric B Munson <ebmunson@us.ibm.com>
Cc: Adam Litke <agl@us.ibm.com>
Cc: Andy Whitcroft <apw@canonical.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-05-29 08:40:03 -07:00
..
dump_pagetables.c
extable.c
fault.c
gup.c x86: Document get_user_pages_fast() 2009-04-10 13:14:08 +02:00
highmem_32.c x86, mm: fix misuse of debug_kmap_atomic 2009-04-02 16:37:04 +02:00
hugetlbpage.c x86: ignore VM_LOCKED when determining if hugetlb-backed page tables can be shared or not 2009-05-29 08:40:03 -07:00
init_32.c Merge branch 'x86/core' into tracing/ftrace 2009-03-10 10:17:48 +01:00
init_64.c Merge branch 'x86/core' into tracing/ftrace 2009-03-10 10:17:48 +01:00
init.c x86-64: finish cleanup_highmaps()'s job wrt. _brk_end 2009-05-07 21:51:34 -07:00
iomap_32.c x86: fix is_io_mapping_possible() build warning on i386 allnoconfig 2009-04-03 18:39:05 +02:00
ioremap.c Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-04-17 09:56:11 -07:00
k8topology_64.c
kmmio.c tracing: x86, mmiotrace: fix range test 2009-04-29 11:32:22 +02:00
Makefile x86: unify 32 and 64-bit node_to_cpumask_map 2009-03-13 14:49:52 +10:30
memtest.c x86: make "memtest" like "memtest=17" 2009-03-06 12:16:43 +01:00
mmap.c
mmio-mod.c x86: cpumask: x86 mmio-mod.c use cpumask_var_t for downed_cpus 2009-03-18 13:51:51 +01:00
numa_32.c x86: mm/numa_32.c calculate_numa_remap_pages should use __init 2009-04-17 22:43:13 +02:00
numa_64.c x86: check boundary in setup_node_bootmem() 2009-04-23 09:58:56 +02:00
numa.c cpumask: convert node_to_cpumask_map[] to cpumask_var_t 2009-03-13 14:35:31 +01:00
pageattr-test.c
pageattr.c x86: avoid back to back on_each_cpu in cpa_flush_array 2009-05-26 13:12:12 -07:00
pat.c Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-04-17 09:56:11 -07:00
pf_in.c
pf_in.h
pgtable_32.c x86/32: no need to use set_pte_present in set_pte_vaddr 2009-03-19 14:04:18 +01:00
pgtable.c x86: fix set_fixmap to use phys_addr_t 2009-04-10 20:27:13 +02:00
srat_32.c x86: Fix a typo in a printk message 2009-05-06 12:23:12 +02:00
srat_64.c x86, srat: do not register nodes beyond e820 map 2009-05-06 10:49:07 +02:00
testmmiotrace.c
tlb.c x86: add x2apic_wrmsr_fence() to x2apic flush tlb paths 2009-03-18 09:36:14 +01:00