* [PATCH 0/7] Add pseudo-anonymous huge page mappings V3
@ 2009-09-18 12:21 Eric B Munson
2009-09-18 12:21 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson
0 siblings, 1 reply; 13+ messages in thread
From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw)
To: linux-kernel, linux-mm, akpm
Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu,
shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris,
linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc,
linux-arch, Eric B Munson
This patch set adds a flag to mmap that allows the user to request
a mapping to be backed with huge pages. This mapping will borrow
functionality from the huge page shm code to create a file on the
kernel internal mount and use it to approximate an anonymous mapping.
The MAP_HUGETLB flag is a modifier to MAP_ANONYMOUS and will not work
without both flags being preset.
A new flag is necessary because there is no other way to hook into
huge pages without creating a file on a hugetlbfs mount which
wouldn't be MAP_ANONYMOUS.
To userspace, this mapping will behave just like an anonymous mapping
because the file is not accessible outside of the kernel.
This patch set is meant to simplify the programming model, presently
there is a large chunk of boiler plate code, contained in libhugetlbfs,
required to create private, hugepage backed mappings. This patch set
would allow use of hugepages without linking to libhugetlbfs or having
hugetblfs mounted.
Unification of the VM code would provide these same benefits, but it
has been resisted each time that it has been suggested for several
reasons: it would break PAGE_SIZE assumptions across the kernel, it
makes page-table abstractions really expensive, and it does not
provide any benefit on architectures that do not support huge pages,
incurring fast path penalties without providing any benefit on these
architectures.
This verion includes the fixes posted to linux-mm as well as additions
to mman.h for the four archtiectures that do not make use of
mman-common.h. The addition of the MAP_HUGETLB flag to these four
(xtensa, parisc, alpha, and mips) is required because MAP_HUGETLB is
used in common vm code.
Eric B Munson (7):
hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on
the vfs internal mount
Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions
Add MAP_HUGETLB example
Add MAP_HUGETLB flag to alpha mman.h
Add MAP_HUGETLB flag to xtensa mman.h
Add MAP_HUGETLB flag to parisc mman.h
Add MAP_HUGETLB flag to mips mman.h
Documentation/vm/00-INDEX | 2 +
Documentation/vm/hugetlbpage.txt | 14 ++++---
Documentation/vm/map_hugetlb.c | 77 +++++++++++++++++++++++++++++++++++++
arch/alpha/include/asm/mman.h | 6 +++
arch/mips/include/asm/mman.h | 6 +++
arch/parisc/include/asm/mman.h | 7 +++
arch/xtensa/include/asm/mman.h | 6 +++
fs/hugetlbfs/inode.c | 13 +++++-
include/asm-generic/mman-common.h | 1 +
include/linux/hugetlb.h | 19 ++++++++-
ipc/shm.c | 2 +-
mm/mmap.c | 19 +++++++++
12 files changed, 160 insertions(+), 12 deletions(-)
create mode 100644 Documentation/vm/map_hugetlb.c
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount 2009-09-18 12:21 [PATCH 0/7] Add pseudo-anonymous huge page mappings V3 Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions Eric B Munson 2009-09-18 12:37 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson 0 siblings, 2 replies; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson There are two means of creating mappings backed by huge pages: 1. mmap() a file created on hugetlbfs 2. Use shm which creates a file on an internal mount which essentially maps it MAP_SHARED The internal mount is only used for shared mappings but there is very little that stops it being used for private mappings. This patch extends hugetlbfs_file_setup() to deal with the creation of files that will be mapped MAP_PRIVATE on the internal hugetlbfs mount. This extended API is used in a subsequent patch to implement the MAP_HUGETLB mmap() flag. Signed-off-by: Eric Munson <ebmunson@us.ibm.com> --- fs/hugetlbfs/inode.c | 13 ++++++++++--- include/linux/hugetlb.h | 12 ++++++++++-- ipc/shm.c | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a93b885..0837fea 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -507,6 +507,13 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid, inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; INIT_LIST_HEAD(&inode->i_mapping->private_list); info = HUGETLBFS_I(inode); + /* + * The policy is initialized here even if we are creating a + * private inode because initialization simply creates an + * an empty rb tree and calls spin_lock_init(), later when we + * call mpol_free_shared_policy() it will just return because + * the rb tree will still be empty. + */ mpol_shared_policy_init(&info->policy, NULL); switch (mode & S_IFMT) { default: @@ -931,13 +938,13 @@ static struct file_system_type hugetlbfs_fs_type = { static struct vfsmount *hugetlbfs_vfsmount; -static int can_do_hugetlb_shm(void) +static int can_do_hugetlb_shm() { return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); } struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, - struct user_struct **user) + struct user_struct **user, int creat_flags) { int error = -ENOMEM; struct file *file; @@ -949,7 +956,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, if (!hugetlbfs_vfsmount) return ERR_PTR(-ENOENT); - if (!can_do_hugetlb_shm()) { + if (creat_flags == HUGETLB_SHMFS_INODE && !can_do_hugetlb_shm()) { *user = current_user(); if (user_shm_lock(size, *user)) { WARN_ONCE(1, diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 5cbc620..38bb552 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -110,6 +110,14 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) #endif /* !CONFIG_HUGETLB_PAGE */ +enum { + /* + * The file will be used as an shm file so shmfs accounting rules + * apply + */ + HUGETLB_SHMFS_INODE = 1, +}; + #ifdef CONFIG_HUGETLBFS struct hugetlbfs_config { uid_t uid; @@ -148,7 +156,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) extern const struct file_operations hugetlbfs_file_operations; extern struct vm_operations_struct hugetlb_vm_ops; struct file *hugetlb_file_setup(const char *name, size_t size, int acct, - struct user_struct **user); + struct user_struct **user, int creat_flags); int hugetlb_get_quota(struct address_space *mapping, long delta); void hugetlb_put_quota(struct address_space *mapping, long delta); @@ -170,7 +178,7 @@ static inline void set_file_hugepages(struct file *file) #define is_file_hugepages(file) 0 #define set_file_hugepages(file) BUG() -#define hugetlb_file_setup(name,size,acct,user) ERR_PTR(-ENOSYS) +#define hugetlb_file_setup(name,size,acct,user,creat) ERR_PTR(-ENOSYS) #endif /* !CONFIG_HUGETLBFS */ diff --git a/ipc/shm.c b/ipc/shm.c index 30162a5..9eb1488 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -370,7 +370,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) if (shmflg & SHM_NORESERVE) acctflag = VM_NORESERVE; file = hugetlb_file_setup(name, size, acctflag, - &shp->mlock_user); + &shp->mlock_user, HUGETLB_SHMFS_INODE); } else { /* * Do not allow no accounting for OVERCOMMIT_NEVER, even -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions 2009-09-18 12:21 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 3/7] Add MAP_HUGETLB example Eric B Munson 2009-09-18 20:08 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions David Rientjes 2009-09-18 12:37 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson 1 sibling, 2 replies; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson This patch adds a flag for mmap that will be used to request a huge page region that will look like anonymous memory to user space. This is accomplished by using a file on the internal vfsmount. MAP_HUGETLB is a modifier of MAP_ANONYMOUS and so must be specified with it. The region will behave the same as a MAP_ANONYMOUS region using small pages. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- include/asm-generic/mman-common.h | 1 + include/linux/hugetlb.h | 7 +++++++ mm/mmap.c | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 0 deletions(-) diff --git a/include/asm-generic/mman-common.h b/include/asm-generic/mman-common.h index 3b69ad3..e6adb68 100644 --- a/include/asm-generic/mman-common.h +++ b/include/asm-generic/mman-common.h @@ -19,6 +19,7 @@ #define MAP_TYPE 0x0f /* Mask for type of mapping */ #define MAP_FIXED 0x10 /* Interpret addr exactly */ #define MAP_ANONYMOUS 0x20 /* don't use a file */ +#define MAP_HUGETLB 0x080000 /* create a huge page mapping */ #define MS_ASYNC 1 /* sync memory asynchronously */ #define MS_INVALIDATE 2 /* invalidate the caches */ diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 38bb552..b0bc0fd 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -110,12 +110,19 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) #endif /* !CONFIG_HUGETLB_PAGE */ +#define HUGETLB_ANON_FILE "anon_hugepage" + enum { /* * The file will be used as an shm file so shmfs accounting rules * apply */ HUGETLB_SHMFS_INODE = 1, + /* + * The file is being created on the internal vfs mount and shmfs + * accounting rules do not apply + */ + HUGETLB_ANONHUGE_INODE = 2, }; #ifdef CONFIG_HUGETLBFS diff --git a/mm/mmap.c b/mm/mmap.c index 8101de4..9ca4f26 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -29,6 +29,7 @@ #include <linux/rmap.h> #include <linux/mmu_notifier.h> #include <linux/perf_counter.h> +#include <linux/hugetlb.h> #include <asm/uaccess.h> #include <asm/cacheflush.h> @@ -951,6 +952,24 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, if (mm->map_count > sysctl_max_map_count) return -ENOMEM; + if (flags & MAP_HUGETLB) { + struct user_struct *user = NULL; + if (file) + return -EINVAL; + + /* + * VM_NORESERVE is used because the reservations will be + * taken when vm_ops->mmap() is called + * A dummy user value is used because we are not locking + * memory so no accounting is necessary + */ + len = ALIGN(len, huge_page_size(&default_hstate)); + file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE, + &user, HUGETLB_ANONHUGE_INODE); + if (IS_ERR(file)) + return PTR_ERR(file); + } + /* Obtain the address to map to. we verify (or select) it and ensure * that it represents a valid section of the address space. */ -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/7] Add MAP_HUGETLB example 2009-09-18 12:21 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 4/7] Add MAP_HUGETLB flag to alpha mman.h Eric B Munson 2009-09-18 20:08 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions David Rientjes 1 sibling, 1 reply; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson This patch adds an example of how to use the MAP_HUGETLB flag to the vm documentation directory and a reference to the example in hugetlbpage.txt. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- Documentation/vm/00-INDEX | 2 + Documentation/vm/hugetlbpage.txt | 14 ++++--- Documentation/vm/map_hugetlb.c | 77 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 Documentation/vm/map_hugetlb.c diff --git a/Documentation/vm/00-INDEX b/Documentation/vm/00-INDEX index 2f77ced..aabd973 100644 --- a/Documentation/vm/00-INDEX +++ b/Documentation/vm/00-INDEX @@ -20,3 +20,5 @@ slabinfo.c - source code for a tool to get reports about slabs. slub.txt - a short users guide for SLUB. +map_hugetlb.c + - an example program that uses the MAP_HUGETLB mmap flag. diff --git a/Documentation/vm/hugetlbpage.txt b/Documentation/vm/hugetlbpage.txt index ea8714f..6a8feab 100644 --- a/Documentation/vm/hugetlbpage.txt +++ b/Documentation/vm/hugetlbpage.txt @@ -146,12 +146,14 @@ Regular chown, chgrp, and chmod commands (with right permissions) could be used to change the file attributes on hugetlbfs. Also, it is important to note that no such mount command is required if the -applications are going to use only shmat/shmget system calls. Users who -wish to use hugetlb page via shared memory segment should be a member of -a supplementary group and system admin needs to configure that gid into -/proc/sys/vm/hugetlb_shm_group. It is possible for same or different -applications to use any combination of mmaps and shm* calls, though the -mount of filesystem will be required for using mmap calls. +applications are going to use only shmat/shmget system calls or mmap with +MAP_HUGETLB. Users who wish to use hugetlb page via shared memory segment +should be a member of a supplementary group and system admin needs to +configure that gid into /proc/sys/vm/hugetlb_shm_group. It is possible for +same or different applications to use any combination of mmaps and shm* +calls, though the mount of filesystem will be required for using mmap calls +without MAP_HUGETLB. For an example of how to use mmap with MAP_HUGETLB see +map_hugetlb.c. ******************************************************************* diff --git a/Documentation/vm/map_hugetlb.c b/Documentation/vm/map_hugetlb.c new file mode 100644 index 0000000..b6c1931 --- /dev/null +++ b/Documentation/vm/map_hugetlb.c @@ -0,0 +1,77 @@ +/* + * Example of using hugepage memory in a user application using the mmap + * system call with MAP_HUGETLB flag. Before running this program make + * sure the administrator has allocated enough default sized huge pages + * to cover the 256 MB allocation. + * + * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages. + * That means the addresses starting with 0x800000... will need to be + * specified. Specifying a fixed address is not required on ppc64, i386 + * or x86_64. + */ +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/mman.h> +#include <fcntl.h> + +#define LENGTH (256UL*1024*1024) +#define PROTECTION (PROT_READ | PROT_WRITE) + +#ifndef MAP_HUGETLB +#define MAP_HUGETLB 0x080000 +#endif + +/* Only ia64 requires this */ +#ifdef __ia64__ +#define ADDR (void *)(0x8000000000000000UL) +#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED) +#else +#define ADDR (void *)(0x0UL) +#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) +#endif + +void check_bytes(char *addr) +{ + printf("First hex is %x\n", *((unsigned int *)addr)); +} + +void write_bytes(char *addr) +{ + unsigned long i; + + for (i = 0; i < LENGTH; i++) + *(addr + i) = (char)i; +} + +void read_bytes(char *addr) +{ + unsigned long i; + + check_bytes(addr); + for (i = 0; i < LENGTH; i++) + if (*(addr + i) != (char)i) { + printf("Mismatch at %lu\n", i); + break; + } +} + +int main(void) +{ + void *addr; + + addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + printf("Returned address is %p\n", addr); + check_bytes(addr); + write_bytes(addr); + read_bytes(addr); + + munmap(addr, LENGTH); + + return 0; +} -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/7] Add MAP_HUGETLB flag to alpha mman.h 2009-09-18 12:21 ` [PATCH 3/7] Add MAP_HUGETLB example Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 5/7] Add MAP_HUGETLB flag to xtensa mman.h Eric B Munson 0 siblings, 1 reply; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson Even though alpha does not support huge pages this flag needs to be defined here to keep the compiler happy. This is because alpha does not make use of mman-common.h, so any flags defined there and used in common code need to be added to alpha's mman.h manually. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- arch/alpha/include/asm/mman.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/alpha/include/asm/mman.h b/arch/alpha/include/asm/mman.h index 90d7c35..704c304 100644 --- a/arch/alpha/include/asm/mman.h +++ b/arch/alpha/include/asm/mman.h @@ -28,6 +28,12 @@ #define MAP_NORESERVE 0x10000 /* don't check for reservations */ #define MAP_POPULATE 0x20000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x40000 /* do not block on IO */ +/* + * This flag is included even though huge pages are not supported because + * the flag is defined in mman-common.h and used in common vm code but + * mman-common.h is not included here + */ +#define MAP_HUGETLB 0x080000 #define MS_ASYNC 1 /* sync memory asynchronously */ #define MS_SYNC 2 /* synchronous memory sync */ -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/7] Add MAP_HUGETLB flag to xtensa mman.h 2009-09-18 12:21 ` [PATCH 4/7] Add MAP_HUGETLB flag to alpha mman.h Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 6/7] Add MAP_HUGETLB flag to parisc mman.h Eric B Munson 0 siblings, 1 reply; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson Even though xtensa does not support huge pages this flag needs to be defined here to keep the compiler happy. This is because xtensa does not make use of mman-common.h, so any flags defined there and used in common code need to be added to xtensa's mman.h manually. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- arch/xtensa/include/asm/mman.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/xtensa/include/asm/mman.h b/arch/xtensa/include/asm/mman.h index 9b92620..2572f5a 100644 --- a/arch/xtensa/include/asm/mman.h +++ b/arch/xtensa/include/asm/mman.h @@ -53,6 +53,12 @@ #define MAP_LOCKED 0x8000 /* pages are locked */ #define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x20000 /* do not block on IO */ +/* + * This flag is included even though huge pages are not supported because + * the flag is defined in mman-common.h and used in common vm code but + * mman-common.h is not included here + */ +#define MAP_HUGETLB 0x080000 /* * Flags for msync -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/7] Add MAP_HUGETLB flag to parisc mman.h 2009-09-18 12:21 ` [PATCH 5/7] Add MAP_HUGETLB flag to xtensa mman.h Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 2009-09-18 12:21 ` [PATCH 7/7] Add MAP_HUGETLB flag to mips mman.h Eric B Munson 0 siblings, 1 reply; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson Even though parisc does not support huge pages this flag needs to be defined here to keep the compiler happy. This is because parisc does not make use of mman-common.h, so any flags defined there and used in common code need to be added to parisc's mman.h manually. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- arch/parisc/include/asm/mman.h | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/parisc/include/asm/mman.h b/arch/parisc/include/asm/mman.h index defe752..7563d0c 100644 --- a/arch/parisc/include/asm/mman.h +++ b/arch/parisc/include/asm/mman.h @@ -58,4 +58,11 @@ #define MAP_FILE 0 #define MAP_VARIABLE 0 +/* + * This flag is included even though huge pages are not supported because + * the flag is defined in mman-common.h and used in common vm code but + * mman-common.h is not included here + */ +#define MAP_HUGETLB 0x080000 + #endif /* __PARISC_MMAN_H__ */ -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 7/7] Add MAP_HUGETLB flag to mips mman.h 2009-09-18 12:21 ` [PATCH 6/7] Add MAP_HUGETLB flag to parisc mman.h Eric B Munson @ 2009-09-18 12:21 ` Eric B Munson 0 siblings, 0 replies; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:21 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson Even though mips does not support huge pages this flag needs to be defined here to keep the compiler happy. This is because mips does not make use of mman-common.h, so any flags defined there and used in common code need to be added to mips's mman.h manually. Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> --- arch/mips/include/asm/mman.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/mips/include/asm/mman.h b/arch/mips/include/asm/mman.h index e4d6f1f..c4f29da 100644 --- a/arch/mips/include/asm/mman.h +++ b/arch/mips/include/asm/mman.h @@ -46,6 +46,12 @@ #define MAP_LOCKED 0x8000 /* pages are locked */ #define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x20000 /* do not block on IO */ +/* + * This flag is included even though huge pages are not supported because + * the flag is defined in mman-common.h and used in common vm code but + * mman-common.h is not included here + */ +#define MAP_HUGETLB 0x080000 /* * Flags for msync -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions 2009-09-18 12:21 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions Eric B Munson 2009-09-18 12:21 ` [PATCH 3/7] Add MAP_HUGETLB example Eric B Munson @ 2009-09-18 20:08 ` David Rientjes 2009-09-18 20:08 ` David Rientjes 1 sibling, 1 reply; 13+ messages in thread From: David Rientjes @ 2009-09-18 20:08 UTC (permalink / raw) To: Eric B Munson Cc: linux-kernel, linux-mm, akpm, rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch On Fri, 18 Sep 2009, Eric B Munson wrote: > This patch adds a flag for mmap that will be used to request a huge > page region that will look like anonymous memory to user space. This > is accomplished by using a file on the internal vfsmount. MAP_HUGETLB > is a modifier of MAP_ANONYMOUS and so must be specified with it. The > region will behave the same as a MAP_ANONYMOUS region using small pages. > > Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> Acked-by: David Rientjes <rientjes@google.com> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions 2009-09-18 20:08 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions David Rientjes @ 2009-09-18 20:08 ` David Rientjes 0 siblings, 0 replies; 13+ messages in thread From: David Rientjes @ 2009-09-18 20:08 UTC (permalink / raw) To: Eric B Munson Cc: linux-kernel, linux-mm, akpm, rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch On Fri, 18 Sep 2009, Eric B Munson wrote: > This patch adds a flag for mmap that will be used to request a huge > page region that will look like anonymous memory to user space. This > is accomplished by using a file on the internal vfsmount. MAP_HUGETLB > is a modifier of MAP_ANONYMOUS and so must be specified with it. The > region will behave the same as a MAP_ANONYMOUS region using small pages. > > Signed-off-by: Eric B Munson <ebmunson@us.ibm.com> Acked-by: David Rientjes <rientjes@google.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount 2009-09-18 12:21 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson 2009-09-18 12:21 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions Eric B Munson @ 2009-09-18 12:37 ` Eric B Munson 2009-09-18 20:06 ` David Rientjes 1 sibling, 1 reply; 13+ messages in thread From: Eric B Munson @ 2009-09-18 12:37 UTC (permalink / raw) To: linux-kernel, linux-mm, akpm Cc: rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch, Eric B Munson There are two means of creating mappings backed by huge pages: 1. mmap() a file created on hugetlbfs 2. Use shm which creates a file on an internal mount which essentially maps it MAP_SHARED The internal mount is only used for shared mappings but there is very little that stops it being used for private mappings. This patch extends hugetlbfs_file_setup() to deal with the creation of files that will be mapped MAP_PRIVATE on the internal hugetlbfs mount. This extended API is used in a subsequent patch to implement the MAP_HUGETLB mmap() flag. Signed-off-by: Eric Munson <ebmunson@us.ibm.com> --- fs/hugetlbfs/inode.c | 11 +++++++++-- include/linux/hugetlb.h | 12 ++++++++++-- ipc/shm.c | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a93b885..c50853e 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -507,6 +507,13 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid, inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; INIT_LIST_HEAD(&inode->i_mapping->private_list); info = HUGETLBFS_I(inode); + /* + * The policy is initialized here even if we are creating a + * private inode because initialization simply creates an + * an empty rb tree and calls spin_lock_init(), later when we + * call mpol_free_shared_policy() it will just return because + * the rb tree will still be empty. + */ mpol_shared_policy_init(&info->policy, NULL); switch (mode & S_IFMT) { default: @@ -937,7 +944,7 @@ static int can_do_hugetlb_shm(void) } struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, - struct user_struct **user) + struct user_struct **user, int creat_flags) { int error = -ENOMEM; struct file *file; @@ -949,7 +956,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, if (!hugetlbfs_vfsmount) return ERR_PTR(-ENOENT); - if (!can_do_hugetlb_shm()) { + if (creat_flags == HUGETLB_SHMFS_INODE && !can_do_hugetlb_shm()) { *user = current_user(); if (user_shm_lock(size, *user)) { WARN_ONCE(1, diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 5cbc620..38bb552 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -110,6 +110,14 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) #endif /* !CONFIG_HUGETLB_PAGE */ +enum { + /* + * The file will be used as an shm file so shmfs accounting rules + * apply + */ + HUGETLB_SHMFS_INODE = 1, +}; + #ifdef CONFIG_HUGETLBFS struct hugetlbfs_config { uid_t uid; @@ -148,7 +156,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) extern const struct file_operations hugetlbfs_file_operations; extern struct vm_operations_struct hugetlb_vm_ops; struct file *hugetlb_file_setup(const char *name, size_t size, int acct, - struct user_struct **user); + struct user_struct **user, int creat_flags); int hugetlb_get_quota(struct address_space *mapping, long delta); void hugetlb_put_quota(struct address_space *mapping, long delta); @@ -170,7 +178,7 @@ static inline void set_file_hugepages(struct file *file) #define is_file_hugepages(file) 0 #define set_file_hugepages(file) BUG() -#define hugetlb_file_setup(name,size,acct,user) ERR_PTR(-ENOSYS) +#define hugetlb_file_setup(name,size,acct,user,creat) ERR_PTR(-ENOSYS) #endif /* !CONFIG_HUGETLBFS */ diff --git a/ipc/shm.c b/ipc/shm.c index 30162a5..9eb1488 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -370,7 +370,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) if (shmflg & SHM_NORESERVE) acctflag = VM_NORESERVE; file = hugetlb_file_setup(name, size, acctflag, - &shp->mlock_user); + &shp->mlock_user, HUGETLB_SHMFS_INODE); } else { /* * Do not allow no accounting for OVERCOMMIT_NEVER, even -- 1.6.3.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount 2009-09-18 12:37 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson @ 2009-09-18 20:06 ` David Rientjes 2009-09-18 20:06 ` David Rientjes 0 siblings, 1 reply; 13+ messages in thread From: David Rientjes @ 2009-09-18 20:06 UTC (permalink / raw) To: Eric B Munson Cc: linux-kernel, linux-mm, akpm, rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch On Fri, 18 Sep 2009, Eric B Munson wrote: > There are two means of creating mappings backed by huge pages: > > 1. mmap() a file created on hugetlbfs > 2. Use shm which creates a file on an internal mount which essentially > maps it MAP_SHARED > > The internal mount is only used for shared mappings but there is very > little that stops it being used for private mappings. This patch extends > hugetlbfs_file_setup() to deal with the creation of files that will be > mapped MAP_PRIVATE on the internal hugetlbfs mount. This extended API is > used in a subsequent patch to implement the MAP_HUGETLB mmap() flag. > > Signed-off-by: Eric Munson <ebmunson@us.ibm.com> Acked-by: David Rientjes <rientjes@google.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount 2009-09-18 20:06 ` David Rientjes @ 2009-09-18 20:06 ` David Rientjes 0 siblings, 0 replies; 13+ messages in thread From: David Rientjes @ 2009-09-18 20:06 UTC (permalink / raw) To: Eric B Munson Cc: linux-kernel, linux-mm, akpm, rdunlap, michael, ralf, wli, mel, dhowells, arnd, fengguang.wu, shuber2, hugh.dickins, zohar, hugh, mtk.manpages, chris, linux-man, linux-doc, linux-alpha, linux-mips, linux-parisc, linux-arch On Fri, 18 Sep 2009, Eric B Munson wrote: > There are two means of creating mappings backed by huge pages: > > 1. mmap() a file created on hugetlbfs > 2. Use shm which creates a file on an internal mount which essentially > maps it MAP_SHARED > > The internal mount is only used for shared mappings but there is very > little that stops it being used for private mappings. This patch extends > hugetlbfs_file_setup() to deal with the creation of files that will be > mapped MAP_PRIVATE on the internal hugetlbfs mount. This extended API is > used in a subsequent patch to implement the MAP_HUGETLB mmap() flag. > > Signed-off-by: Eric Munson <ebmunson@us.ibm.com> Acked-by: David Rientjes <rientjes@google.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-09-18 20:12 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-09-18 12:21 [PATCH 0/7] Add pseudo-anonymous huge page mappings V3 Eric B Munson 2009-09-18 12:21 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson 2009-09-18 12:21 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions Eric B Munson 2009-09-18 12:21 ` [PATCH 3/7] Add MAP_HUGETLB example Eric B Munson 2009-09-18 12:21 ` [PATCH 4/7] Add MAP_HUGETLB flag to alpha mman.h Eric B Munson 2009-09-18 12:21 ` [PATCH 5/7] Add MAP_HUGETLB flag to xtensa mman.h Eric B Munson 2009-09-18 12:21 ` [PATCH 6/7] Add MAP_HUGETLB flag to parisc mman.h Eric B Munson 2009-09-18 12:21 ` [PATCH 7/7] Add MAP_HUGETLB flag to mips mman.h Eric B Munson 2009-09-18 20:08 ` [PATCH 2/7] Add MAP_HUGETLB for mmaping pseudo-anonymous huge page regions David Rientjes 2009-09-18 20:08 ` David Rientjes 2009-09-18 12:37 ` [PATCH 1/7] hugetlbfs: Allow the creation of files suitable for MAP_PRIVATE on the vfs internal mount Eric B Munson 2009-09-18 20:06 ` David Rientjes 2009-09-18 20:06 ` David Rientjes
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).