aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kernel-parameters.txt3
-rw-r--r--include/linux/memcontrol.h3
-rw-r--r--init/Kconfig17
-rw-r--r--mm/memcontrol.c34
4 files changed, 57 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 532eacbbed62..fb849020aea9 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1562,6 +1562,9 @@ and is between 256 and 4096 characters. It is defined in the file
1562 1562
1563 nosoftlockup [KNL] Disable the soft-lockup detector. 1563 nosoftlockup [KNL] Disable the soft-lockup detector.
1564 1564
1565 noswapaccount [KNL] Disable accounting of swap in memory resource
1566 controller. (See Documentation/controllers/memory.txt)
1567
1565 nosync [HW,M68K] Disables sync negotiation for all devices. 1568 nosync [HW,M68K] Disables sync negotiation for all devices.
1566 1569
1567 notsc [BUGS=X86-32] Disable Time Stamp Counter 1570 notsc [BUGS=X86-32] Disable Time Stamp Counter
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index b095f5f6ecf7..41b46cc9d1f1 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -77,6 +77,9 @@ extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem,
77extern long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, struct zone *zone, 77extern long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, struct zone *zone,
78 int priority, enum lru_list lru); 78 int priority, enum lru_list lru);
79 79
80#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
81extern int do_swap_account;
82#endif
80 83
81#else /* CONFIG_CGROUP_MEM_RES_CTLR */ 84#else /* CONFIG_CGROUP_MEM_RES_CTLR */
82struct mem_cgroup; 85struct mem_cgroup;
diff --git a/init/Kconfig b/init/Kconfig
index 7cbe1f43ca22..a724a149bf3f 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -428,6 +428,23 @@ config CGROUP_MEM_RES_CTLR
428config MM_OWNER 428config MM_OWNER
429 bool 429 bool
430 430
431config CGROUP_MEM_RES_CTLR_SWAP
432 bool "Memory Resource Controller Swap Extension(EXPERIMENTAL)"
433 depends on CGROUP_MEM_RES_CTLR && SWAP && EXPERIMENTAL
434 help
435 Add swap management feature to memory resource controller. When you
436 enable this, you can limit mem+swap usage per cgroup. In other words,
437 when you disable this, memory resource controller has no cares to
438 usage of swap...a process can exhaust all of the swap. This extension
439 is useful when you want to avoid exhaustion swap but this itself
440 adds more overheads and consumes memory for remembering information.
441 Especially if you use 32bit system or small memory system, please
442 be careful about enabling this. When memory resource controller
443 is disabled by boot option, this will be automatically disabled and
444 there will be no overhead from this. Even when you set this config=y,
445 if boot option "noswapaccount" is set, swap will not be accounted.
446
447
431endmenu 448endmenu
432 449
433config SYSFS_DEPRECATED 450config SYSFS_DEPRECATED
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 7288e9d85ca7..59dd8c116372 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -41,6 +41,15 @@
41struct cgroup_subsys mem_cgroup_subsys __read_mostly; 41struct cgroup_subsys mem_cgroup_subsys __read_mostly;
42#define MEM_CGROUP_RECLAIM_RETRIES 5 42#define MEM_CGROUP_RECLAIM_RETRIES 5
43 43
44#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
45/* Turned on only when memory cgroup is enabled && really_do_swap_account = 0 */
46int do_swap_account __read_mostly;
47static int really_do_swap_account __initdata = 1; /* for remember boot option*/
48#else
49#define do_swap_account (0)
50#endif
51
52
44/* 53/*
45 * Statistics for memory cgroup. 54 * Statistics for memory cgroup.
46 */ 55 */
@@ -1404,6 +1413,18 @@ static void mem_cgroup_free(struct mem_cgroup *mem)
1404} 1413}
1405 1414
1406 1415
1416#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
1417static void __init enable_swap_cgroup(void)
1418{
1419 if (!mem_cgroup_subsys.disabled && really_do_swap_account)
1420 do_swap_account = 1;
1421}
1422#else
1423static void __init enable_swap_cgroup(void)
1424{
1425}
1426#endif
1427
1407static struct cgroup_subsys_state * 1428static struct cgroup_subsys_state *
1408mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) 1429mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
1409{ 1430{
@@ -1419,6 +1440,9 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
1419 for_each_node_state(node, N_POSSIBLE) 1440 for_each_node_state(node, N_POSSIBLE)
1420 if (alloc_mem_cgroup_per_zone_info(mem, node)) 1441 if (alloc_mem_cgroup_per_zone_info(mem, node))
1421 goto free_out; 1442 goto free_out;
1443 /* root ? */
1444 if (cont->parent == NULL)
1445 enable_swap_cgroup();
1422 1446
1423 return &mem->css; 1447 return &mem->css;
1424free_out: 1448free_out:
@@ -1490,3 +1514,13 @@ struct cgroup_subsys mem_cgroup_subsys = {
1490 .attach = mem_cgroup_move_task, 1514 .attach = mem_cgroup_move_task,
1491 .early_init = 0, 1515 .early_init = 0,
1492}; 1516};
1517
1518#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
1519
1520static int __init disable_swap_account(char *s)
1521{
1522 really_do_swap_account = 0;
1523 return 1;
1524}
1525__setup("noswapaccount", disable_swap_account);
1526#endif