Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1663f26d authored by Tejun Heo's avatar Tejun Heo Committed by Linus Torvalds
Browse files

slub: make sysfs directories for memcg sub-caches optional

SLUB creates a per-cache directory under /sys/kernel/slab which hosts a
bunch of debug files.  Usually, there aren't that many caches on a
system and this doesn't really matter; however, if memcg is in use, each
cache can have per-cgroup sub-caches.  SLUB creates the same directories
for these sub-caches under /sys/kernel/slab/$CACHE/cgroup.

Unfortunately, because there can be a lot of cgroups, active or
draining, the product of the numbers of caches, cgroups and files in
each directory can reach a very high number - hundreds of thousands is
commonplace.  Millions and beyond aren't difficult to reach either.

What's under /sys/kernel/slab is primarily for debugging and the
information and control on the a root cache already cover its
sub-caches.  While having a separate directory for each sub-cache can be
helpful for development, it doesn't make much sense to pay this amount
of overhead by default.

This patch introduces a boot parameter slub_memcg_sysfs which determines
whether to create sysfs directories for per-memcg sub-caches.  It also
adds CONFIG_SLUB_MEMCG_SYSFS_ON which determines the boot parameter's
default value and defaults to 0.

[akpm@linux-foundation.org: kset_unregister(NULL) is legal]
Link: http://lkml.kernel.org/r/20170204145203.GB26958@mtj.duckdns.org


Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 17cc4dfe
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -3694,6 +3694,14 @@
			last alloc / free. For more information see
			last alloc / free. For more information see
			Documentation/vm/slub.txt.
			Documentation/vm/slub.txt.


	slub_memcg_sysfs=	[MM, SLUB]
			Determines whether to enable sysfs directories for
			memory cgroup sub-caches. 1 to enable, 0 to disable.
			The default is determined by CONFIG_SLUB_MEMCG_SYSFS_ON.
			Enabling this can lead to a very high number of	debug
			directories and files being created under
			/sys/kernel/slub.

	slub_max_order= [MM, SLUB]
	slub_max_order= [MM, SLUB]
			Determines the maximum allowed order for slabs.
			Determines the maximum allowed order for slabs.
			A high setting may cause OOMs due to memory
			A high setting may cause OOMs due to memory
+14 −0
Original line number Original line Diff line number Diff line
@@ -1779,6 +1779,20 @@ config SLUB_DEBUG
	  SLUB sysfs support. /sys/slab will not exist and there will be
	  SLUB sysfs support. /sys/slab will not exist and there will be
	  no support for cache validation etc.
	  no support for cache validation etc.


config SLUB_MEMCG_SYSFS_ON
	default n
	bool "Enable memcg SLUB sysfs support by default" if EXPERT
	depends on SLUB && SYSFS && MEMCG
	help
	  SLUB creates a directory under /sys/kernel/slab for each
	  allocation cache to host info and debug files. If memory
	  cgroup is enabled, each cache can have per memory cgroup
	  caches. SLUB can create the same sysfs directories for these
	  caches under /sys/kernel/slab/CACHE/cgroup but it can lead
	  to a very high number of debug files being created. This is
	  controlled by slub_memcg_sysfs boot parameter and this
	  config option determines the parameter's default value.

config COMPAT_BRK
config COMPAT_BRK
	bool "Disable heap randomization"
	bool "Disable heap randomization"
	default y
	default y
+24 −2
Original line number Original line Diff line number Diff line
@@ -4708,6 +4708,22 @@ enum slab_stat_type {
#define SO_OBJECTS	(1 << SL_OBJECTS)
#define SO_OBJECTS	(1 << SL_OBJECTS)
#define SO_TOTAL	(1 << SL_TOTAL)
#define SO_TOTAL	(1 << SL_TOTAL)


#ifdef CONFIG_MEMCG
static bool memcg_sysfs_enabled = IS_ENABLED(CONFIG_SLUB_MEMCG_SYSFS_ON);

static int __init setup_slub_memcg_sysfs(char *str)
{
	int v;

	if (get_option(&str, &v) > 0)
		memcg_sysfs_enabled = v;

	return 1;
}

__setup("slub_memcg_sysfs=", setup_slub_memcg_sysfs);
#endif

static ssize_t show_slab_objects(struct kmem_cache *s,
static ssize_t show_slab_objects(struct kmem_cache *s,
			    char *buf, unsigned long flags)
			    char *buf, unsigned long flags)
{
{
@@ -5611,8 +5627,14 @@ static int sysfs_slab_add(struct kmem_cache *s)
{
{
	int err;
	int err;
	const char *name;
	const char *name;
	struct kset *kset = cache_kset(s);
	int unmergeable = slab_unmergeable(s);
	int unmergeable = slab_unmergeable(s);


	if (!kset) {
		kobject_init(&s->kobj, &slab_ktype);
		return 0;
	}

	if (unmergeable) {
	if (unmergeable) {
		/*
		/*
		 * Slabcache can never be merged so we can use the name proper.
		 * Slabcache can never be merged so we can use the name proper.
@@ -5629,7 +5651,7 @@ static int sysfs_slab_add(struct kmem_cache *s)
		name = create_unique_id(s);
		name = create_unique_id(s);
	}
	}


	s->kobj.kset = cache_kset(s);
	s->kobj.kset = kset;
	err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
	err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
	if (err)
	if (err)
		goto out;
		goto out;
@@ -5639,7 +5661,7 @@ static int sysfs_slab_add(struct kmem_cache *s)
		goto out_del_kobj;
		goto out_del_kobj;


#ifdef CONFIG_MEMCG
#ifdef CONFIG_MEMCG
	if (is_root_cache(s)) {
	if (is_root_cache(s) && memcg_sysfs_enabled) {
		s->memcg_kset = kset_create_and_add("cgroup", NULL, &s->kobj);
		s->memcg_kset = kset_create_and_add("cgroup", NULL, &s->kobj);
		if (!s->memcg_kset) {
		if (!s->memcg_kset) {
			err = -ENOMEM;
			err = -ENOMEM;