Skip to content
  • Toshi Kani's avatar
    mm: change __get_vm_area_node() to use fls_long() · 0f616be1
    Toshi Kani authored
    
    
    ioremap() and its related interfaces are used to create I/O mappings to
    memory-mapped I/O devices.  The mapping sizes of the traditional I/O
    devices are relatively small.  Non-volatile memory (NVM), however, has
    many GB and is going to have TB soon.  It is not very efficient to create
    large I/O mappings with 4KB.
    
    This patchset extends the ioremap() interfaces to transparently create I/O
    mappings with huge pages whenever possible.  ioremap() continues to use
    4KB mappings when a huge page does not fit into a requested range.  There
    is no change necessary to the drivers using ioremap().  A requested
    physical address must be aligned by a huge page size (1GB or 2MB on x86)
    for using huge page mapping, though.  The kernel huge I/O mapping will
    improve performance of NVM and other devices with large memory, and reduce
    the time to create their mappings as well.
    
    On x86, MTRRs can override PAT memory types with a 4KB granularity.  When
    using a huge page, MTRRs can override the memory type of the huge page,
    which may lead a performance penalty.  The processor can also behave in an
    undefined manner if a huge page is mapped to a memory range that MTRRs
    have mapped with multiple different memory types.  Therefore, the mapping
    code falls back to use a smaller page size toward 4KB when a mapping range
    is covered by non-WB type of MTRRs.  The WB type of MTRRs has no affect on
    the PAT memory types.
    
    The patchset introduces HAVE_ARCH_HUGE_VMAP, which indicates that the arch
    supports huge KVA mappings for ioremap().  User may specify a new kernel
    option "nohugeiomap" to disable the huge I/O mapping capability of
    ioremap() when necessary.
    
    Patch 1-4 change common files to support huge I/O mappings.  There is no
    change in the functinalities unless HAVE_ARCH_HUGE_VMAP is defined on the
    architecture of the system.
    
    Patch 5-6 implement the HAVE_ARCH_HUGE_VMAP funcs on x86, and set
    HAVE_ARCH_HUGE_VMAP on x86.
    
    This patch (of 6):
    
    __get_vm_area_node() takes unsigned long size, which is a 64-bit value on
    a 64-bit kernel.  However, fls(size) simply ignores the upper 32-bit.
    Change to use fls_long() to handle the size properly.
    
    Signed-off-by: default avatarToshi Kani <toshi.kani@hp.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Robert Elliott <Elliott@hp.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0f616be1