(2011/06/24 23:44), Mel Gorman wrote: > During allocator-intensive workloads, kswapd will be woken frequently > causing free memory to oscillate between the high and min watermark. > This is expected behaviour. > > When kswapd applies pressure to zones during node balancing, it checks > if the zone is above a high+balance_gap threshold. If it is, it does > not apply pressure but it unconditionally shrinks slab on a global > basis which is excessive. In the event kswapd is being kept awake due to > a high small unreclaimable zone, it skips zone shrinking but still > calls shrink_slab(). > > Once pressure has been applied, the check for zone being unreclaimable > is being made before the check is made if all_unreclaimable should be > set. This miss of unreclaimable can cause has_under_min_watermark_zone > to be set due to an unreclaimable zone preventing kswapd backing off > on congestion_wait(). > > Reported-and-tested-by: Pádraig Brady <P@xxxxxxxxxxxxxx> > Signed-off-by: Mel Gorman <mgorman@xxxxxxx> > --- > mm/vmscan.c | 23 +++++++++++++---------- > 1 files changed, 13 insertions(+), 10 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 841e3bf..9cebed1 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -2507,18 +2507,18 @@ loop_again: > KSWAPD_ZONE_BALANCE_GAP_RATIO); > if (!zone_watermark_ok_safe(zone, order, > high_wmark_pages(zone) + balance_gap, > - end_zone, 0)) > + end_zone, 0)) { > shrink_zone(priority, zone, &sc); > - reclaim_state->reclaimed_slab = 0; > - nr_slab = shrink_slab(&shrink, sc.nr_scanned, lru_pages); > - sc.nr_reclaimed += reclaim_state->reclaimed_slab; > - total_scanned += sc.nr_scanned; > > - if (zone->all_unreclaimable) > - continue; > - if (nr_slab == 0 && > - !zone_reclaimable(zone)) > - zone->all_unreclaimable = 1; > + reclaim_state->reclaimed_slab = 0; > + nr_slab = shrink_slab(&shrink, sc.nr_scanned, lru_pages); > + sc.nr_reclaimed += reclaim_state->reclaimed_slab; > + total_scanned += sc.nr_scanned; > + > + if (nr_slab == 0 && !zone_reclaimable(zone)) > + zone->all_unreclaimable = 1; > + } > + > /* > * If we've done a decent amount of scanning and > * the reclaim ratio is low, start doing writepage > @@ -2528,6 +2528,9 @@ loop_again: > total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2) > sc.may_writepage = 1; > > + if (zone->all_unreclaimable) > + continue; > + > if (!zone_watermark_ok_safe(zone, order, > high_wmark_pages(zone), end_zone, 0)) { > all_zones_ok = 0; Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>