Reimplement RLIMIT_MEMLOCK on top of ucounts
The rlimit counter is tied to uid in the user_namespace. This allows rlimit values to be specified in userns even if they are already globally exceeded by the user. However, the value of the previous user_namespaces cannot be exceeded. Changelog v11: * Fix issue found by lkp robot. v8: * Fix issues found by lkp-tests project. v7: * Keep only ucounts for RLIMIT_MEMLOCK checks instead of struct cred. v6: * Fix bug in hugetlb_file_setup() detected by trinity. Reported-by: kernel test robot <oliver.sang@intel.com> Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Alexey Gladkov <legion@kernel.org> Link: https://lkml.kernel.org/r/970d50c70c71bfd4496e0e8d2a0a32feebebb350.1619094428.git.legion@kernel.org Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
committed by
Eric W. Biederman
parent
d646969055
commit
d7c9e99aee
@ -1443,7 +1443,7 @@ static int get_hstate_idx(int page_size_log)
|
||||
* otherwise hugetlb_reserve_pages reserves one less hugepages than intended.
|
||||
*/
|
||||
struct file *hugetlb_file_setup(const char *name, size_t size,
|
||||
vm_flags_t acctflag, struct user_struct **user,
|
||||
vm_flags_t acctflag, struct ucounts **ucounts,
|
||||
int creat_flags, int page_size_log)
|
||||
{
|
||||
struct inode *inode;
|
||||
@ -1455,20 +1455,20 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
|
||||
if (hstate_idx < 0)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
*user = NULL;
|
||||
*ucounts = NULL;
|
||||
mnt = hugetlbfs_vfsmount[hstate_idx];
|
||||
if (!mnt)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
if (creat_flags == HUGETLB_SHMFS_INODE && !can_do_hugetlb_shm()) {
|
||||
*user = current_user();
|
||||
if (user_shm_lock(size, *user)) {
|
||||
*ucounts = current_ucounts();
|
||||
if (user_shm_lock(size, *ucounts)) {
|
||||
task_lock(current);
|
||||
pr_warn_once("%s (%d): Using mlock ulimits for SHM_HUGETLB is deprecated\n",
|
||||
current->comm, current->pid);
|
||||
task_unlock(current);
|
||||
} else {
|
||||
*user = NULL;
|
||||
*ucounts = NULL;
|
||||
return ERR_PTR(-EPERM);
|
||||
}
|
||||
}
|
||||
@ -1495,9 +1495,9 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
|
||||
|
||||
iput(inode);
|
||||
out:
|
||||
if (*user) {
|
||||
user_shm_unlock(size, *user);
|
||||
*user = NULL;
|
||||
if (*ucounts) {
|
||||
user_shm_unlock(size, *ucounts);
|
||||
*ucounts = NULL;
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
Reference in New Issue
Block a user