for the soft_limit reclaim has more directivity than global reclaim, we have current memcg be skipped to avoid potential page thrashing. Signed-off-by: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxxxxxx> --- mm/memcontrol.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8c0280b..9d09e95 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2537,12 +2537,21 @@ unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, mz = mem_cgroup_largest_soft_limit_node(mctz); if (!mz) break; - + /* + * skip current memcg to avoid page thrashing, for the + * mem_cgroup_soft_reclaim has more directivity than + * global reclaim. + */ + if (get_mem_cgroup_from_mm(current->mm) == mz->memcg) { + reclaimed = 0; + goto next; + } nr_scanned = 0; reclaimed = mem_cgroup_soft_reclaim(mz->memcg, pgdat, gfp_mask, &nr_scanned); nr_reclaimed += reclaimed; *total_scanned += nr_scanned; +next: spin_lock_irq(&mctz->lock); __mem_cgroup_remove_exceeded(mz, mctz); -- 1.9.1