From e4e9568d5739057f45d7f874f90fefe26b5b3a6b Mon Sep 17 00:00:00 2001 From: Glauber Costa Date: Tue, 18 Dec 2012 14:22:48 -0800 Subject: [PATCH] --- yaml --- r: 347023 b: refs/heads/master c: d79923fad95b0cdf7770e024677180c734cb7148 h: refs/heads/master i: 347021: 3c8508a44437a6a70448cb09be1c355d1078c352 347019: 23b239e43cd834444483603437b9ce8c1fd6eaa8 347015: 293e302ccdf7d941ad7773f377bb263b9d65b550 347007: d8abd798b26a9c7bc5c27b90c0b544e01c0250f9 v: v3 --- [refs] | 2 +- trunk/include/linux/slub_def.h | 5 ++++- trunk/mm/memcontrol.c | 3 +++ trunk/mm/slab.c | 6 +++++- trunk/mm/slub.c | 7 ++++--- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index cb1e88ba1307..d84d6e7b35d2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b9ce5ef49f00daf2254c6953c8d31f79aabccd34 +refs/heads/master: d79923fad95b0cdf7770e024677180c734cb7148 diff --git a/trunk/include/linux/slub_def.h b/trunk/include/linux/slub_def.h index 961e72eab907..364ba6c9fe21 100644 --- a/trunk/include/linux/slub_def.h +++ b/trunk/include/linux/slub_def.h @@ -225,7 +225,10 @@ void *__kmalloc(size_t size, gfp_t flags); static __always_inline void * kmalloc_order(size_t size, gfp_t flags, unsigned int order) { - void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order); + void *ret; + + flags |= (__GFP_COMP | __GFP_KMEMCG); + ret = (void *) __get_free_pages(flags, order); kmemleak_alloc(ret, size, 1, flags); return ret; } diff --git a/trunk/mm/memcontrol.c b/trunk/mm/memcontrol.c index 65302a083d2f..cc13797d0fbc 100644 --- a/trunk/mm/memcontrol.c +++ b/trunk/mm/memcontrol.c @@ -3086,6 +3086,9 @@ static struct kmem_cache *kmem_cache_dup(struct mem_cgroup *memcg, new = kmem_cache_create_memcg(memcg, name, s->object_size, s->align, (s->flags & ~SLAB_PANIC), s->ctor); + if (new) + new->allocflags |= __GFP_KMEMCG; + kfree(name); return new; } diff --git a/trunk/mm/slab.c b/trunk/mm/slab.c index bab6fec765a7..e265865e8700 100644 --- a/trunk/mm/slab.c +++ b/trunk/mm/slab.c @@ -1933,7 +1933,7 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr) } if (current->reclaim_state) current->reclaim_state->reclaimed_slab += nr_freed; - free_pages((unsigned long)addr, cachep->gfporder); + free_memcg_kmem_pages((unsigned long)addr, cachep->gfporder); } static void kmem_rcu_free(struct rcu_head *head) @@ -3486,6 +3486,8 @@ slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid, if (slab_should_failslab(cachep, flags)) return NULL; + cachep = memcg_kmem_get_cache(cachep, flags); + cache_alloc_debugcheck_before(cachep, flags); local_irq_save(save_flags); @@ -3571,6 +3573,8 @@ slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller) if (slab_should_failslab(cachep, flags)) return NULL; + cachep = memcg_kmem_get_cache(cachep, flags); + cache_alloc_debugcheck_before(cachep, flags); local_irq_save(save_flags); objp = __do_cache_alloc(cachep, flags); diff --git a/trunk/mm/slub.c b/trunk/mm/slub.c index 6d5f2305d7a4..ef39e872b8eb 100644 --- a/trunk/mm/slub.c +++ b/trunk/mm/slub.c @@ -1405,7 +1405,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page) reset_page_mapcount(page); if (current->reclaim_state) current->reclaim_state->reclaimed_slab += pages; - __free_pages(page, order); + __free_memcg_kmem_pages(page, order); } #define need_reserve_slab_rcu \ @@ -2323,6 +2323,7 @@ static __always_inline void *slab_alloc_node(struct kmem_cache *s, if (slab_pre_alloc_hook(s, gfpflags)) return NULL; + s = memcg_kmem_get_cache(s, gfpflags); redo: /* @@ -3284,7 +3285,7 @@ static void *kmalloc_large_node(size_t size, gfp_t flags, int node) struct page *page; void *ptr = NULL; - flags |= __GFP_COMP | __GFP_NOTRACK; + flags |= __GFP_COMP | __GFP_NOTRACK | __GFP_KMEMCG; page = alloc_pages_node(node, flags, get_order(size)); if (page) ptr = page_address(page); @@ -3390,7 +3391,7 @@ void kfree(const void *x) if (unlikely(!PageSlab(page))) { BUG_ON(!PageCompound(page)); kmemleak_free(x); - __free_pages(page, compound_order(page)); + __free_memcg_kmem_pages(page, compound_order(page)); return; } slab_free(page->slab_cache, page, object, _RET_IP_);