Commit 83c1fd76 authored by zhangyiru's avatar zhangyiru Committed by Linus Torvalds

mm,hugetlb: remove mlock ulimit for SHM_HUGETLB

Commit 21a3c273 ("mm, hugetlb: add thread name and pid to
SHM_HUGETLB mlock rlimit warning") marked this as deprecated in 2012,
but it is not deleted yet.

Mike says he still sees that message in log files on occasion, so maybe we
should preserve this warning.

Also remove hugetlbfs related user_shm_unlock in ipc/shm.c and remove the
user_shm_unlock after out.

Link: https://lkml.kernel.org/r/20211103105857.25041-1-zhangyiru3@huawei.comSigned-off-by: default avatarzhangyiru <zhangyiru3@huawei.com>
Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Liu Zixian <liuzixian4@huawei.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: wuxu.wu <wuxu.wu@huawei.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 51b8c1fe
...@@ -1446,8 +1446,8 @@ static int get_hstate_idx(int page_size_log) ...@@ -1446,8 +1446,8 @@ static int get_hstate_idx(int page_size_log)
* otherwise hugetlb_reserve_pages reserves one less hugepages than intended. * otherwise hugetlb_reserve_pages reserves one less hugepages than intended.
*/ */
struct file *hugetlb_file_setup(const char *name, size_t size, struct file *hugetlb_file_setup(const char *name, size_t size,
vm_flags_t acctflag, struct ucounts **ucounts, vm_flags_t acctflag, int creat_flags,
int creat_flags, int page_size_log) int page_size_log)
{ {
struct inode *inode; struct inode *inode;
struct vfsmount *mnt; struct vfsmount *mnt;
...@@ -1458,22 +1458,19 @@ struct file *hugetlb_file_setup(const char *name, size_t size, ...@@ -1458,22 +1458,19 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
if (hstate_idx < 0) if (hstate_idx < 0)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
*ucounts = NULL;
mnt = hugetlbfs_vfsmount[hstate_idx]; mnt = hugetlbfs_vfsmount[hstate_idx];
if (!mnt) if (!mnt)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
if (creat_flags == HUGETLB_SHMFS_INODE && !can_do_hugetlb_shm()) { if (creat_flags == HUGETLB_SHMFS_INODE && !can_do_hugetlb_shm()) {
*ucounts = current_ucounts(); struct ucounts *ucounts = current_ucounts();
if (user_shm_lock(size, *ucounts)) {
task_lock(current); if (user_shm_lock(size, ucounts)) {
pr_warn_once("%s (%d): Using mlock ulimits for SHM_HUGETLB is deprecated\n", pr_warn_once("%s (%d): Using mlock ulimits for SHM_HUGETLB is obsolete\n",
current->comm, current->pid); current->comm, current->pid);
task_unlock(current); user_shm_unlock(size, ucounts);
} else {
*ucounts = NULL;
return ERR_PTR(-EPERM);
} }
return ERR_PTR(-EPERM);
} }
file = ERR_PTR(-ENOSPC); file = ERR_PTR(-ENOSPC);
...@@ -1498,10 +1495,6 @@ struct file *hugetlb_file_setup(const char *name, size_t size, ...@@ -1498,10 +1495,6 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
iput(inode); iput(inode);
out: out:
if (*ucounts) {
user_shm_unlock(size, *ucounts);
*ucounts = NULL;
}
return file; return file;
} }
......
...@@ -477,8 +477,7 @@ static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode) ...@@ -477,8 +477,7 @@ static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode)
extern const struct file_operations hugetlbfs_file_operations; extern const struct file_operations hugetlbfs_file_operations;
extern const struct vm_operations_struct hugetlb_vm_ops; extern const struct vm_operations_struct hugetlb_vm_ops;
struct file *hugetlb_file_setup(const char *name, size_t size, vm_flags_t acct, struct file *hugetlb_file_setup(const char *name, size_t size, vm_flags_t acct,
struct ucounts **ucounts, int creat_flags, int creat_flags, int page_size_log);
int page_size_log);
static inline bool is_file_hugepages(struct file *file) static inline bool is_file_hugepages(struct file *file)
{ {
...@@ -497,8 +496,7 @@ static inline struct hstate *hstate_inode(struct inode *i) ...@@ -497,8 +496,7 @@ static inline struct hstate *hstate_inode(struct inode *i)
#define is_file_hugepages(file) false #define is_file_hugepages(file) false
static inline struct file * static inline struct file *
hugetlb_file_setup(const char *name, size_t size, vm_flags_t acctflag, hugetlb_file_setup(const char *name, size_t size, vm_flags_t acctflag,
struct ucounts **ucounts, int creat_flags, int creat_flags, int page_size_log)
int page_size_log)
{ {
return ERR_PTR(-ENOSYS); return ERR_PTR(-ENOSYS);
} }
......
...@@ -287,9 +287,6 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) ...@@ -287,9 +287,6 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
shm_unlock(shp); shm_unlock(shp);
if (!is_file_hugepages(shm_file)) if (!is_file_hugepages(shm_file))
shmem_lock(shm_file, 0, shp->mlock_ucounts); shmem_lock(shm_file, 0, shp->mlock_ucounts);
else if (shp->mlock_ucounts)
user_shm_unlock(i_size_read(file_inode(shm_file)),
shp->mlock_ucounts);
fput(shm_file); fput(shm_file);
ipc_update_pid(&shp->shm_cprid, NULL); ipc_update_pid(&shp->shm_cprid, NULL);
ipc_update_pid(&shp->shm_lprid, NULL); ipc_update_pid(&shp->shm_lprid, NULL);
...@@ -650,8 +647,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) ...@@ -650,8 +647,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
if (shmflg & SHM_NORESERVE) if (shmflg & SHM_NORESERVE)
acctflag = VM_NORESERVE; acctflag = VM_NORESERVE;
file = hugetlb_file_setup(name, hugesize, acctflag, file = hugetlb_file_setup(name, hugesize, acctflag,
&shp->mlock_ucounts, HUGETLB_SHMFS_INODE, HUGETLB_SHMFS_INODE, (shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK);
(shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK);
} else { } else {
/* /*
* Do not allow no accounting for OVERCOMMIT_NEVER, even * Do not allow no accounting for OVERCOMMIT_NEVER, even
...@@ -698,8 +694,6 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) ...@@ -698,8 +694,6 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
no_id: no_id:
ipc_update_pid(&shp->shm_cprid, NULL); ipc_update_pid(&shp->shm_cprid, NULL);
ipc_update_pid(&shp->shm_lprid, NULL); ipc_update_pid(&shp->shm_lprid, NULL);
if (is_file_hugepages(file) && shp->mlock_ucounts)
user_shm_unlock(size, shp->mlock_ucounts);
fput(file); fput(file);
ipc_rcu_putref(&shp->shm_perm, shm_rcu_free); ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
return error; return error;
......
...@@ -297,9 +297,7 @@ SYSCALL_DEFINE2(memfd_create, ...@@ -297,9 +297,7 @@ SYSCALL_DEFINE2(memfd_create,
} }
if (flags & MFD_HUGETLB) { if (flags & MFD_HUGETLB) {
struct ucounts *ucounts = NULL; file = hugetlb_file_setup(name, 0, VM_NORESERVE,
file = hugetlb_file_setup(name, 0, VM_NORESERVE, &ucounts,
HUGETLB_ANONHUGE_INODE, HUGETLB_ANONHUGE_INODE,
(flags >> MFD_HUGE_SHIFT) & (flags >> MFD_HUGE_SHIFT) &
MFD_HUGE_MASK); MFD_HUGE_MASK);
......
...@@ -1599,7 +1599,6 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len, ...@@ -1599,7 +1599,6 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len,
goto out_fput; goto out_fput;
} }
} else if (flags & MAP_HUGETLB) { } else if (flags & MAP_HUGETLB) {
struct ucounts *ucounts = NULL;
struct hstate *hs; struct hstate *hs;
hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK); hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);
...@@ -1615,7 +1614,7 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len, ...@@ -1615,7 +1614,7 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len,
*/ */
file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, file = hugetlb_file_setup(HUGETLB_ANON_FILE, len,
VM_NORESERVE, VM_NORESERVE,
&ucounts, HUGETLB_ANONHUGE_INODE, HUGETLB_ANONHUGE_INODE,
(flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK); (flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);
if (IS_ERR(file)) if (IS_ERR(file))
return PTR_ERR(file); return PTR_ERR(file);
......
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