Commit fe35004f authored by Satoru Moriya's avatar Satoru Moriya Committed by Linus Torvalds

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: default avatarSatoru Moriya <satoru.moriya@hds.com>
Acked-by: default avatarMinchan Kim <minchan@kernel.org>
Reviewed-by: default avatarRik van Riel <riel@redhat.com>
Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c50ac050
...@@ -1761,10 +1761,10 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc, ...@@ -1761,10 +1761,10 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc,
* proportional to the fraction of recently scanned pages on * proportional to the fraction of recently scanned pages on
* each list that were recently referenced and in active use. * each list that were recently referenced and in active use.
*/ */
ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1); ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);
ap /= reclaim_stat->recent_rotated[0] + 1; ap /= reclaim_stat->recent_rotated[0] + 1;
fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1); fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);
fp /= reclaim_stat->recent_rotated[1] + 1; fp /= reclaim_stat->recent_rotated[1] + 1;
spin_unlock_irq(&mz->zone->lru_lock); spin_unlock_irq(&mz->zone->lru_lock);
...@@ -1777,7 +1777,7 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc, ...@@ -1777,7 +1777,7 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc,
unsigned long scan; unsigned long scan;
scan = zone_nr_lru_pages(mz, lru); scan = zone_nr_lru_pages(mz, lru);
if (priority || noswap) { if (priority || noswap || !vmscan_swappiness(mz, sc)) {
scan >>= priority; scan >>= priority;
if (!scan && force_scan) if (!scan && force_scan)
scan = SWAP_CLUSTER_MAX; scan = SWAP_CLUSTER_MAX;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment