aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSatoru Moriya <satoru.moriya@hds.com>2012-05-29 18:06:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-29 19:22:24 -0400
commitfe35004fbf9eaf67482b074a2e032abb9c89b1dd (patch)
treea4c1387c914e6967d9a2e60174dc1dd78af72ee8
parentc50ac050811d6485616a193eb0f37bfbd191cc89 (diff)
mm: avoid swapping out with swappiness==0
Sometimes we'd like to avoid swapping out anonymous memory. In particular, avoid swapping out pages of important process or process groups while there is a reasonable amount of pagecache on RAM so that we can satisfy our customers' requirements. OTOH, we can control how aggressive the kernel will swap memory pages with /proc/sys/vm/swappiness for global and /sys/fs/cgroup/memory/memory.swappiness for each memcg. But with current reclaim implementation, the kernel may swap out even if we set swappiness=0 and there is pagecache in RAM. This patch changes the behavior with swappiness==0. If we set swappiness==0, the kernel does not swap out completely (for global reclaim until the amount of free pages and filebacked pages in a zone has been reduced to something very very small (nr_free + nr_filebacked < high watermark)). Signed-off-by: Satoru Moriya <satoru.moriya@hds.com> Acked-by: Minchan Kim <minchan@kernel.org> Reviewed-by: Rik van Riel <riel@redhat.com> Acked-by: Jerome Marchand <jmarchan@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/vmscan.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 67a4fd4792de..ee975302877d 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1761,10 +1761,10 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc,
1761 * proportional to the fraction of recently scanned pages on 1761 * proportional to the fraction of recently scanned pages on
1762 * each list that were recently referenced and in active use. 1762 * each list that were recently referenced and in active use.
1763 */ 1763 */
1764 ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1); 1764 ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);
1765 ap /= reclaim_stat->recent_rotated[0] + 1; 1765 ap /= reclaim_stat->recent_rotated[0] + 1;
1766 1766
1767 fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1); 1767 fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);
1768 fp /= reclaim_stat->recent_rotated[1] + 1; 1768 fp /= reclaim_stat->recent_rotated[1] + 1;
1769 spin_unlock_irq(&mz->zone->lru_lock); 1769 spin_unlock_irq(&mz->zone->lru_lock);
1770 1770
@@ -1777,7 +1777,7 @@ out:
1777 unsigned long scan; 1777 unsigned long scan;
1778 1778
1779 scan = zone_nr_lru_pages(mz, lru); 1779 scan = zone_nr_lru_pages(mz, lru);
1780 if (priority || noswap) { 1780 if (priority || noswap || !vmscan_swappiness(mz, sc)) {
1781 scan >>= priority; 1781 scan >>= priority;
1782 if (!scan && force_scan) 1782 if (!scan && force_scan)
1783 scan = SWAP_CLUSTER_MAX; 1783 scan = SWAP_CLUSTER_MAX;