diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -1233,13 +1233,17 @@ static inline void kfree_hook(const void *x) | |||
1233 | kmemleak_free(x); | 1233 | kmemleak_free(x); |
1234 | } | 1234 | } |
1235 | 1235 | ||
1236 | static inline int slab_pre_alloc_hook(struct kmem_cache *s, gfp_t flags) | 1236 | static inline struct kmem_cache *slab_pre_alloc_hook(struct kmem_cache *s, |
1237 | gfp_t flags) | ||
1237 | { | 1238 | { |
1238 | flags &= gfp_allowed_mask; | 1239 | flags &= gfp_allowed_mask; |
1239 | lockdep_trace_alloc(flags); | 1240 | lockdep_trace_alloc(flags); |
1240 | might_sleep_if(flags & __GFP_WAIT); | 1241 | might_sleep_if(flags & __GFP_WAIT); |
1241 | 1242 | ||
1242 | return should_failslab(s->object_size, flags, s->flags); | 1243 | if (should_failslab(s->object_size, flags, s->flags)) |
1244 | return NULL; | ||
1245 | |||
1246 | return memcg_kmem_get_cache(s, flags); | ||
1243 | } | 1247 | } |
1244 | 1248 | ||
1245 | static inline void slab_post_alloc_hook(struct kmem_cache *s, | 1249 | static inline void slab_post_alloc_hook(struct kmem_cache *s, |
@@ -1248,6 +1252,7 @@ static inline void slab_post_alloc_hook(struct kmem_cache *s, | |||
1248 | flags &= gfp_allowed_mask; | 1252 | flags &= gfp_allowed_mask; |
1249 | kmemcheck_slab_alloc(s, flags, object, slab_ksize(s)); | 1253 | kmemcheck_slab_alloc(s, flags, object, slab_ksize(s)); |
1250 | kmemleak_alloc_recursive(object, s->object_size, 1, s->flags, flags); | 1254 | kmemleak_alloc_recursive(object, s->object_size, 1, s->flags, flags); |
1255 | memcg_kmem_put_cache(s); | ||
1251 | } | 1256 | } |
1252 | 1257 | ||
1253 | static inline void slab_free_hook(struct kmem_cache *s, void *x) | 1258 | static inline void slab_free_hook(struct kmem_cache *s, void *x) |
@@ -2384,10 +2389,9 @@ static __always_inline void *slab_alloc_node(struct kmem_cache *s, | |||
2384 | struct page *page; | 2389 | struct page *page; |
2385 | unsigned long tid; | 2390 | unsigned long tid; |
2386 | 2391 | ||
2387 | if (slab_pre_alloc_hook(s, gfpflags)) | 2392 | s = slab_pre_alloc_hook(s, gfpflags); |
2393 | if (!s) | ||
2388 | return NULL; | 2394 | return NULL; |
2389 | |||
2390 | s = memcg_kmem_get_cache(s, gfpflags); | ||
2391 | redo: | 2395 | redo: |
2392 | /* | 2396 | /* |
2393 | * Must read kmem_cache cpu data via this cpu ptr. Preemption is | 2397 | * Must read kmem_cache cpu data via this cpu ptr. Preemption is |