From 7d6c135c8b87b8b1a965b4ed6efc0187128402ec Mon Sep 17 00:00:00 2001 From: Eric B Munson Date: Mon, 21 Sep 2009 17:03:47 -0700 Subject: [PATCH] --- yaml --- r: 164484 b: refs/heads/master c: 4e52780d41a741fb4861ae1df2413dd816ec11b1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/hugetlb.h | 7 +++++++ trunk/mm/mmap.c | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 46f7cb99c333..2fcb0b55206d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 90f72aa58bbf076b68e289fbd71eb829bc505923 +refs/heads/master: 4e52780d41a741fb4861ae1df2413dd816ec11b1 diff --git a/trunk/include/linux/hugetlb.h b/trunk/include/linux/hugetlb.h index f6505ad86657..176e7ee73eff 100644 --- a/trunk/include/linux/hugetlb.h +++ b/trunk/include/linux/hugetlb.h @@ -112,12 +112,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/trunk/mm/mmap.c b/trunk/mm/mmap.c index 1aeef6625e6a..21d4029a07b3 100644 --- a/trunk/mm/mmap.c +++ b/trunk/mm/mmap.c @@ -949,6 +949,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. */