• Naoya Horiguchi's avatar
    mm: hugetlb: fix hugepage memory leak in walk_page_range() · d33b9f45
    Naoya Horiguchi authored
    Most callers of pmd_none_or_clear_bad() check whether the target page is
    in a hugepage or not, but walk_page_range() do not check it.  So if we
    read /proc/pid/pagemap for the hugepage on x86 machine, the hugepage
    memory is leaked as shown below.  This patch fixes it.
    
    Details
    =======
    My test program (leak_pagemap) works as follows:
     - creat() and mmap() a file on hugetlbfs (file size is 200MB == 100 hugepages,)
     - read()/write() something on it,
     - call page-types with option -p (walk around the page tables),
     - munmap() and unlink() the file on hugetlbfs
    
    Without my patches
    ------------------
    $ cat /proc/meminfo |grep "HugePage"
    HugePages_Total:    1000
    HugePages_Free:     1000
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    $ ./leak_pagemap
    [snip output]
    $ cat /proc/meminfo |grep "HugePage"
    HugePages_Total:    1000
    HugePages_Free:      900
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    $ ls /hugetlbfs/
    $
    
    100 hugepages are accounted as used while there is no file on hugetlbfs.
    
    With my patches
    ---------------
    $ cat /proc/meminfo |grep "HugePage"
    HugePages_Total:    1000
    HugePages_Free:     1000
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    $ ./leak_pagemap
    [snip output]
    $ cat /proc/meminfo |grep "HugePage"
    HugePages_Total:    1000
    HugePages_Free:     1000
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    $ ls /hugetlbfs
    $
    
    No memory leaks.
    Signed-off-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Wu Fengguang <fengguang.wu@intel.com>
    Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
    Cc: Andy Whitcroft <apw@canonical.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d33b9f45
pagewalk.c 3.52 KB