Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked fromtorvalds/linux

Commit0f616be

Browse files
Toshi Kanitorvalds
Toshi Kani
authored andcommitted
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

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

‎mm/vmalloc.c‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include<linux/atomic.h>
3030
#include<linux/compiler.h>
3131
#include<linux/llist.h>
32+
#include<linux/bitops.h>
3233

3334
#include<asm/uaccess.h>
3435
#include<asm/tlbflush.h>
@@ -1314,7 +1315,8 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
13141315

13151316
BUG_ON(in_interrupt());
13161317
if (flags&VM_IOREMAP)
1317-
align=1ul <<clamp(fls(size),PAGE_SHIFT,IOREMAP_MAX_ORDER);
1318+
align=1ul <<clamp_t(int,fls_long(size),
1319+
PAGE_SHIFT,IOREMAP_MAX_ORDER);
13181320

13191321
size=PAGE_ALIGN(size);
13201322
if (unlikely(!size))

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp