• Vitaly Kuznetsov's avatar
    fs/proc/vmcore.c:mmap_vmcore: skip non-ram pages reported by hypervisors · 0692dedc
    Vitaly Kuznetsov authored
    We have a special check in read_vmcore() handler to check if the page was
    reported as ram or not by the hypervisor (pfn_is_ram()).  However, when
    vmcore is read with mmap() no such check is performed.  That can lead to
    unpredictable results, e.g.  when running Xen PVHVM guest memcpy() after
    mmap() on /proc/vmcore will hang processing HVMMEM_mmio_dm pages creating
    enormous load in both DomU and Dom0.
    
    Fix the issue by mapping each non-ram page to the zero page.  Keep direct
    path with remap_oldmem_pfn_range() to avoid looping through all pages on
    bare metal.
    
    The issue can also be solved by overriding remap_oldmem_pfn_range() in
    xen-specific code, as remap_oldmem_pfn_range() was been designed for.
    That, however, would involve non-obvious xen code path for all x86 builds
    with CONFIG_XEN_PVHVM=y and would prevent all other hypervisor-specific
    code on x86 arch from doing the same override.
    
    [fengguang.wu@intel.com: remap_oldmem_pfn_checked() can be static]
    [akpm@linux-foundation.org: clean up layout]
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
    Cc: Michael Holzheu <holzheu@linux.vnet.ibm.com>
    Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Cc: David Vrabel <david.vrabel@citrix.com>
    Signed-off-by: default avatarFengguang Wu <fengguang.wu@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0692dedc
vmcore.c 29.8 KB