diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slab.h | 21 | ||||
-rw-r--r-- | mm/slab_common.c | 8 | ||||
-rw-r--r-- | mm/slub.c | 19 |
3 files changed, 18 insertions, 30 deletions
@@ -55,12 +55,12 @@ extern void create_boot_cache(struct kmem_cache *, const char *name, | |||
55 | struct mem_cgroup; | 55 | struct mem_cgroup; |
56 | #ifdef CONFIG_SLUB | 56 | #ifdef CONFIG_SLUB |
57 | struct kmem_cache * | 57 | struct kmem_cache * |
58 | __kmem_cache_alias(struct mem_cgroup *memcg, const char *name, size_t size, | 58 | __kmem_cache_alias(const char *name, size_t size, size_t align, |
59 | size_t align, unsigned long flags, void (*ctor)(void *)); | 59 | unsigned long flags, void (*ctor)(void *)); |
60 | #else | 60 | #else |
61 | static inline struct kmem_cache * | 61 | static inline struct kmem_cache * |
62 | __kmem_cache_alias(struct mem_cgroup *memcg, const char *name, size_t size, | 62 | __kmem_cache_alias(const char *name, size_t size, size_t align, |
63 | size_t align, unsigned long flags, void (*ctor)(void *)) | 63 | unsigned long flags, void (*ctor)(void *)) |
64 | { return NULL; } | 64 | { return NULL; } |
65 | #endif | 65 | #endif |
66 | 66 | ||
@@ -119,13 +119,6 @@ static inline bool is_root_cache(struct kmem_cache *s) | |||
119 | return !s->memcg_params || s->memcg_params->is_root_cache; | 119 | return !s->memcg_params || s->memcg_params->is_root_cache; |
120 | } | 120 | } |
121 | 121 | ||
122 | static inline bool cache_match_memcg(struct kmem_cache *cachep, | ||
123 | struct mem_cgroup *memcg) | ||
124 | { | ||
125 | return (is_root_cache(cachep) && !memcg) || | ||
126 | (cachep->memcg_params->memcg == memcg); | ||
127 | } | ||
128 | |||
129 | static inline void memcg_bind_pages(struct kmem_cache *s, int order) | 122 | static inline void memcg_bind_pages(struct kmem_cache *s, int order) |
130 | { | 123 | { |
131 | if (!is_root_cache(s)) | 124 | if (!is_root_cache(s)) |
@@ -204,12 +197,6 @@ static inline bool is_root_cache(struct kmem_cache *s) | |||
204 | return true; | 197 | return true; |
205 | } | 198 | } |
206 | 199 | ||
207 | static inline bool cache_match_memcg(struct kmem_cache *cachep, | ||
208 | struct mem_cgroup *memcg) | ||
209 | { | ||
210 | return true; | ||
211 | } | ||
212 | |||
213 | static inline void memcg_bind_pages(struct kmem_cache *s, int order) | 200 | static inline void memcg_bind_pages(struct kmem_cache *s, int order) |
214 | { | 201 | { |
215 | } | 202 | } |
diff --git a/mm/slab_common.c b/mm/slab_common.c index 1ec3c619ba04..e77b51eb7347 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
@@ -200,9 +200,11 @@ kmem_cache_create_memcg(struct mem_cgroup *memcg, const char *name, size_t size, | |||
200 | */ | 200 | */ |
201 | flags &= CACHE_CREATE_MASK; | 201 | flags &= CACHE_CREATE_MASK; |
202 | 202 | ||
203 | s = __kmem_cache_alias(memcg, name, size, align, flags, ctor); | 203 | if (!memcg) { |
204 | if (s) | 204 | s = __kmem_cache_alias(name, size, align, flags, ctor); |
205 | goto out_unlock; | 205 | if (s) |
206 | goto out_unlock; | ||
207 | } | ||
206 | 208 | ||
207 | err = -ENOMEM; | 209 | err = -ENOMEM; |
208 | s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL); | 210 | s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL); |
@@ -3685,6 +3685,9 @@ static int slab_unmergeable(struct kmem_cache *s) | |||
3685 | if (slub_nomerge || (s->flags & SLUB_NEVER_MERGE)) | 3685 | if (slub_nomerge || (s->flags & SLUB_NEVER_MERGE)) |
3686 | return 1; | 3686 | return 1; |
3687 | 3687 | ||
3688 | if (!is_root_cache(s)) | ||
3689 | return 1; | ||
3690 | |||
3688 | if (s->ctor) | 3691 | if (s->ctor) |
3689 | return 1; | 3692 | return 1; |
3690 | 3693 | ||
@@ -3697,9 +3700,8 @@ static int slab_unmergeable(struct kmem_cache *s) | |||
3697 | return 0; | 3700 | return 0; |
3698 | } | 3701 | } |
3699 | 3702 | ||
3700 | static struct kmem_cache *find_mergeable(struct mem_cgroup *memcg, size_t size, | 3703 | static struct kmem_cache *find_mergeable(size_t size, size_t align, |
3701 | size_t align, unsigned long flags, const char *name, | 3704 | unsigned long flags, const char *name, void (*ctor)(void *)) |
3702 | void (*ctor)(void *)) | ||
3703 | { | 3705 | { |
3704 | struct kmem_cache *s; | 3706 | struct kmem_cache *s; |
3705 | 3707 | ||
@@ -3722,7 +3724,7 @@ static struct kmem_cache *find_mergeable(struct mem_cgroup *memcg, size_t size, | |||
3722 | continue; | 3724 | continue; |
3723 | 3725 | ||
3724 | if ((flags & SLUB_MERGE_SAME) != (s->flags & SLUB_MERGE_SAME)) | 3726 | if ((flags & SLUB_MERGE_SAME) != (s->flags & SLUB_MERGE_SAME)) |
3725 | continue; | 3727 | continue; |
3726 | /* | 3728 | /* |
3727 | * Check if alignment is compatible. | 3729 | * Check if alignment is compatible. |
3728 | * Courtesy of Adrian Drzewiecki | 3730 | * Courtesy of Adrian Drzewiecki |
@@ -3733,21 +3735,18 @@ static struct kmem_cache *find_mergeable(struct mem_cgroup *memcg, size_t size, | |||
3733 | if (s->size - size >= sizeof(void *)) | 3735 | if (s->size - size >= sizeof(void *)) |
3734 | continue; | 3736 | continue; |
3735 | 3737 | ||
3736 | if (!cache_match_memcg(s, memcg)) | ||
3737 | continue; | ||
3738 | |||
3739 | return s; | 3738 | return s; |
3740 | } | 3739 | } |
3741 | return NULL; | 3740 | return NULL; |
3742 | } | 3741 | } |
3743 | 3742 | ||
3744 | struct kmem_cache * | 3743 | struct kmem_cache * |
3745 | __kmem_cache_alias(struct mem_cgroup *memcg, const char *name, size_t size, | 3744 | __kmem_cache_alias(const char *name, size_t size, size_t align, |
3746 | size_t align, unsigned long flags, void (*ctor)(void *)) | 3745 | unsigned long flags, void (*ctor)(void *)) |
3747 | { | 3746 | { |
3748 | struct kmem_cache *s; | 3747 | struct kmem_cache *s; |
3749 | 3748 | ||
3750 | s = find_mergeable(memcg, size, align, flags, name, ctor); | 3749 | s = find_mergeable(size, align, flags, name, ctor); |
3751 | if (s) { | 3750 | if (s) { |
3752 | s->refcount++; | 3751 | s->refcount++; |
3753 | /* | 3752 | /* |