• Dave Hansen's avatar
    x86, mm: Create slow_virt_to_phys() · d7656534
    Dave Hansen authored
    This is necessary because __pa() does not work on some kinds of
    memory, like vmalloc() or the alloc_remap() areas on 32-bit
    NUMA systems.  We have some functions to do conversions _like_
    this in the vmalloc() code (like vmalloc_to_page()), but they
    do not work on sizes other than 4k pages.  We would potentially
    need to be able to handle all the page sizes that we use for
    the kernel linear mapping (4k, 2M, 1G).
    
    In practice, on 32-bit NUMA systems, the percpu areas get stuck
    in the alloc_remap() area.  Any __pa() call on them will break
    and basically return garbage.
    
    This patch introduces a new function slow_virt_to_phys(), which
    walks the kernel page tables on x86 and should do precisely
    the same logical thing as __pa(), but actually work on a wider
    range of memory.  It should work on the normal linear mapping,
    vmalloc(), kmap(), etc...
    Signed-off-by: default avatarDave Hansen <dave@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/20130122212433.4D1FCA62@kernel.stglabs.ibm.comAcked-by: default avatarRik van Riel <riel@redhat.com>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    d7656534
pgtable_types.h 11.7 KB