diff options
author | Vladimir Davydov <vdavydov@parallels.com> | 2014-06-04 19:08:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-04 19:54:06 -0400 |
commit | 073ee1c6cd11cd190f4d0da84d9b4ba79d7b9e70 (patch) | |
tree | b15246321eb6b1e4faea04a46f6ea998d608044e | |
parent | b5ffc8560cf758422e85b786cca32cd7e1513a7f (diff) |
memcg: get rid of memcg_create_cache_name
Instead of calling back to memcontrol.c from kmem_cache_create_memcg in
order to just create the name of a per memcg cache, let's allocate it in
place. We only need to pass the memcg name to kmem_cache_create_memcg for
that - everything else can be done in slab_common.c.
Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/linux/memcontrol.h | 2 | ||||
-rw-r--r-- | include/linux/slab.h | 3 | ||||
-rw-r--r-- | mm/memcontrol.c | 33 | ||||
-rw-r--r-- | mm/slab_common.c | 7 |
4 files changed, 16 insertions, 29 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1fa23244fe37..dfc2929a3877 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -492,8 +492,6 @@ void __memcg_kmem_uncharge_pages(struct page *page, int order); | |||
492 | 492 | ||
493 | int memcg_cache_id(struct mem_cgroup *memcg); | 493 | int memcg_cache_id(struct mem_cgroup *memcg); |
494 | 494 | ||
495 | char *memcg_create_cache_name(struct mem_cgroup *memcg, | ||
496 | struct kmem_cache *root_cache); | ||
497 | int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s, | 495 | int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s, |
498 | struct kmem_cache *root_cache); | 496 | struct kmem_cache *root_cache); |
499 | void memcg_free_cache_params(struct kmem_cache *s); | 497 | void memcg_free_cache_params(struct kmem_cache *s); |
diff --git a/include/linux/slab.h b/include/linux/slab.h index ecbec9ccb80d..86e5b26fbdab 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -117,7 +117,8 @@ struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, | |||
117 | void (*)(void *)); | 117 | void (*)(void *)); |
118 | #ifdef CONFIG_MEMCG_KMEM | 118 | #ifdef CONFIG_MEMCG_KMEM |
119 | struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *, | 119 | struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *, |
120 | struct kmem_cache *); | 120 | struct kmem_cache *, |
121 | const char *); | ||
121 | #endif | 122 | #endif |
122 | void kmem_cache_destroy(struct kmem_cache *); | 123 | void kmem_cache_destroy(struct kmem_cache *); |
123 | int kmem_cache_shrink(struct kmem_cache *); | 124 | int kmem_cache_shrink(struct kmem_cache *); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 971d7b643f6e..7df7f599e3df 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3095,29 +3095,6 @@ int memcg_update_cache_size(struct kmem_cache *s, int num_groups) | |||
3095 | return 0; | 3095 | return 0; |
3096 | } | 3096 | } |
3097 | 3097 | ||
3098 | char *memcg_create_cache_name(struct mem_cgroup *memcg, | ||
3099 | struct kmem_cache *root_cache) | ||
3100 | { | ||
3101 | static char *buf; | ||
3102 | |||
3103 | /* | ||
3104 | * We need a mutex here to protect the shared buffer. Since this is | ||
3105 | * expected to be called only on cache creation, we can employ the | ||
3106 | * slab_mutex for that purpose. | ||
3107 | */ | ||
3108 | lockdep_assert_held(&slab_mutex); | ||
3109 | |||
3110 | if (!buf) { | ||
3111 | buf = kmalloc(NAME_MAX + 1, GFP_KERNEL); | ||
3112 | if (!buf) | ||
3113 | return NULL; | ||
3114 | } | ||
3115 | |||
3116 | cgroup_name(memcg->css.cgroup, buf, NAME_MAX + 1); | ||
3117 | return kasprintf(GFP_KERNEL, "%s(%d:%s)", root_cache->name, | ||
3118 | memcg_cache_id(memcg), buf); | ||
3119 | } | ||
3120 | |||
3121 | int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s, | 3098 | int memcg_alloc_cache_params(struct mem_cgroup *memcg, struct kmem_cache *s, |
3122 | struct kmem_cache *root_cache) | 3099 | struct kmem_cache *root_cache) |
3123 | { | 3100 | { |
@@ -3158,6 +3135,7 @@ void memcg_free_cache_params(struct kmem_cache *s) | |||
3158 | static void memcg_kmem_create_cache(struct mem_cgroup *memcg, | 3135 | static void memcg_kmem_create_cache(struct mem_cgroup *memcg, |
3159 | struct kmem_cache *root_cache) | 3136 | struct kmem_cache *root_cache) |
3160 | { | 3137 | { |
3138 | static char *memcg_name_buf; /* protected by memcg_slab_mutex */ | ||
3161 | struct kmem_cache *cachep; | 3139 | struct kmem_cache *cachep; |
3162 | int id; | 3140 | int id; |
3163 | 3141 | ||
@@ -3173,7 +3151,14 @@ static void memcg_kmem_create_cache(struct mem_cgroup *memcg, | |||
3173 | if (cache_from_memcg_idx(root_cache, id)) | 3151 | if (cache_from_memcg_idx(root_cache, id)) |
3174 | return; | 3152 | return; |
3175 | 3153 | ||
3176 | cachep = kmem_cache_create_memcg(memcg, root_cache); | 3154 | if (!memcg_name_buf) { |
3155 | memcg_name_buf = kmalloc(NAME_MAX + 1, GFP_KERNEL); | ||
3156 | if (!memcg_name_buf) | ||
3157 | return; | ||
3158 | } | ||
3159 | |||
3160 | cgroup_name(memcg->css.cgroup, memcg_name_buf, NAME_MAX + 1); | ||
3161 | cachep = kmem_cache_create_memcg(memcg, root_cache, memcg_name_buf); | ||
3177 | /* | 3162 | /* |
3178 | * If we could not create a memcg cache, do not complain, because | 3163 | * If we could not create a memcg cache, do not complain, because |
3179 | * that's not critical at all as we can always proceed with the root | 3164 | * that's not critical at all as we can always proceed with the root |
diff --git a/mm/slab_common.c b/mm/slab_common.c index 7e348cff814d..32175617cb75 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
@@ -264,13 +264,15 @@ EXPORT_SYMBOL(kmem_cache_create); | |||
264 | * kmem_cache_create_memcg - Create a cache for a memory cgroup. | 264 | * kmem_cache_create_memcg - Create a cache for a memory cgroup. |
265 | * @memcg: The memory cgroup the new cache is for. | 265 | * @memcg: The memory cgroup the new cache is for. |
266 | * @root_cache: The parent of the new cache. | 266 | * @root_cache: The parent of the new cache. |
267 | * @memcg_name: The name of the memory cgroup (used for naming the new cache). | ||
267 | * | 268 | * |
268 | * This function attempts to create a kmem cache that will serve allocation | 269 | * This function attempts to create a kmem cache that will serve allocation |
269 | * requests going from @memcg to @root_cache. The new cache inherits properties | 270 | * requests going from @memcg to @root_cache. The new cache inherits properties |
270 | * from its parent. | 271 | * from its parent. |
271 | */ | 272 | */ |
272 | struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *memcg, | 273 | struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *memcg, |
273 | struct kmem_cache *root_cache) | 274 | struct kmem_cache *root_cache, |
275 | const char *memcg_name) | ||
274 | { | 276 | { |
275 | struct kmem_cache *s = NULL; | 277 | struct kmem_cache *s = NULL; |
276 | char *cache_name; | 278 | char *cache_name; |
@@ -280,7 +282,8 @@ struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *memcg, | |||
280 | 282 | ||
281 | mutex_lock(&slab_mutex); | 283 | mutex_lock(&slab_mutex); |
282 | 284 | ||
283 | cache_name = memcg_create_cache_name(memcg, root_cache); | 285 | cache_name = kasprintf(GFP_KERNEL, "%s(%d:%s)", root_cache->name, |
286 | memcg_cache_id(memcg), memcg_name); | ||
284 | if (!cache_name) | 287 | if (!cache_name) |
285 | goto out_unlock; | 288 | goto out_unlock; |
286 | 289 | ||