forked fromtorvalds/linux
- Notifications
You must be signed in to change notification settings - Fork1
Commit0f616be
mm: change __get_vm_area_node() to use fls_long()
ioremap() and its related interfaces are used to create I/O mappings tomemory-mapped I/O devices. The mapping sizes of the traditional I/Odevices are relatively small. Non-volatile memory (NVM), however, hasmany GB and is going to have TB soon. It is not very efficient to createlarge I/O mappings with 4KB.This patchset extends the ioremap() interfaces to transparently create I/Omappings with huge pages whenever possible. ioremap() continues to use4KB mappings when a huge page does not fit into a requested range. Thereis no change necessary to the drivers using ioremap(). A requestedphysical 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 willimprove performance of NVM and other devices with large memory, and reducethe time to create their mappings as well.On x86, MTRRs can override PAT memory types with a 4KB granularity. Whenusing 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 anundefined manner if a huge page is mapped to a memory range that MTRRshave mapped with multiple different memory types. Therefore, the mappingcode falls back to use a smaller page size toward 4KB when a mapping rangeis covered by non-WB type of MTRRs. The WB type of MTRRs has no affect onthe PAT memory types.The patchset introduces HAVE_ARCH_HUGE_VMAP, which indicates that the archsupports huge KVA mappings for ioremap(). User may specify a new kerneloption "nohugeiomap" to disable the huge I/O mapping capability ofioremap() when necessary.Patch 1-4 change common files to support huge I/O mappings. There is nochange in the functinalities unless HAVE_ARCH_HUGE_VMAP is defined on thearchitecture of the system.Patch 5-6 implement the HAVE_ARCH_HUGE_VMAP funcs on x86, and setHAVE_ARCH_HUGE_VMAP on x86.This patch (of 6):__get_vm_area_node() takes unsigned long size, which is a 64-bit value ona 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>1 parent42ff270 commit0f616be
1 file changed
+3
-1
lines changedOriginal file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
29 | 29 |
| |
30 | 30 |
| |
31 | 31 |
| |
| 32 | + | |
32 | 33 |
| |
33 | 34 |
| |
34 | 35 |
| |
| |||
1314 | 1315 |
| |
1315 | 1316 |
| |
1316 | 1317 |
| |
1317 |
| - | |
| 1318 | + | |
| 1319 | + | |
1318 | 1320 |
| |
1319 | 1321 |
| |
1320 | 1322 |
| |
|
0 commit comments
Comments
(0)