[Devel] [PATCH RH7] epoll: account epitem and eppoll_entry to kmemcg

Vasily Averin vvs at virtuozzo.com
Sat Sep 26 13:06:22 MSK 2020


From: Shakeel Butt <shakeelb at google.com>

A userspace application can directly trigger the allocations from
eventpoll_epi and eventpoll_pwq slabs.  A buggy or malicious application
can consume a significant amount of system memory by triggering such
allocations.  Indeed we have seen in production where a buggy
application was leaking the epoll references and causing a burst of
eventpoll_epi and eventpoll_pwq slab allocations.  This patch opt-in the
charging of eventpoll_epi and eventpoll_pwq slabs.

There is a per-user limit (~4% of total memory if no highmem) on these
caches.  I think it is too generous particularly in the scenario where
jobs of multiple users are running on the system and the administrator
is reducing cost by overcomitting the memory.  This is unaccounted
kernel memory and will not be considered by the oom-killer.  I think by
accounting it to kmemcg, for systems with kmem accounting enabled, we
can provide better isolation between jobs of different users.

Link: http://lkml.kernel.org/r/20171003021519.23907-1-shakeelb@google.com
Signed-off-by: Shakeel Butt <shakeelb at google.com>
Acked-by: Michal Hocko <mhocko at suse.com>
Cc: Alexander Viro <viro at zeniv.linux.org.uk>
Cc: Vladimir Davydov <vdavydov.dev at gmail.com>
Cc: Johannes Weiner <hannes at cmpxchg.org>
Cc: Greg Thelen <gthelen at google.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

(cherry-picked upstream commit 2ae928a9441a3b5f13952e1e8a97d03cb23ea603)
https://jira.sw.ru/browse/PSBM-108292
Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
---
 fs/eventpoll.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 760459c510ec..b72b32c0d78f 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -2226,11 +2226,11 @@ static int __init eventpoll_init(void)
 
 	/* Allocates slab cache used to allocate "struct epitem" items */
 	epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
-			0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
+			0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
 
 	/* Allocates slab cache used to allocate "struct eppoll_entry" */
 	pwq_cache = kmem_cache_create("eventpoll_pwq",
-			sizeof(struct eppoll_entry), 0, SLAB_PANIC, NULL);
+		sizeof(struct eppoll_entry), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);
 
 	return 0;
 }
-- 
2.17.1



More information about the Devel mailing list