diff options
author | Glauber Costa <glommer@parallels.com> | 2012-12-18 17:22:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-18 18:02:13 -0500 |
commit | 2633d7a028239a738b793be5ca8fa6ac312f5793 (patch) | |
tree | 48a9f157b2c2a8218611aaade9667cacc2e018ec /include/linux | |
parent | 6ccfb5bcf52bcf100fa085946f044fdbba015048 (diff) |
slab/slub: consider a memcg parameter in kmem_create_cache
Allow a memcg parameter to be passed during cache creation. When the slub
allocator is being used, it will only merge caches that belong to the same
memcg. We'll do this by scanning the global list, and then translating
the cache to a memcg-specific cache
Default function is created as a wrapper, passing NULL to the memcg
version. We only merge caches that belong to the same memcg.
A helper is provided, memcg_css_id: because slub needs a unique cache name
for sysfs. Since this is visible, but not the canonical location for slab
data, the cache name is not used, the css_id should suffice.
Signed-off-by: Glauber Costa <glommer@parallels.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Frederic Weisbecker <fweisbec@redhat.com>
Cc: Greg Thelen <gthelen@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: JoonSoo Kim <js1304@gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Rik van Riel <riel@redhat.com>
Cc: Suleiman Souhlal <suleiman@google.com>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/memcontrol.h | 26 | ||||
-rw-r--r-- | include/linux/slab.h | 14 |
2 files changed, 39 insertions, 1 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 87d61e840ddd..0b69a0470007 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -28,6 +28,7 @@ struct mem_cgroup; | |||
28 | struct page_cgroup; | 28 | struct page_cgroup; |
29 | struct page; | 29 | struct page; |
30 | struct mm_struct; | 30 | struct mm_struct; |
31 | struct kmem_cache; | ||
31 | 32 | ||
32 | /* Stats that can be updated by kernel. */ | 33 | /* Stats that can be updated by kernel. */ |
33 | enum mem_cgroup_page_stat_item { | 34 | enum mem_cgroup_page_stat_item { |
@@ -441,6 +442,11 @@ void __memcg_kmem_commit_charge(struct page *page, | |||
441 | struct mem_cgroup *memcg, int order); | 442 | struct mem_cgroup *memcg, int order); |
442 | void __memcg_kmem_uncharge_pages(struct page *page, int order); | 443 | void __memcg_kmem_uncharge_pages(struct page *page, int order); |
443 | 444 | ||
445 | int memcg_cache_id(struct mem_cgroup *memcg); | ||
446 | int memcg_register_cache(struct mem_cgroup *memcg, struct kmem_cache *s); | ||
447 | void memcg_release_cache(struct kmem_cache *cachep); | ||
448 | void memcg_cache_list_add(struct mem_cgroup *memcg, struct kmem_cache *cachep); | ||
449 | |||
444 | /** | 450 | /** |
445 | * memcg_kmem_newpage_charge: verify if a new kmem allocation is allowed. | 451 | * memcg_kmem_newpage_charge: verify if a new kmem allocation is allowed. |
446 | * @gfp: the gfp allocation flags. | 452 | * @gfp: the gfp allocation flags. |
@@ -525,6 +531,26 @@ static inline void | |||
525 | memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order) | 531 | memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order) |
526 | { | 532 | { |
527 | } | 533 | } |
534 | |||
535 | static inline int memcg_cache_id(struct mem_cgroup *memcg) | ||
536 | { | ||
537 | return -1; | ||
538 | } | ||
539 | |||
540 | static inline int memcg_register_cache(struct mem_cgroup *memcg, | ||
541 | struct kmem_cache *s) | ||
542 | { | ||
543 | return 0; | ||
544 | } | ||
545 | |||
546 | static inline void memcg_release_cache(struct kmem_cache *cachep) | ||
547 | { | ||
548 | } | ||
549 | |||
550 | static inline void memcg_cache_list_add(struct mem_cgroup *memcg, | ||
551 | struct kmem_cache *s) | ||
552 | { | ||
553 | } | ||
528 | #endif /* CONFIG_MEMCG_KMEM */ | 554 | #endif /* CONFIG_MEMCG_KMEM */ |
529 | #endif /* _LINUX_MEMCONTROL_H */ | 555 | #endif /* _LINUX_MEMCONTROL_H */ |
530 | 556 | ||
diff --git a/include/linux/slab.h b/include/linux/slab.h index 00efba149222..c0fcf28c15b2 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -116,6 +116,7 @@ struct kmem_cache { | |||
116 | }; | 116 | }; |
117 | #endif | 117 | #endif |
118 | 118 | ||
119 | struct mem_cgroup; | ||
119 | /* | 120 | /* |
120 | * struct kmem_cache related prototypes | 121 | * struct kmem_cache related prototypes |
121 | */ | 122 | */ |
@@ -125,6 +126,9 @@ int slab_is_available(void); | |||
125 | struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, | 126 | struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, |
126 | unsigned long, | 127 | unsigned long, |
127 | void (*)(void *)); | 128 | void (*)(void *)); |
129 | struct kmem_cache * | ||
130 | kmem_cache_create_memcg(struct mem_cgroup *, const char *, size_t, size_t, | ||
131 | unsigned long, void (*)(void *)); | ||
128 | void kmem_cache_destroy(struct kmem_cache *); | 132 | void kmem_cache_destroy(struct kmem_cache *); |
129 | int kmem_cache_shrink(struct kmem_cache *); | 133 | int kmem_cache_shrink(struct kmem_cache *); |
130 | void kmem_cache_free(struct kmem_cache *, void *); | 134 | void kmem_cache_free(struct kmem_cache *, void *); |
@@ -191,15 +195,23 @@ void kmem_cache_free(struct kmem_cache *, void *); | |||
191 | * Child caches will hold extra metadata needed for its operation. Fields are: | 195 | * Child caches will hold extra metadata needed for its operation. Fields are: |
192 | * | 196 | * |
193 | * @memcg: pointer to the memcg this cache belongs to | 197 | * @memcg: pointer to the memcg this cache belongs to |
198 | * @list: list_head for the list of all caches in this memcg | ||
199 | * @root_cache: pointer to the global, root cache, this cache was derived from | ||
194 | */ | 200 | */ |
195 | struct memcg_cache_params { | 201 | struct memcg_cache_params { |
196 | bool is_root_cache; | 202 | bool is_root_cache; |
197 | union { | 203 | union { |
198 | struct kmem_cache *memcg_caches[0]; | 204 | struct kmem_cache *memcg_caches[0]; |
199 | struct mem_cgroup *memcg; | 205 | struct { |
206 | struct mem_cgroup *memcg; | ||
207 | struct list_head list; | ||
208 | struct kmem_cache *root_cache; | ||
209 | }; | ||
200 | }; | 210 | }; |
201 | }; | 211 | }; |
202 | 212 | ||
213 | int memcg_update_all_caches(int num_memcgs); | ||
214 | |||
203 | /* | 215 | /* |
204 | * Common kmalloc functions provided by all allocators | 216 | * Common kmalloc functions provided by all allocators |
205 | */ | 217 | */ |