[PATCH 2/3] use static_branch for cgroup_xxx_disabled

From: KAMEZAWA Hiroyuki
Date: Wed Nov 23 2011 - 01:53:18 EST


The behavior of cgroup_xxx_disable is determined at boot.
Then, using static_brach() will allow us binary patching rather
than checking global variable.

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx>
---
include/linux/cgroup.h | 8 ++++++++
kernel/cgroup.c | 22 +++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 9eaa6fe..511cb6a 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -16,6 +16,7 @@
#include <linux/prio_heap.h>
#include <linux/rwsem.h>
#include <linux/idr.h>
+#include <linux/jump_label.h>

#ifdef CONFIG_CGROUPS

@@ -526,9 +527,16 @@ struct cgroup_subsys {
#include <linux/cgroup_subsys.h>
#undef SUBSYS

+#ifdef CONFIG_JUMP_LABEL
+#define SUBSYS(_x)\
+ extern struct jump_label_key cgroup_ ## _x ## _disabled_key;\
+ static inline bool cgroup_ ## _x ## _disabled(void){\
+ return static_branch(&cgroup_ ## _x ## _disabled_key);}
+#else
#define SUBSYS(_x)\
static inline bool cgroup_ ## _x ## _disabled(void){\
return _x ## _subsys.disabled;}
+#endif
#define SUBSYS_UNDEFINED(_x)\
static inline bool cgroup_ ## _x ## _disabled(void){\
return true;}
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index d9d5648..28d4430 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -75,7 +75,7 @@ static DEFINE_MUTEX(cgroup_mutex);
static struct cgroup_subsys *subsys[CGROUP_SUBSYS_COUNT] = {
#include <linux/cgroup_subsys.h>
};
-
+#undef SUBSYS
#define MAX_CGROUP_ROOT_NAMELEN 64

/*
@@ -4776,6 +4776,25 @@ static void cgroup_release_agent(struct work_struct *work)
raw_spin_unlock(&release_list_lock);
mutex_unlock(&cgroup_mutex);
}
+#ifdef CONFIG_JUMP_LABEL
+#define SUBSYS(_x)\
+ struct jump_label_key cgroup_ ## _x ## _disable_key;
+#include <linux/cgroup_subsys.h>
+#undef SUBSYS
+
+static void cgroup_subsys_disable(void)
+{
+#define SUBSYS(_x)\
+ if ( _x ## _subsys.disabled)\
+ jump_label_inc(&cgroup_ ## _x ## _disable_key);
+#include <linux/cgroup_subsys.h>
+#undef SUBSYS
+}
+#else
+static void cgroup_subsys_disable(void)
+{
+}
+#endif

static int __init cgroup_disable(char *str)
{
@@ -4800,6 +4819,7 @@ static int __init cgroup_disable(char *str)
}
}
}
+ cgroup_subsys_disable();
return 1;
}
__setup("cgroup_disable=", cgroup_disable);
--
1.7.4.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/