diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 3 | ||||
-rw-r--r-- | include/linux/memcontrol.h | 3 | ||||
-rw-r--r-- | init/Kconfig | 17 | ||||
-rw-r--r-- | mm/memcontrol.c | 34 |
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, | |||
77 | extern long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, struct zone *zone, | 77 | extern 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 | ||
81 | extern int do_swap_account; | ||
82 | #endif | ||
80 | 83 | ||
81 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | 84 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
82 | struct mem_cgroup; | 85 | struct 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 | |||
428 | config MM_OWNER | 428 | config MM_OWNER |
429 | bool | 429 | bool |
430 | 430 | ||
431 | config 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 | |||
431 | endmenu | 448 | endmenu |
432 | 449 | ||
433 | config SYSFS_DEPRECATED | 450 | config 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 @@ | |||
41 | struct cgroup_subsys mem_cgroup_subsys __read_mostly; | 41 | struct 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 */ | ||
46 | int do_swap_account __read_mostly; | ||
47 | static 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 | ||
1417 | static 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 | ||
1423 | static void __init enable_swap_cgroup(void) | ||
1424 | { | ||
1425 | } | ||
1426 | #endif | ||
1427 | |||
1407 | static struct cgroup_subsys_state * | 1428 | static struct cgroup_subsys_state * |
1408 | mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) | 1429 | mem_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; |
1424 | free_out: | 1448 | free_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 | |||
1520 | static 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 | ||