diff options
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r-- | mm/slab_common.c | 22 |
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, | |||
178 | static void destroy_memcg_params(struct kmem_cache *s) | 178 | static 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 | |||
184 | static 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 | ||
184 | static int update_memcg_params(struct kmem_cache *s, int new_array_size) | 192 | static 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 | ||