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.hu...@spreadtrum.com>
---
 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

Reply via email to