Skip to content

Commit 7adaec3

Browse files
Michal Hockogregkh
Michal Hocko
authored andcommitted
memcg: oom: fix totalpages calculation for memory.swappiness==0
commit 9a5a8f1 upstream. oom_badness() takes a totalpages argument which says how many pages are available and it uses it as a base for the score calculation. The value is calculated by mem_cgroup_get_limit which considers both limit and total_swap_pages (resp. memsw portion of it). This is usually correct but since fe35004 ("mm: avoid swapping out with swappiness==0") we do not swap when swappiness is 0 which means that we cannot really use up all the totalpages pages. This in turn confuses oom score calculation if the memcg limit is much smaller than the available swap because the used memory (capped by the limit) is negligible comparing to totalpages so the resulting score is too small if adj!=0 (typically task with CAP_SYS_ADMIN or non zero oom_score_adj). A wrong process might be selected as result. The problem can be worked around by checking mem_cgroup_swappiness==0 and not considering swap at all in such a case. Signed-off-by: Michal Hocko <mhocko@suse.cz> Acked-by: David Rientjes <rientjes@google.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 6084d9f commit 7adaec3

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

Documentation/cgroups/memory.txt

+4
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,10 @@ Note:
466466
5.3 swappiness
467467

468468
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.
469473

470474
Following cgroups' swappiness can't be changed.
471475
- root cgroup (uses /proc/sys/vm/swappiness).

mm/memcontrol.c

+15-6
Original file line numberDiff line numberDiff line change
@@ -1458,17 +1458,26 @@ static int mem_cgroup_count_children(struct mem_cgroup *memcg)
14581458
static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg)
14591459
{
14601460
u64 limit;
1461-
u64 memsw;
14621461

14631462
limit = res_counter_read_u64(&memcg->res, RES_LIMIT);
1464-
limit += total_swap_pages << PAGE_SHIFT;
14651463

1466-
memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
14671464
/*
1468-
* If memsw is finite and limits the amount of swap space available
1469-
* to this memcg, return that limit.
1465+
* Do not consider swap space if we cannot swap due to swappiness
14701466
*/
1471-
return min(limit, memsw);
1467+
if (mem_cgroup_swappiness(memcg)) {
1468+
u64 memsw;
1469+
1470+
limit += total_swap_pages << PAGE_SHIFT;
1471+
memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
1472+
1473+
/*
1474+
* If memsw is finite and limits the amount of swap space
1475+
* available to this memcg, return that limit.
1476+
*/
1477+
limit = min(limit, memsw);
1478+
}
1479+
1480+
return limit;
14721481
}
14731482

14741483
void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,

0 commit comments

Comments
 (0)