diff options
| -rw-r--r-- | Documentation/cgroups/memory.txt | 4 | ||||
| -rw-r--r-- | mm/memcontrol.c | 21 |
2 files changed, 19 insertions, 6 deletions
diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index c07f7b4fb88d..71c4da413444 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt | |||
| @@ -466,6 +466,10 @@ Note: | |||
| 466 | 5.3 swappiness | 466 | 5.3 swappiness |
| 467 | 467 | ||
| 468 | Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only. | 468 | Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only. |
| 469 | Please note that unlike the global swappiness, memcg knob set to 0 | ||
| 470 | really prevents from any swapping even if there is a swap storage | ||
| 471 | available. This might lead to memcg OOM killer if there are no file | ||
| 472 | pages to reclaim. | ||
| 469 | 473 | ||
| 470 | Following cgroups' swappiness can't be changed. | 474 | Following cgroups' swappiness can't be changed. |
| 471 | - root cgroup (uses /proc/sys/vm/swappiness). | 475 | - root cgroup (uses /proc/sys/vm/swappiness). |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7acf43bf04a2..93a7e36ded89 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1452,17 +1452,26 @@ static int mem_cgroup_count_children(struct mem_cgroup *memcg) | |||
| 1452 | static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) | 1452 | static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) |
| 1453 | { | 1453 | { |
| 1454 | u64 limit; | 1454 | u64 limit; |
| 1455 | u64 memsw; | ||
| 1456 | 1455 | ||
| 1457 | limit = res_counter_read_u64(&memcg->res, RES_LIMIT); | 1456 | limit = res_counter_read_u64(&memcg->res, RES_LIMIT); |
| 1458 | limit += total_swap_pages << PAGE_SHIFT; | ||
| 1459 | 1457 | ||
| 1460 | memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT); | ||
| 1461 | /* | 1458 | /* |
| 1462 | * If memsw is finite and limits the amount of swap space available | 1459 | * Do not consider swap space if we cannot swap due to swappiness |
| 1463 | * to this memcg, return that limit. | ||
| 1464 | */ | 1460 | */ |
| 1465 | return min(limit, memsw); | 1461 | if (mem_cgroup_swappiness(memcg)) { |
| 1462 | u64 memsw; | ||
| 1463 | |||
| 1464 | limit += total_swap_pages << PAGE_SHIFT; | ||
| 1465 | memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT); | ||
| 1466 | |||
| 1467 | /* | ||
| 1468 | * If memsw is finite and limits the amount of swap space | ||
| 1469 | * available to this memcg, return that limit. | ||
| 1470 | */ | ||
| 1471 | limit = min(limit, memsw); | ||
| 1472 | } | ||
| 1473 | |||
| 1474 | return limit; | ||
| 1466 | } | 1475 | } |
| 1467 | 1476 | ||
| 1468 | void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | 1477 | void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, |
