提交 bde4e1a3 编写于 作者: V Vasily Averin 提交者: Yang Yingliang

memcg: enable accounting of ipc resources

mainline inclusion
from mainline-v5.15-rc1
commit 18319498
category: bugfix
bugzilla: NA
CVE: CVE-2021-3759

---------------------------

When user creates IPC objects it forces kernel to allocate memory for
these long-living objects.

It makes sense to account them to restrict the host's memory consumption
from inside the memcg-limited container.

This patch enables accounting for IPC shared memory segments, messages
semaphores and semaphore's undo lists.

Link: https://lkml.kernel.org/r/d6507b06-4df6-78f8-6c54-3ae86e3b5339@virtuozzo.comSigned-off-by: NVasily Averin <vvs@virtuozzo.com>
Reviewed-by: NShakeel Butt <shakeelb@google.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Andrei Vagin <avagin@gmail.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Borislav Petkov <bp@suse.de>
Cc: Christian Brauner <christian.brauner@ubuntu.com>
Cc: Dmitry Safonov <0x7f454c46@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Jeff Layton <jlayton@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Jiri Slaby <jirislaby@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Roman Gushchin <guro@fb.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Yutian Yang <nglaive@gmail.com>
Cc: Zefan Li <lizefan.x@bytedance.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>

Conflicts:
	ipc/msg.c
	ipc/sem.c
	ipc/shm.c
Signed-off-by: NLi Ming <limingming.li@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 71e735a4
...@@ -137,7 +137,7 @@ static int newque(struct ipc_namespace *ns, struct ipc_params *params) ...@@ -137,7 +137,7 @@ static int newque(struct ipc_namespace *ns, struct ipc_params *params)
key_t key = params->key; key_t key = params->key;
int msgflg = params->flg; int msgflg = params->flg;
msq = kvmalloc(sizeof(*msq), GFP_KERNEL); msq = kvmalloc(sizeof(*msq), GFP_KERNEL_ACCOUNT);
if (unlikely(!msq)) if (unlikely(!msq))
return -ENOMEM; return -ENOMEM;
......
...@@ -494,7 +494,7 @@ static struct sem_array *sem_alloc(size_t nsems) ...@@ -494,7 +494,7 @@ static struct sem_array *sem_alloc(size_t nsems)
return NULL; return NULL;
size = sizeof(*sma) + nsems * sizeof(sma->sems[0]); size = sizeof(*sma) + nsems * sizeof(sma->sems[0]);
sma = kvmalloc(size, GFP_KERNEL); sma = kvmalloc(size, GFP_KERNEL_ACCOUNT);
if (unlikely(!sma)) if (unlikely(!sma))
return NULL; return NULL;
...@@ -1813,7 +1813,7 @@ static inline int get_undo_list(struct sem_undo_list **undo_listp) ...@@ -1813,7 +1813,7 @@ static inline int get_undo_list(struct sem_undo_list **undo_listp)
undo_list = current->sysvsem.undo_list; undo_list = current->sysvsem.undo_list;
if (!undo_list) { if (!undo_list) {
undo_list = kzalloc(sizeof(*undo_list), GFP_KERNEL); undo_list = kzalloc(sizeof(*undo_list), GFP_KERNEL_ACCOUNT);
if (undo_list == NULL) if (undo_list == NULL)
return -ENOMEM; return -ENOMEM;
spin_lock_init(&undo_list->lock); spin_lock_init(&undo_list->lock);
...@@ -1897,7 +1897,7 @@ static struct sem_undo *find_alloc_undo(struct ipc_namespace *ns, int semid) ...@@ -1897,7 +1897,7 @@ static struct sem_undo *find_alloc_undo(struct ipc_namespace *ns, int semid)
rcu_read_unlock(); rcu_read_unlock();
/* step 2: allocate new undo structure */ /* step 2: allocate new undo structure */
new = kzalloc(sizeof(struct sem_undo) + sizeof(short)*nsems, GFP_KERNEL); new = kzalloc(sizeof(struct sem_undo) + sizeof(short)*nsems, GFP_KERNEL_ACCOUNT);
if (!new) { if (!new) {
ipc_rcu_putref(&sma->sem_perm, sem_rcu_free); ipc_rcu_putref(&sma->sem_perm, sem_rcu_free);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -1961,7 +1961,8 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops, ...@@ -1961,7 +1961,8 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
if (nsops > ns->sc_semopm) if (nsops > ns->sc_semopm)
return -E2BIG; return -E2BIG;
if (nsops > SEMOPM_FAST) { if (nsops > SEMOPM_FAST) {
sops = kvmalloc_array(nsops, sizeof(*sops), GFP_KERNEL); sops = kvmalloc_array(nsops, sizeof(*sops),
GFP_KERNEL_ACCOUNT);
if (sops == NULL) if (sops == NULL)
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -619,7 +619,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) ...@@ -619,7 +619,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
ns->shm_tot + numpages > ns->shm_ctlall) ns->shm_tot + numpages > ns->shm_ctlall)
return -ENOSPC; return -ENOSPC;
shp = kvmalloc(sizeof(*shp), GFP_KERNEL); shp = kvmalloc(sizeof(*shp), GFP_KERNEL_ACCOUNT);
if (unlikely(!shp)) if (unlikely(!shp))
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册