• Cliff Wickman's avatar
    mm/pagewalk.c: walk_page_range should avoid VM_PFNMAP areas · a9ff785e
    Cliff Wickman authored
    A panic can be caused by simply cat'ing /proc/<pid>/smaps while an
    application has a VM_PFNMAP range.  It happened in-house when a
    benchmarker was trying to decipher the memory layout of his program.
    
    /proc/<pid>/smaps and similar walks through a user page table should not
    be looking at VM_PFNMAP areas.
    
    Certain tests in walk_page_range() (specifically split_huge_page_pmd())
    assume that all the mapped PFN's are backed with page structures.  And
    this is not usually true for VM_PFNMAP areas.  This can result in panics
    on kernel page faults when attempting to address those page structures.
    
    There are a half dozen callers of walk_page_range() that walk through a
    task's entire page table (as N.  Horiguchi pointed out).  So rather than
    change all of them, this patch changes just walk_page_range() to ignore
    VM_PFNMAP areas.
    
    The logic of hugetlb_vma() is moved back into walk_page_range(), as we
    want to test any vma in the range.
    
    VM_PFNMAP areas are used by:
    - graphics memory manager   gpu/drm/drm_gem.c
    - global reference unit     sgi-gru/grufile.c
    - sgi special memory        char/mspec.c
    - and probably several out-of-tree modules
    
    [akpm@linux-foundation.org: remove now-unused hugetlb_vma() stub]
    Signed-off-by: default avatarCliff Wickman <cpw@sgi.com>
    Reviewed-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: David Sterba <dsterba@suse.cz>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a9ff785e
pagewalk.c 5.88 KB