aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorGlauber Costa <glommer@parallels.com>2012-12-18 17:22:34 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-18 18:02:13 -0500
commit2633d7a028239a738b793be5ca8fa6ac312f5793 (patch)
tree48a9f157b2c2a8218611aaade9667cacc2e018ec /include/linux
parent6ccfb5bcf52bcf100fa085946f044fdbba015048 (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.h26
-rw-r--r--include/linux/slab.h14
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;
28struct page_cgroup; 28struct page_cgroup;
29struct page; 29struct page;
30struct mm_struct; 30struct mm_struct;
31struct kmem_cache;
31 32
32/* Stats that can be updated by kernel. */ 33/* Stats that can be updated by kernel. */
33enum mem_cgroup_page_stat_item { 34enum 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);
442void __memcg_kmem_uncharge_pages(struct page *page, int order); 443void __memcg_kmem_uncharge_pages(struct page *page, int order);
443 444
445int memcg_cache_id(struct mem_cgroup *memcg);
446int memcg_register_cache(struct mem_cgroup *memcg, struct kmem_cache *s);
447void memcg_release_cache(struct kmem_cache *cachep);
448void 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
525memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order) 531memcg_kmem_commit_charge(struct page *page, struct mem_cgroup *memcg, int order)
526{ 532{
527} 533}
534
535static inline int memcg_cache_id(struct mem_cgroup *memcg)
536{
537 return -1;
538}
539
540static inline int memcg_register_cache(struct mem_cgroup *memcg,
541 struct kmem_cache *s)
542{
543 return 0;
544}
545
546static inline void memcg_release_cache(struct kmem_cache *cachep)
547{
548}
549
550static 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
119struct 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);
125struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, 126struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
126 unsigned long, 127 unsigned long,
127 void (*)(void *)); 128 void (*)(void *));
129struct kmem_cache *
130kmem_cache_create_memcg(struct mem_cgroup *, const char *, size_t, size_t,
131 unsigned long, void (*)(void *));
128void kmem_cache_destroy(struct kmem_cache *); 132void kmem_cache_destroy(struct kmem_cache *);
129int kmem_cache_shrink(struct kmem_cache *); 133int kmem_cache_shrink(struct kmem_cache *);
130void kmem_cache_free(struct kmem_cache *, void *); 134void 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 */
195struct memcg_cache_params { 201struct 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
213int 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 */