kernel_optimize_test/mm
Toshi Kani 0f616be120 mm: change __get_vm_area_node() to use fls_long()
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: Toshi 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-04-14 16:49:04 -07:00
..
kasan kasan, module, vmalloc: rework shadow allocation for modules 2015-03-12 18:46:08 -07:00
backing-dev.c
balloon_compaction.c
bootmem.c
cleancache.c cleancache: remove limit on the number of cleancache enabled filesystems 2015-04-14 16:49:03 -07:00
cma_debug.c mm-cma-allocation-trigger-fix 2015-04-14 16:49:00 -07:00
cma.c mm: cma: constify and use correct signness in mm/cma.c 2015-04-14 16:49:04 -07:00
cma.h mm: cma: allocation trigger 2015-04-14 16:49:00 -07:00
compaction.c mm/compaction: enhance compaction finish condition 2015-04-14 16:49:01 -07:00
debug-pagealloc.c
debug.c
dmapool.c
early_ioremap.c
fadvise.c
failslab.c
filemap.c page_writeback: clean up mess around cancel_dirty_page() 2015-04-14 16:49:01 -07:00
frontswap.c
gup.c mm: move mm_populate()-related code to mm/gup.c 2015-04-14 16:49:00 -07:00
highmem.c
huge_memory.c mm, thp: really limit transparent hugepage allocation to local node 2015-04-14 16:49:03 -07:00
hugetlb_cgroup.c
hugetlb.c mm/hugetlb: use pmd_page() in follow_huge_pmd() 2015-04-14 16:48:56 -07:00
hwpoison-inject.c
init-mm.c
internal.h mm/compaction: enhance compaction finish condition 2015-04-14 16:49:01 -07:00
interval_tree.c
Kconfig mm: cma: debugfs interface 2015-04-14 16:49:00 -07:00
Kconfig.debug
kmemcheck.c
kmemleak-test.c
kmemleak.c
ksm.c
list_lru.c
maccess.c
madvise.c
Makefile mm: cma: debugfs interface 2015-04-14 16:49:00 -07:00
memblock.c mm/memblock.c: rename local variable of memblock_type to `type' 2015-04-14 16:49:00 -07:00
memcontrol.c mm: memcontrol: update copyright notice 2015-04-14 16:49:00 -07:00
memory_hotplug.c mm, hotplug: fix concurrent memory hot-add deadlock 2015-04-14 16:49:00 -07:00
memory-failure.c
memory.c mm: refactor do_wp_page handling of shared vma into a function 2015-04-14 16:49:03 -07:00
mempolicy.c mm, thp: really limit transparent hugepage allocation to local node 2015-04-14 16:49:03 -07:00
mempool.c
migrate.c mm/migrate: mark unmap_and_move() "noinline" to avoid ICE in gcc 4.7.3 2015-04-14 16:48:59 -07:00
mincore.c
mlock.c mm: move mm_populate()-related code to mm/gup.c 2015-04-14 16:49:00 -07:00
mm_init.c
mmap.c mm: rename __mlock_vma_pages_range() to populate_vma_page_range() 2015-04-14 16:49:00 -07:00
mmu_context.c
mmu_notifier.c
mmzone.c
mprotect.c mm: numa: preserve PTE write permissions across a NUMA hinting fault 2015-03-25 16:20:31 -07:00
mremap.c fix mremap() vs. ioctx_kill() race 2015-04-06 17:50:59 -04:00
msync.c
nobootmem.c
nommu.c mm/nommu.c: export symbol max_mapnr 2015-03-12 18:46:08 -07:00
oom_kill.c
page_alloc.c mm/page_alloc.c: clean up comment 2015-04-14 16:49:04 -07:00
page_counter.c
page_ext.c
page_io.c
page_isolation.c mm/page_alloc.c: call kernel_map_pages in unset_migrateype_isolate 2015-03-25 16:20:30 -07:00
page_owner.c
page-writeback.c page_writeback: clean up mess around cancel_dirty_page() 2015-04-14 16:49:01 -07:00
pagewalk.c mm/pagewalk.c: prevent positive return value of walk_page_test() from being passed to callers 2015-03-25 16:20:30 -07:00
percpu-km.c
percpu-vm.c
percpu.c percpu: Fix trivial typos in comments 2015-03-24 13:41:54 -04:00
pgtable-generic.c
process_vm_access.c
quicklist.c
readahead.c
rmap.c mm: fix anon_vma->degree underflow in anon_vma endless growing prevention 2015-03-25 16:20:30 -07:00
shmem.c mm: shmem: check for mapping owner before dereferencing 2015-02-23 10:00:11 -08:00
slab_common.c
slab.c mm: remove GFP_THISNODE 2015-04-14 16:49:03 -07:00
slab.h
slob.c slob: make slob_alloc_node() static and remove EXPORT_SYMBOL() 2015-04-14 16:48:59 -07:00
slub.c slub: use bool function return values of true/false not 1/0 2015-04-14 16:48:59 -07:00
sparse-vmemmap.c
sparse.c
swap_cgroup.c
swap_state.c
swap.c
swapfile.c
truncate.c page_writeback: clean up mess around cancel_dirty_page() 2015-04-14 16:49:01 -07:00
util.c
vmacache.c
vmalloc.c mm: change __get_vm_area_node() to use fls_long() 2015-04-14 16:49:04 -07:00
vmpressure.c
vmscan.c
vmstat.c
workingset.c
zbud.c
zpool.c
zsmalloc.c
zswap.c