|
@@ -41,6 +41,15 @@
|
|
|
struct cgroup_subsys mem_cgroup_subsys __read_mostly;
|
|
|
#define MEM_CGROUP_RECLAIM_RETRIES 5
|
|
|
|
|
|
+#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
|
|
|
+/* Turned on only when memory cgroup is enabled && really_do_swap_account = 0 */
|
|
|
+int do_swap_account __read_mostly;
|
|
|
+static int really_do_swap_account __initdata = 1; /* for remember boot option*/
|
|
|
+#else
|
|
|
+#define do_swap_account (0)
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* Statistics for memory cgroup.
|
|
|
*/
|
|
@@ -1404,6 +1413,18 @@ static void mem_cgroup_free(struct mem_cgroup *mem)
|
|
|
}
|
|
|
|
|
|
|
|
|
+#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
|
|
|
+static void __init enable_swap_cgroup(void)
|
|
|
+{
|
|
|
+ if (!mem_cgroup_subsys.disabled && really_do_swap_account)
|
|
|
+ do_swap_account = 1;
|
|
|
+}
|
|
|
+#else
|
|
|
+static void __init enable_swap_cgroup(void)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static struct cgroup_subsys_state *
|
|
|
mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
|
|
|
{
|
|
@@ -1419,6 +1440,9 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
|
|
|
for_each_node_state(node, N_POSSIBLE)
|
|
|
if (alloc_mem_cgroup_per_zone_info(mem, node))
|
|
|
goto free_out;
|
|
|
+ /* root ? */
|
|
|
+ if (cont->parent == NULL)
|
|
|
+ enable_swap_cgroup();
|
|
|
|
|
|
return &mem->css;
|
|
|
free_out:
|
|
@@ -1490,3 +1514,13 @@ struct cgroup_subsys mem_cgroup_subsys = {
|
|
|
.attach = mem_cgroup_move_task,
|
|
|
.early_init = 0,
|
|
|
};
|
|
|
+
|
|
|
+#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
|
|
|
+
|
|
|
+static int __init disable_swap_account(char *s)
|
|
|
+{
|
|
|
+ really_do_swap_account = 0;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+__setup("noswapaccount", disable_swap_account);
|
|
|
+#endif
|