[PATCH] mm: shrink_inactive_lis() nr_scan accounting fix
[deliverable/linux.git] / mm / vmscan.c
index 85e95f445022a53dfc243e558f0c35dcad2fc1c7..486184d2b50c82060baec57d89eda443c1ddeddd 100644 (file)
@@ -1132,9 +1132,6 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
                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_list(unsigned long max_scan,
                        __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_list(unsigned long max_scan,
                        }
                }
        } 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;
 }
This page took 0.024373 seconds and 5 git commands to generate.