mm: munlock: batch NR_MLOCK zone state updates
authorVlastimil Babka <vbabka@suse.cz>
Wed, 11 Sep 2013 21:22:30 +0000 (14:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Sep 2013 22:58:00 +0000 (15:58 -0700)
Depending on previous batch which introduced batched isolation in
munlock_vma_range(), we can batch also the updates of NR_MLOCK page stats.
 After the whole pagevec is processed for page isolation, the stats are
updated only once with the number of successful isolations.  There were
however no measurable perfomance gains.

Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Jörn Engel <joern@logfs.org>
Acked-by: Mel Gorman <mgorman@suse.de>
Cc: Michel Lespinasse <walken@google.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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 */