diff options
author | Satoru Moriya <satoru.moriya@hds.com> | 2012-05-29 18:06:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:24 -0400 |
commit | fe35004fbf9eaf67482b074a2e032abb9c89b1dd (patch) | |
tree | a4c1387c914e6967d9a2e60174dc1dd78af72ee8 | |
parent | c50ac050811d6485616a193eb0f37bfbd191cc89 (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.c | 6 |
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; |