On Sun, 27 Dec 2009, Rik van Riel wrote: > On 12/27/2009 12:12 PM, Avi Kivity wrote: > > On 12/27/2009 06:45 PM, Rik van Riel wrote: > > > > > > > If so, it doesn't copy stable@xxxxxxxxxxx Is it queued for -stable? > > > > > > I do not believe that it is queued for -stable. > > > > > > Do performance fixes fit with -stable policy? > > > > If it is a serious regression, I believe it fits. > > It's probably been there since 2.6.28, though it might have been > introduced later with a cleanup patch. It seems to go back at > least as far as March... It does look as if it would have got worse in 2.6.31 and 2.6.32 - though I am reluctant to predict how these scans work out in practice from just glancing at the code! I agree with Avi (or with Avi's implication), that it would be worth sending the fix to -stable - but it would be nice to hear if the patch (inline below) actually does fix Daniel's problem. It applies and builds correctly on 2.6.31.9 and 2.6.32.3. We have certainly sent much more specialized performance fixes to -stable (I'm thinking of Lee's anon_vma locking), and I see this as more of a straightforward bugfix anyway - people get worried by going into swap without understanding why. I forget which patch of mine Avi was thinking of, but I'm pretty sure Rik's will prove much the more relevant. Hugh commit b39415b2731d7dec5e612d2d12595da82399eedf Author: Rik van Riel <riel@xxxxxxxxxx> Date: Mon Dec 14 17:59:48 2009 -0800 vmscan: do not evict inactive pages when skipping an active list scan 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@xxxxxxxxxxxxxx: inactive_file_is_low() should be inactive_anon_is_low()] Reported-by: Larry Woodman <lwoodman@xxxxxxxxxx> Signed-off-by: Rik van Riel <riel@xxxxxxxxxx> Acked-by: Johannes Weiner <hannes@xxxxxxxxxxx> Cc: Tomasz Chmielewski <mangoo@xxxxxxxx> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> diff --git a/mm/vmscan.c b/mm/vmscan.c index 2ef59d5..0465818 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1463,20 +1463,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); } -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html