memcg: unify slab and other kmem pages charging
[linux-2.6-block.git] / mm / slab.c
index 461935bab9efd8c10f8f0f3bfaf071d1c9c60bdb..272e809404d507e19edd74842811ada8fcf600a2 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1593,16 +1593,17 @@ static struct page *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
        if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
                flags |= __GFP_RECLAIMABLE;
 
-       if (memcg_charge_slab(cachep, flags, cachep->gfporder))
-               return NULL;
-
        page = __alloc_pages_node(nodeid, flags | __GFP_NOTRACK, cachep->gfporder);
        if (!page) {
-               memcg_uncharge_slab(cachep, cachep->gfporder);
                slab_out_of_memory(cachep, flags, nodeid);
                return NULL;
        }
 
+       if (memcg_charge_slab(page, flags, cachep->gfporder, cachep)) {
+               __free_pages(page, cachep->gfporder);
+               return NULL;
+       }
+
        /* Record if ALLOC_NO_WATERMARKS was set when allocating the slab */
        if (page_is_pfmemalloc(page))
                pfmemalloc_active = true;
@@ -1654,8 +1655,7 @@ static void kmem_freepages(struct kmem_cache *cachep, struct page *page)
 
        if (current->reclaim_state)
                current->reclaim_state->reclaimed_slab += nr_freed;
-       __free_pages(page, cachep->gfporder);
-       memcg_uncharge_slab(cachep, cachep->gfporder);
+       __free_kmem_pages(page, cachep->gfporder);
 }
 
 static void kmem_rcu_free(struct rcu_head *head)