Hi Eric, On Wed, Aug 12, 2009 at 1:13 AM, Eric B Munson<ebmunson@xxxxxxxxxx> 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_LARGEPAGE > 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@xxxxxxxxxx> I would love to see something like this in the kernel. Huge pages are useful for garbage collection and JIT text in the userspace but unfortunately obtaining them is a real PITA at the moment. Is there any way to drop the CAP_IPC_LOCK/in_group_p(hugetlbfs_shm_group) requirement, btw? That would make huge pages even more accessible to user-space virtual machines. Pekka > --- > include/asm-generic/mman-common.h | 1 + > include/linux/hugetlb.h | 7 +++++++ > mm/mmap.c | 16 ++++++++++++++++ > 3 files changed, 24 insertions(+), 0 deletions(-) > > diff --git a/include/asm-generic/mman-common.h b/include/asm-generic/mman-common.h > index 3b69ad3..60b6be7 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_LARGEPAGE 0x40 /* create a large 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 78b6ddf..b84361c 100644 > --- a/include/linux/hugetlb.h > +++ b/include/linux/hugetlb.h > @@ -109,12 +109,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 = 0x01, > + /* > + * The file is being created on the internal vfs mount and shmfs > + * accounting rules do not apply > + */ > + HUGETLB_ANONHUGE_INODE = 0x02, > }; > > #ifdef CONFIG_HUGETLBFS > diff --git a/mm/mmap.c b/mm/mmap.c > index 34579b2..c2c729a 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> > @@ -954,6 +955,21 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, > if (mm->map_count > sysctl_max_map_count) > return -ENOMEM; > > + if (flags & MAP_LARGEPAGE) { > + if (file) > + return -EINVAL; > + > + /* > + * VM_NORESERVE is used because the reservations will be > + * taken when vm_ops->mmap() is called > + */ > + len = ALIGN(len, huge_page_size(&default_hstate)); > + file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE, > + HUGETLB_ANONHUGE_INODE); > + if (IS_ERR(file)) > + return -ENOMEM; > + } > + > /* 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@xxxxxxxxxx For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a> > -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html