Message ID | 56e31cb5-6e1e-bdba-d7ca-be64b9842363@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | memcg accounting from OpenVZ | expand |
On Mon, Jul 26, 2021 at 10:33 PM Vasily Averin <vvs@virtuozzo.com> wrote: > > User can call select/poll system calls with a large number of assigned > file descriptors and force kernel to allocate up to several pages of memory > till end of these sleeping system calls. We have here long-living > unaccounted per-task allocations. > > It makes sense to account for these allocations to restrict the host's > memory consumption from inside the memcg-limited container. > > Signed-off-by: Vasily Averin <vvs@virtuozzo.com> > --- > fs/select.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/select.c b/fs/select.c > index 945896d..e83e563 100644 > --- a/fs/select.c > +++ b/fs/select.c > @@ -655,7 +655,7 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, > goto out_nofds; > > alloc_size = 6 * size; > - bits = kvmalloc(alloc_size, GFP_KERNEL); > + bits = kvmalloc(alloc_size, GFP_KERNEL_ACCOUNT); What about the similar allocation in compat_core_sys_select()? Also what about the allocation in poll_get_entry()? > if (!bits) > goto out_nofds; > } > @@ -1000,7 +1000,7 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, > > len = min(todo, POLLFD_PER_PAGE); > walk = walk->next = kmalloc(struct_size(walk, entries, len), > - GFP_KERNEL); > + GFP_KERNEL_ACCOUNT); > if (!walk) { > err = -ENOMEM; > goto out_fds; > -- > 1.8.3.1 >
diff --git a/fs/select.c b/fs/select.c index 945896d..e83e563 100644 --- a/fs/select.c +++ b/fs/select.c @@ -655,7 +655,7 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, goto out_nofds; alloc_size = 6 * size; - bits = kvmalloc(alloc_size, GFP_KERNEL); + bits = kvmalloc(alloc_size, GFP_KERNEL_ACCOUNT); if (!bits) goto out_nofds; } @@ -1000,7 +1000,7 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, len = min(todo, POLLFD_PER_PAGE); walk = walk->next = kmalloc(struct_size(walk, entries, len), - GFP_KERNEL); + GFP_KERNEL_ACCOUNT); if (!walk) { err = -ENOMEM; goto out_fds;
User can call select/poll system calls with a large number of assigned file descriptors and force kernel to allocate up to several pages of memory till end of these sleeping system calls. We have here long-living unaccounted per-task allocations. It makes sense to account for these allocations to restrict the host's memory consumption from inside the memcg-limited container. Signed-off-by: Vasily Averin <vvs@virtuozzo.com> --- fs/select.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)