Commit 2584e517 authored by Ravikiran G Thirumalai's avatar Ravikiran G Thirumalai Committed by Linus Torvalds

mm: reintroduce and deprecate rlimit based access for SHM_HUGETLB

Allow non root users with sufficient mlock rlimits to be able to allocate
hugetlb backed shm for now.  Deprecate this though.  This is being
deprecated because the mlock based rlimit checks for SHM_HUGETLB is not
consistent with mmap based huge page allocations.
Signed-off-by: default avatarRavikiran Thirumalai <kiran@scalex86.org>
Reviewed-by: default avatarMel Gorman <mel@csn.ul.ie>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: Adam Litke <agl@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8a0bdec1
...@@ -311,6 +311,18 @@ Who: Vlad Yasevich <vladislav.yasevich@hp.com> ...@@ -311,6 +311,18 @@ Who: Vlad Yasevich <vladislav.yasevich@hp.com>
--------------------------- ---------------------------
What: Ability for non root users to shm_get hugetlb pages based on mlock
resource limits
When: 2.6.31
Why: Non root users need to be part of /proc/sys/vm/hugetlb_shm_group or
have CAP_IPC_LOCK to be able to allocate shm segments backed by
huge pages. The mlock based rlimit check to allow shm hugetlb is
inconsistent with mmap based allocations. Hence it is being
deprecated.
Who: Ravikiran Thirumalai <kiran@scalex86.org>
---------------------------
What: CONFIG_THERMAL_HWMON What: CONFIG_THERMAL_HWMON
When: January 2009 When: January 2009
Why: This option was introduced just to allow older lm-sensors userspace Why: This option was introduced just to allow older lm-sensors userspace
......
...@@ -949,6 +949,7 @@ static int can_do_hugetlb_shm(void) ...@@ -949,6 +949,7 @@ static int can_do_hugetlb_shm(void)
struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
{ {
int error = -ENOMEM; int error = -ENOMEM;
int unlock_shm = 0;
struct file *file; struct file *file;
struct inode *inode; struct inode *inode;
struct dentry *dentry, *root; struct dentry *dentry, *root;
...@@ -958,8 +959,14 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) ...@@ -958,8 +959,14 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
if (!hugetlbfs_vfsmount) if (!hugetlbfs_vfsmount)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
if (!can_do_hugetlb_shm()) if (!can_do_hugetlb_shm()) {
return ERR_PTR(-EPERM); if (user_shm_lock(size, user)) {
unlock_shm = 1;
WARN_ONCE(1,
"Using mlock ulimits for SHM_HUGETLB deprecated\n");
} else
return ERR_PTR(-EPERM);
}
root = hugetlbfs_vfsmount->mnt_root; root = hugetlbfs_vfsmount->mnt_root;
quick_string.name = name; quick_string.name = name;
...@@ -999,6 +1006,8 @@ out_inode: ...@@ -999,6 +1006,8 @@ out_inode:
out_dentry: out_dentry:
dput(dentry); dput(dentry);
out_shm_unlock: out_shm_unlock:
if (unlock_shm)
user_shm_unlock(size, user);
return ERR_PTR(error); return ERR_PTR(error);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment