mm: memcontrol: rewrite uncharge API
[firefly-linux-kernel-4.4.55.git] / mm / swap.c
index 3baca701bb78a8c6eb9c3c0b5d2e794834f94497..00523fffa5ed9ecbb5d627ceaef77e4621176803 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -62,6 +62,7 @@ static void __page_cache_release(struct page *page)
                del_page_from_lru_list(page, lruvec, page_off_lru(page));
                spin_unlock_irqrestore(&zone->lru_lock, flags);
        }
+       mem_cgroup_uncharge(page);
 }
 
 static void __put_single_page(struct page *page)
@@ -907,6 +908,8 @@ void release_pages(struct page **pages, int nr, bool cold)
        struct lruvec *lruvec;
        unsigned long uninitialized_var(flags);
 
+       mem_cgroup_uncharge_start();
+
        for (i = 0; i < nr; i++) {
                struct page *page = pages[i];
 
@@ -938,6 +941,7 @@ void release_pages(struct page **pages, int nr, bool cold)
                        __ClearPageLRU(page);
                        del_page_from_lru_list(page, lruvec, page_off_lru(page));
                }
+               mem_cgroup_uncharge(page);
 
                /* Clear Active bit in case of parallel mark_page_accessed */
                __ClearPageActive(page);
@@ -947,6 +951,8 @@ void release_pages(struct page **pages, int nr, bool cold)
        if (zone)
                spin_unlock_irqrestore(&zone->lru_lock, flags);
 
+       mem_cgroup_uncharge_end();
+
        free_hot_cold_page_list(&pages_to_free, cold);
 }
 EXPORT_SYMBOL(release_pages);