[Devel] [PATCH RHEL7 COMMIT] cgroup/debug: Disable css_get/put stacks saver by default.
Konstantin Khorenko
khorenko at virtuozzo.com
Mon Mar 16 14:56:42 MSK 2020
The commit is pushed to "branch-rh7-3.10.0-1062.12.1.vz7.131.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1062.12.1.vz7.131.9
------>
commit d30438cd8e5781a153e471dd72f6273a94eca0fa
Author: Andrey Ryabinin <aryabinin at virtuozzo.com>
Date: Mon Mar 16 14:22:04 2020 +0300
cgroup/debug: Disable css_get/put stacks saver by default.
Disable css_get/put stacks saver by default as they have too much
overhead. Add file in debugfs to enable it:
echo 1 > /sys/kernel/debug/css_stacks
https://jira.sw.ru/browse/PSBM-98148
https://jira.sw.ru/browse/PSBM-102118
This is a disable/enable tweak for commit
cfe98506b59dc ("mm/memcg: save css_get/put stacks")
Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
include/linux/cgroup.h | 12 ++++++++++--
kernel/cgroup.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index a2c5f07170725..bd48216e7ac29 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -150,14 +150,22 @@ enum {
CSS_ONLINE = (1 << 1), /* between ->css_online() and ->css_offline() */
};
+
+extern struct static_key css_stacks_on;
+void __save_css_stack(struct cgroup_subsys_state *css);
+
+static inline void save_css_stack(struct cgroup_subsys_state *css)
+{
+ if (static_key_false(&css_stacks_on))
+ __save_css_stack(css);
+}
+
/*
* Call css_get() to hold a reference on the css; it can be used
* for a reference obtained via:
* - an existing ref-counted reference to the css
* - task->cgroups for a locked task
*/
-void save_css_stack(struct cgroup_subsys_state *css);
-
static inline void css_get(struct cgroup_subsys_state *css)
{
/* We don't need to reference count the root state */
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index f46ef8de43ee6..50d4b3df0f0a1 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -29,6 +29,7 @@
#include <linux/cgroup.h>
#include <linux/cred.h>
#include <linux/ctype.h>
+#include <linux/debugfs.h>
#include <linux/errno.h>
#include <linux/init_task.h>
#include <linux/kernel.h>
@@ -4165,13 +4166,51 @@ static void css_release(struct percpu_ref *ref)
queue_work(cgroup_destroy_wq, &css->dput_work);
}
+struct static_key css_stacks_on = STATIC_KEY_INIT_FALSE;
+EXPORT_SYMBOL(css_stacks_on);
+
+#ifdef CONFIG_DEBUG_FS
+static int css_stacks_get(void *data, u64 *val)
+{
+ *val = static_key_false(&css_stacks_on);
+ return 0;
+}
+
+static int css_stacks_set(void *data, u64 val)
+{
+ if (val != 0 && val != 1)
+ return -EINVAL;
+
+ if (static_key_false(&css_stacks_on) && !val)
+ static_key_slow_dec(&css_stacks_on);
+ else if (!static_key_false(&css_stacks_on) && val)
+ static_key_slow_inc(&css_stacks_on);
+
+ return 0;
+}
+DEFINE_SIMPLE_ATTRIBUTE(css_stacks_fops,
+ css_stacks_get, css_stacks_set, "%llu\n");
+
+static int __init css_stacks_debugfs(void)
+{
+ void *ret;
+
+ ret = debugfs_create_file("css_stacks", 0644, NULL, NULL,
+ &css_stacks_fops);
+ if (!ret)
+ pr_warn("Failed to create css_stacks in debugfs");
+ return 0;
+}
+late_initcall(css_stacks_debugfs);
+#endif
+
static void init_cgroup_css(struct cgroup_subsys_state *css,
struct cgroup_subsys *ss,
struct cgroup *cgrp)
{
css->cgroup = cgrp;
css->flags = 0;
- if (slab_is_available())
+ if (static_key_false(&css_stacks_on) && slab_is_available())
css->stacks = (struct css_stacks *)
__get_free_pages(GFP_KERNEL|__GFP_NOFAIL|__GFP_ZERO, 1);
else
@@ -4204,7 +4243,7 @@ static int online_css(struct cgroup_subsys *ss, struct cgroup *cgrp)
return ret;
}
-void save_css_stack(struct cgroup_subsys_state *css)
+void __save_css_stack(struct cgroup_subsys_state *css)
{
unsigned long entries[8];
unsigned int offset;
@@ -4229,7 +4268,7 @@ void save_css_stack(struct cgroup_subsys_state *css)
save_stack_trace(&trace);
memcpy(((char*)css_stacks)+offset, entries, trace.max_entries*8);
}
-EXPORT_SYMBOL(save_css_stack);
+EXPORT_SYMBOL(__save_css_stack);
/* if the CSS is online, invoke ->pre_destory() on it and mark it offline */
static void offline_css(struct cgroup_subsys *ss, struct cgroup *cgrp)
More information about the Devel
mailing list