summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2013-02-22 16:32:10 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 17:50:09 -0800
commit7c5bd705d8f983ae1868a126956f5aa3a6702e3f (patch)
tree12aceb30f35d809068d58e0ced3d8613e4ad85ca
parent2a6f512412c7aecd04134721ea392cc496e6c017 (diff)
downloadlinux-exynos-7c5bd705d8f983ae1868a126956f5aa3a6702e3f.tar.gz
linux-exynos-7c5bd705d8f983ae1868a126956f5aa3a6702e3f.tar.bz2
linux-exynos-7c5bd705d8f983ae1868a126956f5aa3a6702e3f.zip
mm: memcg: only evict file pages when we have plenty
Commit e9868505987a ("mm, vmscan: only evict file pages when we have plenty") makes a point of not going for anonymous memory while there is still enough inactive cache around. The check was added only for global reclaim, but it is just as useful to reduce swapping in memory cgroup reclaim: 200M-memcg-defconfig-j2 vanilla patched Real time 454.06 ( +0.00%) 453.71 ( -0.08%) User time 668.57 ( +0.00%) 668.73 ( +0.02%) System time 128.92 ( +0.00%) 129.53 ( +0.46%) Swap in 1246.80 ( +0.00%) 814.40 ( -34.65%) Swap out 1198.90 ( +0.00%) 827.00 ( -30.99%) Pages allocated 16431288.10 ( +0.00%) 16434035.30 ( +0.02%) Major faults 681.50 ( +0.00%) 593.70 ( -12.86%) THP faults 237.20 ( +0.00%) 242.40 ( +2.18%) THP collapse 241.20 ( +0.00%) 248.50 ( +3.01%) THP splits 157.30 ( +0.00%) 161.40 ( +2.59%) Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.cz> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Mel Gorman <mgorman@suse.de> Cc: Hugh Dickins <hughd@google.com> Cc: Satoru Moriya <satoru.moriya@hds.com> Cc: Simon Jeons <simon.jeons@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/vmscan.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 196709f5ee58..ff842d9a7714 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1700,19 +1700,21 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
fraction[1] = 0;
denominator = 1;
goto out;
- } else if (!inactive_file_is_low_global(zone)) {
- /*
- * There is enough inactive page cache, do not
- * reclaim anything from the working set right now.
- */
- fraction[0] = 0;
- fraction[1] = 1;
- denominator = 1;
- goto out;
}
}
/*
+ * There is enough inactive page cache, do not reclaim
+ * anything from the anonymous working set right now.
+ */
+ if (!inactive_file_is_low(lruvec)) {
+ fraction[0] = 0;
+ fraction[1] = 1;
+ denominator = 1;
+ goto out;
+ }
+
+ /*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/