diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-06-22 20:47:08 +0200 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-03-01 09:28:38 -0600 |
commit | 2fafc42f66d06fd0e50dbc6761e659ce0730c18d (patch) | |
tree | 00aead536bf161b543898dc366c09167c4c1bcd0 /mm | |
parent | 555c0c30ff1b96b3a438fbe0e08cdee81904e7a9 (diff) |
mm-vmstat-fix-the-irq-lock-asymetry.patch
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/vmscan.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index cb33d9cd4d65..39f9629346a1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1344,8 +1344,8 @@ static int too_many_isolated(struct zone *zone, int file, */ static noinline_for_stack void putback_lru_pages(struct zone *zone, struct scan_control *sc, - unsigned long nr_anon, unsigned long nr_file, - struct list_head *page_list) + unsigned long nr_anon, unsigned long nr_file, + struct list_head *page_list, unsigned long nr_reclaimed) { struct page *page; struct pagevec pvec; @@ -1356,7 +1356,12 @@ putback_lru_pages(struct zone *zone, struct scan_control *sc, /* * Put back any unfreeable pages. */ - spin_lock(&zone->lru_lock); + spin_lock_irq(&zone->lru_lock); + + if (current_is_kswapd()) + __count_vm_events(KSWAPD_STEAL, nr_reclaimed); + __count_zone_vm_events(PGSTEAL, zone, nr_reclaimed); + while (!list_empty(page_list)) { int lru; page = lru_to_page(page_list); @@ -1539,12 +1544,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct zone *zone, priority, &nr_dirty, &nr_writeback); } - local_irq_disable(); - if (current_is_kswapd()) - __count_vm_events(KSWAPD_STEAL, nr_reclaimed); - __count_zone_vm_events(PGSTEAL, zone, nr_reclaimed); - - putback_lru_pages(zone, sc, nr_anon, nr_file, &page_list); + putback_lru_pages(zone, sc, nr_anon, nr_file, &page_list, nr_reclaimed); /* * If reclaim is isolating dirty pages under writeback, it implies |