• Andrea Arcangeli's avatar
    x86/mm/pageattr: Prevent PSE and GLOABL leftovers to confuse pmd/pte_present and pmd_huge · a8aed3e0
    Andrea Arcangeli authored
    Without this patch any kernel code that reads kernel memory in
    non present kernel pte/pmds (as set by pageattr.c) will crash.
    
    With this kernel code:
    
    static struct page *crash_page;
    static unsigned long *crash_address;
    [..]
    	crash_page = alloc_pages(GFP_KERNEL, 9);
    	crash_address = page_address(crash_page);
    	if (set_memory_np((unsigned long)crash_address, 1))
    		printk("set_memory_np failure\n");
    [..]
    
    The kernel will crash if inside the "crash tool" one would try
    to read the memory at the not present address.
    
    crash> p crash_address
    crash_address = $8 = (long unsigned int *) 0xffff88023c000000
    crash> rd 0xffff88023c000000
    [ *lockup* ]
    
    The lockup happens because _PAGE_GLOBAL and _PAGE_PROTNONE
    shares the same bit, and pageattr leaves _PAGE_GLOBAL set on a
    kernel pte which is then mistaken as _PAGE_PROTNONE (so
    pte_present returns true by mistake and the kernel fault then
    gets confused and loops).
    
    With THP the same can happen after we taught pmd_present to
    check _PAGE_PROTNONE and _PAGE_PSE in commit
    027ef6c8 ("mm: thp: fix pmd_present for
    split_huge_page and PROT_NONE with THP").  THP has the same
    problem with _PAGE_GLOBAL as the 4k pages, but it also has a
    problem with _PAGE_PSE, which must be cleared too.
    
    After the patch is applied copy_user correctly returns -EFAULT
    and doesn't lockup anymore.
    
    crash> p crash_address
    crash_address = $9 = (long unsigned int *) 0xffff88023c000000
    crash> rd 0xffff88023c000000
    rd: read error: kernel virtual address: ffff88023c000000  type:
    "64-bit KVADDR"
    Signed-off-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Shaohua Li <shaohua.li@intel.com>
    Cc: "H. Peter Anvin" <hpa@linux.intel.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    a8aed3e0
pageattr.c 34.7 KB