mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
vmscan: do not evict inactive pages when skipping an active list scan
commit b39415b273 upstream.
In AIM7 runs, recent kernels start swapping out anonymous pages well
before they should. This is due to shrink_list falling through to
shrink_inactive_list if !inactive_anon_is_low(zone, sc), when all we
really wanted to do is pre-age some anonymous pages to give them extra
time to be referenced while on the inactive list.
The obvious fix is to make sure that shrink_list does not fall through to
scanning/reclaiming inactive pages when we called it to scan one of the
active lists.
This change should be safe because the loop in shrink_zone ensures that we
will still shrink the anon and file inactive lists whenever we should.
[kosaki.motohiro@jp.fujitsu.com: inactive_file_is_low() should be inactive_anon_is_low()]
Reported-by: Larry Woodman <lwoodman@redhat.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Tomasz Chmielewski <mangoo@wpkg.org>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Rik Theys <rik.theys@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
370b758855
commit
b2ea8cb9c8
18
mm/vmscan.c
18
mm/vmscan.c
@@ -1464,20 +1464,26 @@ static int inactive_file_is_low(struct zone *zone, struct scan_control *sc)
|
||||
return low;
|
||||
}
|
||||
|
||||
static int inactive_list_is_low(struct zone *zone, struct scan_control *sc,
|
||||
int file)
|
||||
{
|
||||
if (file)
|
||||
return inactive_file_is_low(zone, sc);
|
||||
else
|
||||
return inactive_anon_is_low(zone, sc);
|
||||
}
|
||||
|
||||
static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
|
||||
struct zone *zone, struct scan_control *sc, int priority)
|
||||
{
|
||||
int file = is_file_lru(lru);
|
||||
|
||||
if (lru == LRU_ACTIVE_FILE && inactive_file_is_low(zone, sc)) {
|
||||
shrink_active_list(nr_to_scan, zone, sc, priority, file);
|
||||
if (is_active_lru(lru)) {
|
||||
if (inactive_list_is_low(zone, sc, file))
|
||||
shrink_active_list(nr_to_scan, zone, sc, priority, file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lru == LRU_ACTIVE_ANON && inactive_anon_is_low(zone, sc)) {
|
||||
shrink_active_list(nr_to_scan, zone, sc, priority, file);
|
||||
return 0;
|
||||
}
|
||||
return shrink_inactive_list(nr_to_scan, zone, sc, priority, file);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user