|
@@ -5823,33 +5823,6 @@ static struct cftype mem_cgroup_files[] = {
|
|
|
.read_seq_string = memcg_numa_stat_show,
|
|
|
},
|
|
|
#endif
|
|
|
-#ifdef CONFIG_MEMCG_SWAP
|
|
|
- {
|
|
|
- .name = "memsw.usage_in_bytes",
|
|
|
- .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE),
|
|
|
- .read = mem_cgroup_read,
|
|
|
- .register_event = mem_cgroup_usage_register_event,
|
|
|
- .unregister_event = mem_cgroup_usage_unregister_event,
|
|
|
- },
|
|
|
- {
|
|
|
- .name = "memsw.max_usage_in_bytes",
|
|
|
- .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE),
|
|
|
- .trigger = mem_cgroup_reset,
|
|
|
- .read = mem_cgroup_read,
|
|
|
- },
|
|
|
- {
|
|
|
- .name = "memsw.limit_in_bytes",
|
|
|
- .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),
|
|
|
- .write_string = mem_cgroup_write,
|
|
|
- .read = mem_cgroup_read,
|
|
|
- },
|
|
|
- {
|
|
|
- .name = "memsw.failcnt",
|
|
|
- .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT),
|
|
|
- .trigger = mem_cgroup_reset,
|
|
|
- .read = mem_cgroup_read,
|
|
|
- },
|
|
|
-#endif
|
|
|
#ifdef CONFIG_MEMCG_KMEM
|
|
|
{
|
|
|
.name = "kmem.limit_in_bytes",
|
|
@@ -5884,6 +5857,36 @@ static struct cftype mem_cgroup_files[] = {
|
|
|
{ }, /* terminate */
|
|
|
};
|
|
|
|
|
|
+#ifdef CONFIG_MEMCG_SWAP
|
|
|
+static struct cftype memsw_cgroup_files[] = {
|
|
|
+ {
|
|
|
+ .name = "memsw.usage_in_bytes",
|
|
|
+ .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE),
|
|
|
+ .read = mem_cgroup_read,
|
|
|
+ .register_event = mem_cgroup_usage_register_event,
|
|
|
+ .unregister_event = mem_cgroup_usage_unregister_event,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "memsw.max_usage_in_bytes",
|
|
|
+ .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE),
|
|
|
+ .trigger = mem_cgroup_reset,
|
|
|
+ .read = mem_cgroup_read,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "memsw.limit_in_bytes",
|
|
|
+ .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),
|
|
|
+ .write_string = mem_cgroup_write,
|
|
|
+ .read = mem_cgroup_read,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "memsw.failcnt",
|
|
|
+ .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT),
|
|
|
+ .trigger = mem_cgroup_reset,
|
|
|
+ .read = mem_cgroup_read,
|
|
|
+ },
|
|
|
+ { }, /* terminate */
|
|
|
+};
|
|
|
+#endif
|
|
|
static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *memcg, int node)
|
|
|
{
|
|
|
struct mem_cgroup_per_node *pn;
|
|
@@ -6783,19 +6786,6 @@ struct cgroup_subsys mem_cgroup_subsys = {
|
|
|
.use_id = 1,
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * The rest of init is performed during ->css_alloc() for root css which
|
|
|
- * happens before initcalls. hotcpu_notifier() can't be done together as
|
|
|
- * it would introduce circular locking by adding cgroup_lock -> cpu hotplug
|
|
|
- * dependency. Do it from a subsys_initcall().
|
|
|
- */
|
|
|
-static int __init mem_cgroup_init(void)
|
|
|
-{
|
|
|
- hotcpu_notifier(memcg_cpu_hotplug_callback, 0);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-subsys_initcall(mem_cgroup_init);
|
|
|
-
|
|
|
#ifdef CONFIG_MEMCG_SWAP
|
|
|
static int __init enable_swap_account(char *s)
|
|
|
{
|
|
@@ -6808,4 +6798,28 @@ static int __init enable_swap_account(char *s)
|
|
|
}
|
|
|
__setup("swapaccount=", enable_swap_account);
|
|
|
|
|
|
+static void __init memsw_file_init(void)
|
|
|
+{
|
|
|
+ if (really_do_swap_account)
|
|
|
+ WARN_ON(cgroup_add_cftypes(&mem_cgroup_subsys,
|
|
|
+ memsw_cgroup_files));
|
|
|
+}
|
|
|
+#else
|
|
|
+static void __init memsw_file_init(void)
|
|
|
+{
|
|
|
+}
|
|
|
#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * The rest of init is performed during ->css_alloc() for root css which
|
|
|
+ * happens before initcalls. hotcpu_notifier() can't be done together as
|
|
|
+ * it would introduce circular locking by adding cgroup_lock -> cpu hotplug
|
|
|
+ * dependency. Do it from a subsys_initcall().
|
|
|
+ */
|
|
|
+static int __init mem_cgroup_init(void)
|
|
|
+{
|
|
|
+ hotcpu_notifier(memcg_cpu_hotplug_callback, 0);
|
|
|
+ memsw_file_init();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+subsys_initcall(mem_cgroup_init);
|