From: Wu Fengguang In shrink_inactive_list(), nr_scan is not accounted when nr_taken is 0. But 0 pages taken does not mean 0 pages scanned. Move the goto statement below the accounting code to fix it. Signed-off-by: Wu Fengguang Signed-off-by: Andrew Morton --- mm/vmscan.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff -puN mm/vmscan.c~mm-shrink_inactive_lis-nr_scan-accounting-fix mm/vmscan.c --- devel/mm/vmscan.c~mm-shrink_inactive_lis-nr_scan-accounting-fix 2006-03-16 02:08:09.000000000 -0800 +++ devel-akpm/mm/vmscan.c 2006-03-16 02:08:09.000000000 -0800 @@ -1132,9 +1132,6 @@ static unsigned long shrink_inactive_lis zone->pages_scanned += nr_scan; spin_unlock_irq(&zone->lru_lock); - if (nr_taken == 0) - goto done; - nr_scanned += nr_scan; nr_freed = shrink_page_list(&page_list, sc); nr_reclaimed += nr_freed; @@ -1146,6 +1143,9 @@ static unsigned long shrink_inactive_lis __mod_page_state_zone(zone, pgscan_direct, nr_scan); __mod_page_state_zone(zone, pgsteal, nr_freed); + if (nr_taken == 0) + goto done; + spin_lock(&zone->lru_lock); /* * Put back any unfreeable pages. @@ -1166,8 +1166,9 @@ static unsigned long shrink_inactive_lis } } } while (nr_scanned < max_scan); - spin_unlock_irq(&zone->lru_lock); + spin_unlock(&zone->lru_lock); done: + local_irq_enable(); pagevec_release(&pvec); return nr_reclaimed; } _