aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r--mm/slab_common.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 904a83be82de..80164599ca5d 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -165,9 +165,9 @@ static int init_memcg_params(struct kmem_cache *s,
165 if (!memcg_nr_cache_ids) 165 if (!memcg_nr_cache_ids)
166 return 0; 166 return 0;
167 167
168 arr = kzalloc(sizeof(struct memcg_cache_array) + 168 arr = kvzalloc(sizeof(struct memcg_cache_array) +
169 memcg_nr_cache_ids * sizeof(void *), 169 memcg_nr_cache_ids * sizeof(void *),
170 GFP_KERNEL); 170 GFP_KERNEL);
171 if (!arr) 171 if (!arr)
172 return -ENOMEM; 172 return -ENOMEM;
173 173
@@ -178,15 +178,23 @@ static int init_memcg_params(struct kmem_cache *s,
178static void destroy_memcg_params(struct kmem_cache *s) 178static void destroy_memcg_params(struct kmem_cache *s)
179{ 179{
180 if (is_root_cache(s)) 180 if (is_root_cache(s))
181 kfree(rcu_access_pointer(s->memcg_params.memcg_caches)); 181 kvfree(rcu_access_pointer(s->memcg_params.memcg_caches));
182}
183
184static void free_memcg_params(struct rcu_head *rcu)
185{
186 struct memcg_cache_array *old;
187
188 old = container_of(rcu, struct memcg_cache_array, rcu);
189 kvfree(old);
182} 190}
183 191
184static int update_memcg_params(struct kmem_cache *s, int new_array_size) 192static int update_memcg_params(struct kmem_cache *s, int new_array_size)
185{ 193{
186 struct memcg_cache_array *old, *new; 194 struct memcg_cache_array *old, *new;
187 195
188 new = kzalloc(sizeof(struct memcg_cache_array) + 196 new = kvzalloc(sizeof(struct memcg_cache_array) +
189 new_array_size * sizeof(void *), GFP_KERNEL); 197 new_array_size * sizeof(void *), GFP_KERNEL);
190 if (!new) 198 if (!new)
191 return -ENOMEM; 199 return -ENOMEM;
192 200
@@ -198,7 +206,7 @@ static int update_memcg_params(struct kmem_cache *s, int new_array_size)
198 206
199 rcu_assign_pointer(s->memcg_params.memcg_caches, new); 207 rcu_assign_pointer(s->memcg_params.memcg_caches, new);
200 if (old) 208 if (old)
201 kfree_rcu(old, rcu); 209 call_rcu(&old->rcu, free_memcg_params);
202 return 0; 210 return 0;
203} 211}
204 212