• Mel Gorman's avatar
    x86: ignore VM_LOCKED when determining if hugetlb-backed page tables can be shared or not · 32b154c0
    Mel Gorman authored
    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: default avatarMel Gorman <mel@csn.ul.ie>
    Acked-by: default avatarHugh 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: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    32b154c0
hugetlbpage.c 10.5 KB