aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/cgroups/memory.txt4
-rw-r--r--mm/memcontrol.c21
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:
4665.3 swappiness 4665.3 swappiness
467 467
468Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only. 468Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only.
469Please note that unlike the global swappiness, memcg knob set to 0
470really prevents from any swapping even if there is a swap storage
471available. This might lead to memcg OOM killer if there are no file
472pages to reclaim.
469 473
470Following cgroups' swappiness can't be changed. 474Following 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)
1452static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) 1452static 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
1468void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, 1477void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,