]> Pileus Git - ~andy/linux/blobdiff - mm/mlock.c
mm: munlock: batch NR_MLOCK zone state updates
[~andy/linux] / mm / mlock.c
index b3b4a78b7802282e94daf049f437bba5993a736c..b1a7c8007c8946f94df7cfee9fff2a00d0506e86 100644 (file)
@@ -241,6 +241,7 @@ static void __munlock_pagevec(struct pagevec *pvec, struct zone *zone)
 {
        int i;
        int nr = pagevec_count(pvec);
+       int delta_munlocked = -nr;
 
        /* Phase 1: page isolation */
        spin_lock_irq(&zone->lru_lock);
@@ -251,9 +252,6 @@ static void __munlock_pagevec(struct pagevec *pvec, struct zone *zone)
                        struct lruvec *lruvec;
                        int lru;
 
-                       /* we have disabled interrupts */
-                       __mod_zone_page_state(zone, NR_MLOCK, -1);
-
                        if (PageLRU(page)) {
                                lruvec = mem_cgroup_page_lruvec(page, zone);
                                lru = page_lru(page);
@@ -275,8 +273,10 @@ skip_munlock:
                         */
                        pvec->pages[i] = NULL;
                        put_page(page);
+                       delta_munlocked++;
                }
        }
+       __mod_zone_page_state(zone, NR_MLOCK, delta_munlocked);
        spin_unlock_irq(&zone->lru_lock);
 
        /* Phase 2: page munlock and putback */