Blame view

mm/slab_common.c 44.6 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
2
3
4
5
6
7
8
9
10
11
12
  /*
   * Slab allocator functions that are independent of the allocator strategy
   *
   * (C) 2012 Christoph Lameter <cl@linux.com>
   */
  #include <linux/slab.h>
  
  #include <linux/mm.h>
  #include <linux/poison.h>
  #include <linux/interrupt.h>
  #include <linux/memory.h>
1c99ba291   Alexey Dobriyan   mm/slab_common.c:...
13
  #include <linux/cache.h>
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
14
15
  #include <linux/compiler.h>
  #include <linux/module.h>
20cea9683   Christoph Lameter   mm, sl[aou]b: Mov...
16
17
  #include <linux/cpu.h>
  #include <linux/uaccess.h>
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
18
19
  #include <linux/seq_file.h>
  #include <linux/proc_fs.h>
fcf8a1e48   Waiman Long   mm, memcg: add a ...
20
  #include <linux/debugfs.h>
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
21
22
23
  #include <asm/cacheflush.h>
  #include <asm/tlbflush.h>
  #include <asm/page.h>
2633d7a02   Glauber Costa   slab/slub: consid...
24
  #include <linux/memcontrol.h>
928cec9cd   Andrey Ryabinin   mm: move slab rel...
25
26
  
  #define CREATE_TRACE_POINTS
f1b6eb6e6   Christoph Lameter   mm/sl[aou]b: Move...
27
  #include <trace/events/kmem.h>
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
28

97d066091   Christoph Lameter   mm, sl[aou]b: Com...
29
30
31
  #include "slab.h"
  
  enum slab_state slab_state;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
32
33
  LIST_HEAD(slab_caches);
  DEFINE_MUTEX(slab_mutex);
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
34
  struct kmem_cache *kmem_cache;
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
35

2d891fbc3   Kees Cook   usercopy: Allow s...
36
37
38
39
40
41
42
  #ifdef CONFIG_HARDENED_USERCOPY
  bool usercopy_fallback __ro_after_init =
  		IS_ENABLED(CONFIG_HARDENED_USERCOPY_FALLBACK);
  module_param(usercopy_fallback, bool, 0400);
  MODULE_PARM_DESC(usercopy_fallback,
  		"WARN instead of reject usercopy whitelist violations");
  #endif
657dc2f97   Tejun Heo   slab: remove sync...
43
44
45
46
  static LIST_HEAD(slab_caches_to_rcu_destroy);
  static void slab_caches_to_rcu_destroy_workfn(struct work_struct *work);
  static DECLARE_WORK(slab_caches_to_rcu_destroy_work,
  		    slab_caches_to_rcu_destroy_workfn);
07f361b2b   Joonsoo Kim   mm/slab_common: m...
47
  /*
423c929cb   Joonsoo Kim   mm/slab_common: c...
48
49
50
   * Set of flags that will prevent slab merging
   */
  #define SLAB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
51
  		SLAB_TRACE | SLAB_TYPESAFE_BY_RCU | SLAB_NOLEAKTRACE | \
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
52
  		SLAB_FAILSLAB | SLAB_KASAN)
423c929cb   Joonsoo Kim   mm/slab_common: c...
53

230e9fc28   Vladimir Davydov   slab: add SLAB_AC...
54
  #define SLAB_MERGE_SAME (SLAB_RECLAIM_ACCOUNT | SLAB_CACHE_DMA | \
6d6ea1e96   Nicolas Boichat   mm: add support f...
55
  			 SLAB_CACHE_DMA32 | SLAB_ACCOUNT)
423c929cb   Joonsoo Kim   mm/slab_common: c...
56
57
58
  
  /*
   * Merge control. If this is set then no merging of slab caches will occur.
423c929cb   Joonsoo Kim   mm/slab_common: c...
59
   */
7660a6fdd   Kees Cook   mm: allow slab_no...
60
  static bool slab_nomerge = !IS_ENABLED(CONFIG_SLAB_MERGE_DEFAULT);
423c929cb   Joonsoo Kim   mm/slab_common: c...
61
62
63
  
  static int __init setup_slab_nomerge(char *str)
  {
7660a6fdd   Kees Cook   mm: allow slab_no...
64
  	slab_nomerge = true;
423c929cb   Joonsoo Kim   mm/slab_common: c...
65
66
67
68
69
70
71
72
73
74
  	return 1;
  }
  
  #ifdef CONFIG_SLUB
  __setup_param("slub_nomerge", slub_nomerge, setup_slab_nomerge, 0);
  #endif
  
  __setup("slab_nomerge", setup_slab_nomerge);
  
  /*
07f361b2b   Joonsoo Kim   mm/slab_common: m...
75
76
77
78
79
80
81
   * Determine the size of a slab object
   */
  unsigned int kmem_cache_size(struct kmem_cache *s)
  {
  	return s->object_size;
  }
  EXPORT_SYMBOL(kmem_cache_size);
77be4b136   Shuah Khan   mm/slab: restruct...
82
  #ifdef CONFIG_DEBUG_VM
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
83
  static int kmem_cache_sanity_check(const char *name, unsigned int size)
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
84
  {
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
85
86
  	if (!name || in_interrupt() || size < sizeof(void *) ||
  		size > KMALLOC_MAX_SIZE) {
77be4b136   Shuah Khan   mm/slab: restruct...
87
88
89
  		pr_err("kmem_cache_create(%s) integrity check failed
  ", name);
  		return -EINVAL;
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
90
  	}
b920536aa   Pekka Enberg   Revert "mm/slab_c...
91

20cea9683   Christoph Lameter   mm, sl[aou]b: Mov...
92
  	WARN_ON(strchr(name, ' '));	/* It confuses parsers */
77be4b136   Shuah Khan   mm/slab: restruct...
93
94
95
  	return 0;
  }
  #else
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
96
  static inline int kmem_cache_sanity_check(const char *name, unsigned int size)
77be4b136   Shuah Khan   mm/slab: restruct...
97
98
99
  {
  	return 0;
  }
20cea9683   Christoph Lameter   mm, sl[aou]b: Mov...
100
  #endif
484748f0b   Christoph Lameter   slab: infrastruct...
101
102
103
  void __kmem_cache_free_bulk(struct kmem_cache *s, size_t nr, void **p)
  {
  	size_t i;
ca2571955   Jesper Dangaard Brouer   mm: new API kfree...
104
105
106
107
108
109
  	for (i = 0; i < nr; i++) {
  		if (s)
  			kmem_cache_free(s, p[i]);
  		else
  			kfree(p[i]);
  	}
484748f0b   Christoph Lameter   slab: infrastruct...
110
  }
865762a81   Jesper Dangaard Brouer   slab/slub: adjust...
111
  int __kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t nr,
484748f0b   Christoph Lameter   slab: infrastruct...
112
113
114
115
116
117
118
119
  								void **p)
  {
  	size_t i;
  
  	for (i = 0; i < nr; i++) {
  		void *x = p[i] = kmem_cache_alloc(s, flags);
  		if (!x) {
  			__kmem_cache_free_bulk(s, i, p);
865762a81   Jesper Dangaard Brouer   slab/slub: adjust...
120
  			return 0;
484748f0b   Christoph Lameter   slab: infrastruct...
121
122
  		}
  	}
865762a81   Jesper Dangaard Brouer   slab/slub: adjust...
123
  	return i;
484748f0b   Christoph Lameter   slab: infrastruct...
124
  }
84c07d11a   Kirill Tkhai   mm: introduce CON...
125
  #ifdef CONFIG_MEMCG_KMEM
510ded33e   Tejun Heo   slab: implement s...
126
127
  
  LIST_HEAD(slab_root_caches);
63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
128
  static DEFINE_SPINLOCK(memcg_kmem_wq_lock);
510ded33e   Tejun Heo   slab: implement s...
129

f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
130
  static void kmemcg_cache_shutdown(struct percpu_ref *percpu_ref);
f7ce3190c   Vladimir Davydov   slab: embed memcg...
131
  void slab_init_memcg_params(struct kmem_cache *s)
33a690c45   Vladimir Davydov   memcg: move memcg...
132
  {
9eeadc8b6   Tejun Heo   slab: reorganize ...
133
  	s->memcg_params.root_cache = NULL;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
134
  	RCU_INIT_POINTER(s->memcg_params.memcg_caches, NULL);
9eeadc8b6   Tejun Heo   slab: reorganize ...
135
  	INIT_LIST_HEAD(&s->memcg_params.children);
92ee383f6   Shakeel Butt   mm: fix race betw...
136
  	s->memcg_params.dying = false;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
137
138
139
  }
  
  static int init_memcg_params(struct kmem_cache *s,
c03914b7a   Roman Gushchin   mm: memcg/slab: p...
140
  			     struct kmem_cache *root_cache)
f7ce3190c   Vladimir Davydov   slab: embed memcg...
141
142
  {
  	struct memcg_cache_array *arr;
33a690c45   Vladimir Davydov   memcg: move memcg...
143

9eeadc8b6   Tejun Heo   slab: reorganize ...
144
  	if (root_cache) {
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
145
146
147
148
149
  		int ret = percpu_ref_init(&s->memcg_params.refcnt,
  					  kmemcg_cache_shutdown,
  					  0, GFP_KERNEL);
  		if (ret)
  			return ret;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
150
  		s->memcg_params.root_cache = root_cache;
9eeadc8b6   Tejun Heo   slab: reorganize ...
151
  		INIT_LIST_HEAD(&s->memcg_params.children_node);
bc2791f85   Tejun Heo   slab: link memcg ...
152
  		INIT_LIST_HEAD(&s->memcg_params.kmem_caches_node);
33a690c45   Vladimir Davydov   memcg: move memcg...
153
  		return 0;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
154
  	}
33a690c45   Vladimir Davydov   memcg: move memcg...
155

f7ce3190c   Vladimir Davydov   slab: embed memcg...
156
  	slab_init_memcg_params(s);
33a690c45   Vladimir Davydov   memcg: move memcg...
157

f7ce3190c   Vladimir Davydov   slab: embed memcg...
158
159
  	if (!memcg_nr_cache_ids)
  		return 0;
33a690c45   Vladimir Davydov   memcg: move memcg...
160

f80c7dab9   Johannes Weiner   mm: memcontrol: u...
161
162
163
  	arr = kvzalloc(sizeof(struct memcg_cache_array) +
  		       memcg_nr_cache_ids * sizeof(void *),
  		       GFP_KERNEL);
f7ce3190c   Vladimir Davydov   slab: embed memcg...
164
165
  	if (!arr)
  		return -ENOMEM;
33a690c45   Vladimir Davydov   memcg: move memcg...
166

f7ce3190c   Vladimir Davydov   slab: embed memcg...
167
  	RCU_INIT_POINTER(s->memcg_params.memcg_caches, arr);
33a690c45   Vladimir Davydov   memcg: move memcg...
168
169
  	return 0;
  }
f7ce3190c   Vladimir Davydov   slab: embed memcg...
170
  static void destroy_memcg_params(struct kmem_cache *s)
33a690c45   Vladimir Davydov   memcg: move memcg...
171
  {
b749ecfaf   Roman Gushchin   mm: memcg/slab: f...
172
  	if (is_root_cache(s)) {
f80c7dab9   Johannes Weiner   mm: memcontrol: u...
173
  		kvfree(rcu_access_pointer(s->memcg_params.memcg_caches));
b749ecfaf   Roman Gushchin   mm: memcg/slab: f...
174
175
176
  	} else {
  		mem_cgroup_put(s->memcg_params.memcg);
  		WRITE_ONCE(s->memcg_params.memcg, NULL);
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
177
  		percpu_ref_exit(&s->memcg_params.refcnt);
b749ecfaf   Roman Gushchin   mm: memcg/slab: f...
178
  	}
f80c7dab9   Johannes Weiner   mm: memcontrol: u...
179
180
181
182
183
184
185
186
  }
  
  static void free_memcg_params(struct rcu_head *rcu)
  {
  	struct memcg_cache_array *old;
  
  	old = container_of(rcu, struct memcg_cache_array, rcu);
  	kvfree(old);
33a690c45   Vladimir Davydov   memcg: move memcg...
187
  }
f7ce3190c   Vladimir Davydov   slab: embed memcg...
188
  static int update_memcg_params(struct kmem_cache *s, int new_array_size)
6f817f4cd   Vladimir Davydov   memcg: move memcg...
189
  {
f7ce3190c   Vladimir Davydov   slab: embed memcg...
190
  	struct memcg_cache_array *old, *new;
6f817f4cd   Vladimir Davydov   memcg: move memcg...
191

f80c7dab9   Johannes Weiner   mm: memcontrol: u...
192
193
  	new = kvzalloc(sizeof(struct memcg_cache_array) +
  		       new_array_size * sizeof(void *), GFP_KERNEL);
f7ce3190c   Vladimir Davydov   slab: embed memcg...
194
  	if (!new)
6f817f4cd   Vladimir Davydov   memcg: move memcg...
195
  		return -ENOMEM;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
196
197
198
199
200
  	old = rcu_dereference_protected(s->memcg_params.memcg_caches,
  					lockdep_is_held(&slab_mutex));
  	if (old)
  		memcpy(new->entries, old->entries,
  		       memcg_nr_cache_ids * sizeof(void *));
6f817f4cd   Vladimir Davydov   memcg: move memcg...
201

f7ce3190c   Vladimir Davydov   slab: embed memcg...
202
203
  	rcu_assign_pointer(s->memcg_params.memcg_caches, new);
  	if (old)
f80c7dab9   Johannes Weiner   mm: memcontrol: u...
204
  		call_rcu(&old->rcu, free_memcg_params);
6f817f4cd   Vladimir Davydov   memcg: move memcg...
205
206
  	return 0;
  }
55007d849   Glauber Costa   memcg: allocate m...
207
208
209
210
  int memcg_update_all_caches(int num_memcgs)
  {
  	struct kmem_cache *s;
  	int ret = 0;
55007d849   Glauber Costa   memcg: allocate m...
211

05257a1a3   Vladimir Davydov   memcg: add rwsem ...
212
  	mutex_lock(&slab_mutex);
510ded33e   Tejun Heo   slab: implement s...
213
  	list_for_each_entry(s, &slab_root_caches, root_caches_node) {
f7ce3190c   Vladimir Davydov   slab: embed memcg...
214
  		ret = update_memcg_params(s, num_memcgs);
55007d849   Glauber Costa   memcg: allocate m...
215
  		/*
55007d849   Glauber Costa   memcg: allocate m...
216
217
218
219
  		 * Instead of freeing the memory, we'll just leave the caches
  		 * up to this point in an updated state.
  		 */
  		if (ret)
05257a1a3   Vladimir Davydov   memcg: add rwsem ...
220
  			break;
55007d849   Glauber Costa   memcg: allocate m...
221
  	}
55007d849   Glauber Costa   memcg: allocate m...
222
223
224
  	mutex_unlock(&slab_mutex);
  	return ret;
  }
657dc2f97   Tejun Heo   slab: remove sync...
225

c03914b7a   Roman Gushchin   mm: memcg/slab: p...
226
  void memcg_link_cache(struct kmem_cache *s, struct mem_cgroup *memcg)
657dc2f97   Tejun Heo   slab: remove sync...
227
  {
510ded33e   Tejun Heo   slab: implement s...
228
229
230
  	if (is_root_cache(s)) {
  		list_add(&s->root_caches_node, &slab_root_caches);
  	} else {
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
231
  		css_get(&memcg->css);
c03914b7a   Roman Gushchin   mm: memcg/slab: p...
232
  		s->memcg_params.memcg = memcg;
510ded33e   Tejun Heo   slab: implement s...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  		list_add(&s->memcg_params.children_node,
  			 &s->memcg_params.root_cache->memcg_params.children);
  		list_add(&s->memcg_params.kmem_caches_node,
  			 &s->memcg_params.memcg->kmem_caches);
  	}
  }
  
  static void memcg_unlink_cache(struct kmem_cache *s)
  {
  	if (is_root_cache(s)) {
  		list_del(&s->root_caches_node);
  	} else {
  		list_del(&s->memcg_params.children_node);
  		list_del(&s->memcg_params.kmem_caches_node);
  	}
657dc2f97   Tejun Heo   slab: remove sync...
248
  }
33a690c45   Vladimir Davydov   memcg: move memcg...
249
  #else
f7ce3190c   Vladimir Davydov   slab: embed memcg...
250
  static inline int init_memcg_params(struct kmem_cache *s,
c03914b7a   Roman Gushchin   mm: memcg/slab: p...
251
  				    struct kmem_cache *root_cache)
33a690c45   Vladimir Davydov   memcg: move memcg...
252
253
254
  {
  	return 0;
  }
f7ce3190c   Vladimir Davydov   slab: embed memcg...
255
  static inline void destroy_memcg_params(struct kmem_cache *s)
33a690c45   Vladimir Davydov   memcg: move memcg...
256
257
  {
  }
657dc2f97   Tejun Heo   slab: remove sync...
258

510ded33e   Tejun Heo   slab: implement s...
259
  static inline void memcg_unlink_cache(struct kmem_cache *s)
657dc2f97   Tejun Heo   slab: remove sync...
260
261
  {
  }
84c07d11a   Kirill Tkhai   mm: introduce CON...
262
  #endif /* CONFIG_MEMCG_KMEM */
55007d849   Glauber Costa   memcg: allocate m...
263

77be4b136   Shuah Khan   mm/slab: restruct...
264
  /*
692ae74aa   Byongho Lee   mm/slab_common.c:...
265
266
267
   * Figure out what the alignment of the objects will be given a set of
   * flags, a user specified alignment and the size of the objects.
   */
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
268
269
  static unsigned int calculate_alignment(slab_flags_t flags,
  		unsigned int align, unsigned int size)
692ae74aa   Byongho Lee   mm/slab_common.c:...
270
271
272
273
274
275
276
277
278
  {
  	/*
  	 * If the user wants hardware cache aligned objects then follow that
  	 * suggestion if the object is sufficiently large.
  	 *
  	 * The hardware cache alignment cannot override the specified
  	 * alignment though. If that is greater then use it.
  	 */
  	if (flags & SLAB_HWCACHE_ALIGN) {
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
279
  		unsigned int ralign;
692ae74aa   Byongho Lee   mm/slab_common.c:...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  
  		ralign = cache_line_size();
  		while (size <= ralign / 2)
  			ralign /= 2;
  		align = max(align, ralign);
  	}
  
  	if (align < ARCH_SLAB_MINALIGN)
  		align = ARCH_SLAB_MINALIGN;
  
  	return ALIGN(align, sizeof(void *));
  }
  
  /*
423c929cb   Joonsoo Kim   mm/slab_common: c...
294
295
296
297
298
299
300
301
302
303
304
305
   * Find a mergeable slab cache
   */
  int slab_unmergeable(struct kmem_cache *s)
  {
  	if (slab_nomerge || (s->flags & SLAB_NEVER_MERGE))
  		return 1;
  
  	if (!is_root_cache(s))
  		return 1;
  
  	if (s->ctor)
  		return 1;
8eb8284b4   David Windsor   usercopy: Prepare...
306
307
  	if (s->usersize)
  		return 1;
423c929cb   Joonsoo Kim   mm/slab_common: c...
308
309
310
311
312
313
314
315
  	/*
  	 * We may have set a slab to be unmergeable during bootstrap.
  	 */
  	if (s->refcount < 0)
  		return 1;
  
  	return 0;
  }
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
316
  struct kmem_cache *find_mergeable(unsigned int size, unsigned int align,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
317
  		slab_flags_t flags, const char *name, void (*ctor)(void *))
423c929cb   Joonsoo Kim   mm/slab_common: c...
318
319
  {
  	struct kmem_cache *s;
c6e28895a   Grygorii Maistrenko   slub: do not merg...
320
  	if (slab_nomerge)
423c929cb   Joonsoo Kim   mm/slab_common: c...
321
322
323
324
325
326
327
328
329
  		return NULL;
  
  	if (ctor)
  		return NULL;
  
  	size = ALIGN(size, sizeof(void *));
  	align = calculate_alignment(flags, align, size);
  	size = ALIGN(size, align);
  	flags = kmem_cache_flags(size, flags, name, NULL);
c6e28895a   Grygorii Maistrenko   slub: do not merg...
330
331
  	if (flags & SLAB_NEVER_MERGE)
  		return NULL;
510ded33e   Tejun Heo   slab: implement s...
332
  	list_for_each_entry_reverse(s, &slab_root_caches, root_caches_node) {
423c929cb   Joonsoo Kim   mm/slab_common: c...
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
  		if (slab_unmergeable(s))
  			continue;
  
  		if (size > s->size)
  			continue;
  
  		if ((flags & SLAB_MERGE_SAME) != (s->flags & SLAB_MERGE_SAME))
  			continue;
  		/*
  		 * Check if alignment is compatible.
  		 * Courtesy of Adrian Drzewiecki
  		 */
  		if ((s->size & ~(align - 1)) != s->size)
  			continue;
  
  		if (s->size - size >= sizeof(void *))
  			continue;
95069ac8d   Joonsoo Kim   mm/slab: fix unal...
350
351
352
  		if (IS_ENABLED(CONFIG_SLAB) && align &&
  			(align > s->align || s->align % align))
  			continue;
423c929cb   Joonsoo Kim   mm/slab_common: c...
353
354
355
356
  		return s;
  	}
  	return NULL;
  }
c9a77a792   Vladimir Davydov   mm/slab_common.c:...
357
  static struct kmem_cache *create_cache(const char *name,
613a5eb56   Shakeel Butt   slab, slub: remov...
358
  		unsigned int object_size, unsigned int align,
7bbdb81ee   Alexey Dobriyan   slab: make userco...
359
360
  		slab_flags_t flags, unsigned int useroffset,
  		unsigned int usersize, void (*ctor)(void *),
c9a77a792   Vladimir Davydov   mm/slab_common.c:...
361
  		struct mem_cgroup *memcg, struct kmem_cache *root_cache)
794b1248b   Vladimir Davydov   memcg, slab: sepa...
362
363
364
  {
  	struct kmem_cache *s;
  	int err;
8eb8284b4   David Windsor   usercopy: Prepare...
365
366
  	if (WARN_ON(useroffset + usersize > object_size))
  		useroffset = usersize = 0;
794b1248b   Vladimir Davydov   memcg, slab: sepa...
367
368
369
370
371
372
  	err = -ENOMEM;
  	s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL);
  	if (!s)
  		goto out;
  
  	s->name = name;
613a5eb56   Shakeel Butt   slab, slub: remov...
373
  	s->size = s->object_size = object_size;
794b1248b   Vladimir Davydov   memcg, slab: sepa...
374
375
  	s->align = align;
  	s->ctor = ctor;
8eb8284b4   David Windsor   usercopy: Prepare...
376
377
  	s->useroffset = useroffset;
  	s->usersize = usersize;
794b1248b   Vladimir Davydov   memcg, slab: sepa...
378

c03914b7a   Roman Gushchin   mm: memcg/slab: p...
379
  	err = init_memcg_params(s, root_cache);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
380
381
382
383
384
385
386
387
388
  	if (err)
  		goto out_free_cache;
  
  	err = __kmem_cache_create(s, flags);
  	if (err)
  		goto out_free_cache;
  
  	s->refcount = 1;
  	list_add(&s->list, &slab_caches);
c03914b7a   Roman Gushchin   mm: memcg/slab: p...
389
  	memcg_link_cache(s, memcg);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
390
391
392
393
394
395
  out:
  	if (err)
  		return ERR_PTR(err);
  	return s;
  
  out_free_cache:
f7ce3190c   Vladimir Davydov   slab: embed memcg...
396
  	destroy_memcg_params(s);
7c4da061f   Vaishali Thakkar   mm/slab_common.c:...
397
  	kmem_cache_free(kmem_cache, s);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
398
399
  	goto out;
  }
459068554   Christoph Lameter   mm/sl[aou]b: Comm...
400

f496990f1   Mike Rapoport   slab: make kmem_c...
401
402
403
  /**
   * kmem_cache_create_usercopy - Create a cache with a region suitable
   * for copying to userspace
77be4b136   Shuah Khan   mm/slab: restruct...
404
405
406
407
   * @name: A string which is used in /proc/slabinfo to identify this cache.
   * @size: The size of objects to be created in this cache.
   * @align: The required alignment for the objects.
   * @flags: SLAB flags
8eb8284b4   David Windsor   usercopy: Prepare...
408
409
   * @useroffset: Usercopy region offset
   * @usersize: Usercopy region size
77be4b136   Shuah Khan   mm/slab: restruct...
410
411
   * @ctor: A constructor for the objects.
   *
77be4b136   Shuah Khan   mm/slab: restruct...
412
413
414
415
416
417
418
419
   * Cannot be called within a interrupt, but can be interrupted.
   * The @ctor is run when new pages are allocated by the cache.
   *
   * The flags are
   *
   * %SLAB_POISON - Poison the slab with a known test pattern (a5a5a5a5)
   * to catch references to uninitialised memory.
   *
f496990f1   Mike Rapoport   slab: make kmem_c...
420
   * %SLAB_RED_ZONE - Insert `Red` zones around the allocated memory to check
77be4b136   Shuah Khan   mm/slab: restruct...
421
422
423
424
425
   * for buffer overruns.
   *
   * %SLAB_HWCACHE_ALIGN - Align the objects in this cache to a hardware
   * cacheline.  This can be beneficial if you're counting cycles as closely
   * as davem.
f496990f1   Mike Rapoport   slab: make kmem_c...
426
427
   *
   * Return: a pointer to the cache on success, NULL on failure.
77be4b136   Shuah Khan   mm/slab: restruct...
428
   */
2633d7a02   Glauber Costa   slab/slub: consid...
429
  struct kmem_cache *
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
430
431
  kmem_cache_create_usercopy(const char *name,
  		  unsigned int size, unsigned int align,
7bbdb81ee   Alexey Dobriyan   slab: make userco...
432
433
  		  slab_flags_t flags,
  		  unsigned int useroffset, unsigned int usersize,
8eb8284b4   David Windsor   usercopy: Prepare...
434
  		  void (*ctor)(void *))
77be4b136   Shuah Khan   mm/slab: restruct...
435
  {
40911a798   Alexandru Moise   mm/slab_common.c:...
436
  	struct kmem_cache *s = NULL;
3dec16ea3   Andrzej Hajda   mm/slab: convert ...
437
  	const char *cache_name;
3965fc365   Vladimir Davydov   slab: clean up km...
438
  	int err;
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
439

77be4b136   Shuah Khan   mm/slab: restruct...
440
  	get_online_cpus();
03afc0e25   Vladimir Davydov   slab: get_online_...
441
  	get_online_mems();
05257a1a3   Vladimir Davydov   memcg: add rwsem ...
442
  	memcg_get_cache_ids();
03afc0e25   Vladimir Davydov   slab: get_online_...
443

77be4b136   Shuah Khan   mm/slab: restruct...
444
  	mutex_lock(&slab_mutex);
686d550d2   Christoph Lameter   mm/slab_common: I...
445

794b1248b   Vladimir Davydov   memcg, slab: sepa...
446
  	err = kmem_cache_sanity_check(name, size);
3aa24f519   Andrew Morton   mm/slab_common.c:...
447
  	if (err) {
3965fc365   Vladimir Davydov   slab: clean up km...
448
  		goto out_unlock;
3aa24f519   Andrew Morton   mm/slab_common.c:...
449
  	}
686d550d2   Christoph Lameter   mm/slab_common: I...
450

e70954fd6   Thomas Garnier   mm/slab_common.c:...
451
452
453
454
455
  	/* Refuse requests with allocator specific flags */
  	if (flags & ~SLAB_FLAGS_PERMITTED) {
  		err = -EINVAL;
  		goto out_unlock;
  	}
d8843922f   Glauber Costa   slab: Ignore inte...
456
457
458
459
460
461
462
  	/*
  	 * Some allocators will constraint the set of valid flags to a subset
  	 * of all flags. We expect them to define CACHE_CREATE_MASK in this
  	 * case, and we'll just provide them with a sanitized version of the
  	 * passed flags.
  	 */
  	flags &= CACHE_CREATE_MASK;
686d550d2   Christoph Lameter   mm/slab_common: I...
463

8eb8284b4   David Windsor   usercopy: Prepare...
464
465
466
467
468
469
470
  	/* Fail closed on bad usersize of useroffset values. */
  	if (WARN_ON(!usersize && useroffset) ||
  	    WARN_ON(size < usersize || size - usersize < useroffset))
  		usersize = useroffset = 0;
  
  	if (!usersize)
  		s = __kmem_cache_alias(name, size, align, flags, ctor);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
471
  	if (s)
3965fc365   Vladimir Davydov   slab: clean up km...
472
  		goto out_unlock;
2633d7a02   Glauber Costa   slab/slub: consid...
473

3dec16ea3   Andrzej Hajda   mm/slab: convert ...
474
  	cache_name = kstrdup_const(name, GFP_KERNEL);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
475
476
477
478
  	if (!cache_name) {
  		err = -ENOMEM;
  		goto out_unlock;
  	}
7c9adf5a5   Christoph Lameter   mm/sl[aou]b: Move...
479

613a5eb56   Shakeel Butt   slab, slub: remov...
480
  	s = create_cache(cache_name, size,
c9a77a792   Vladimir Davydov   mm/slab_common.c:...
481
  			 calculate_alignment(flags, align, size),
8eb8284b4   David Windsor   usercopy: Prepare...
482
  			 flags, useroffset, usersize, ctor, NULL, NULL);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
483
484
  	if (IS_ERR(s)) {
  		err = PTR_ERR(s);
3dec16ea3   Andrzej Hajda   mm/slab: convert ...
485
  		kfree_const(cache_name);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
486
  	}
3965fc365   Vladimir Davydov   slab: clean up km...
487
488
  
  out_unlock:
20cea9683   Christoph Lameter   mm, sl[aou]b: Mov...
489
  	mutex_unlock(&slab_mutex);
03afc0e25   Vladimir Davydov   slab: get_online_...
490

05257a1a3   Vladimir Davydov   memcg: add rwsem ...
491
  	memcg_put_cache_ids();
03afc0e25   Vladimir Davydov   slab: get_online_...
492
  	put_online_mems();
20cea9683   Christoph Lameter   mm, sl[aou]b: Mov...
493
  	put_online_cpus();
ba3253c78   Dave Jones   slab: fix wrong r...
494
  	if (err) {
686d550d2   Christoph Lameter   mm/slab_common: I...
495
496
497
498
499
  		if (flags & SLAB_PANIC)
  			panic("kmem_cache_create: Failed to create slab '%s'. Error %d
  ",
  				name, err);
  		else {
1170532bb   Joe Perches   mm: convert print...
500
501
  			pr_warn("kmem_cache_create(%s) failed with error %d
  ",
686d550d2   Christoph Lameter   mm/slab_common: I...
502
503
504
  				name, err);
  			dump_stack();
  		}
686d550d2   Christoph Lameter   mm/slab_common: I...
505
506
  		return NULL;
  	}
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
507
508
  	return s;
  }
8eb8284b4   David Windsor   usercopy: Prepare...
509
  EXPORT_SYMBOL(kmem_cache_create_usercopy);
f496990f1   Mike Rapoport   slab: make kmem_c...
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
  /**
   * kmem_cache_create - Create a cache.
   * @name: A string which is used in /proc/slabinfo to identify this cache.
   * @size: The size of objects to be created in this cache.
   * @align: The required alignment for the objects.
   * @flags: SLAB flags
   * @ctor: A constructor for the objects.
   *
   * Cannot be called within a interrupt, but can be interrupted.
   * The @ctor is run when new pages are allocated by the cache.
   *
   * The flags are
   *
   * %SLAB_POISON - Poison the slab with a known test pattern (a5a5a5a5)
   * to catch references to uninitialised memory.
   *
   * %SLAB_RED_ZONE - Insert `Red` zones around the allocated memory to check
   * for buffer overruns.
   *
   * %SLAB_HWCACHE_ALIGN - Align the objects in this cache to a hardware
   * cacheline.  This can be beneficial if you're counting cycles as closely
   * as davem.
   *
   * Return: a pointer to the cache on success, NULL on failure.
   */
8eb8284b4   David Windsor   usercopy: Prepare...
535
  struct kmem_cache *
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
536
  kmem_cache_create(const char *name, unsigned int size, unsigned int align,
8eb8284b4   David Windsor   usercopy: Prepare...
537
538
  		slab_flags_t flags, void (*ctor)(void *))
  {
6d07d1cd3   Kees Cook   usercopy: Restric...
539
  	return kmem_cache_create_usercopy(name, size, align, flags, 0, 0,
8eb8284b4   David Windsor   usercopy: Prepare...
540
541
  					  ctor);
  }
794b1248b   Vladimir Davydov   memcg, slab: sepa...
542
  EXPORT_SYMBOL(kmem_cache_create);
2633d7a02   Glauber Costa   slab/slub: consid...
543

657dc2f97   Tejun Heo   slab: remove sync...
544
  static void slab_caches_to_rcu_destroy_workfn(struct work_struct *work)
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
545
  {
657dc2f97   Tejun Heo   slab: remove sync...
546
547
  	LIST_HEAD(to_destroy);
  	struct kmem_cache *s, *s2;
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
548

657dc2f97   Tejun Heo   slab: remove sync...
549
  	/*
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
550
  	 * On destruction, SLAB_TYPESAFE_BY_RCU kmem_caches are put on the
657dc2f97   Tejun Heo   slab: remove sync...
551
552
553
554
555
556
557
558
559
560
  	 * @slab_caches_to_rcu_destroy list.  The slab pages are freed
  	 * through RCU and and the associated kmem_cache are dereferenced
  	 * while freeing the pages, so the kmem_caches should be freed only
  	 * after the pending RCU operations are finished.  As rcu_barrier()
  	 * is a pretty slow operation, we batch all pending destructions
  	 * asynchronously.
  	 */
  	mutex_lock(&slab_mutex);
  	list_splice_init(&slab_caches_to_rcu_destroy, &to_destroy);
  	mutex_unlock(&slab_mutex);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
561

657dc2f97   Tejun Heo   slab: remove sync...
562
563
564
565
566
567
568
569
570
571
572
573
  	if (list_empty(&to_destroy))
  		return;
  
  	rcu_barrier();
  
  	list_for_each_entry_safe(s, s2, &to_destroy, list) {
  #ifdef SLAB_SUPPORTS_SYSFS
  		sysfs_slab_release(s);
  #else
  		slab_kmem_cache_release(s);
  #endif
  	}
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
574
  }
657dc2f97   Tejun Heo   slab: remove sync...
575
  static int shutdown_cache(struct kmem_cache *s)
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
576
  {
f9fa1d919   Greg Thelen   kasan: drain quar...
577
578
  	/* free asan quarantined objects */
  	kasan_cache_shutdown(s);
657dc2f97   Tejun Heo   slab: remove sync...
579
580
  	if (__kmem_cache_shutdown(s) != 0)
  		return -EBUSY;
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
581

510ded33e   Tejun Heo   slab: implement s...
582
  	memcg_unlink_cache(s);
657dc2f97   Tejun Heo   slab: remove sync...
583
  	list_del(&s->list);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
584

5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
585
  	if (s->flags & SLAB_TYPESAFE_BY_RCU) {
d50d82faa   Mikulas Patocka   slub: fix failure...
586
587
588
  #ifdef SLAB_SUPPORTS_SYSFS
  		sysfs_slab_unlink(s);
  #endif
657dc2f97   Tejun Heo   slab: remove sync...
589
590
591
  		list_add_tail(&s->list, &slab_caches_to_rcu_destroy);
  		schedule_work(&slab_caches_to_rcu_destroy_work);
  	} else {
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
592
  #ifdef SLAB_SUPPORTS_SYSFS
d50d82faa   Mikulas Patocka   slub: fix failure...
593
  		sysfs_slab_unlink(s);
bf5eb3de3   Tejun Heo   slub: separate ou...
594
  		sysfs_slab_release(s);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
595
596
597
598
  #else
  		slab_kmem_cache_release(s);
  #endif
  	}
657dc2f97   Tejun Heo   slab: remove sync...
599
600
  
  	return 0;
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
601
  }
84c07d11a   Kirill Tkhai   mm: introduce CON...
602
  #ifdef CONFIG_MEMCG_KMEM
794b1248b   Vladimir Davydov   memcg, slab: sepa...
603
  /*
776ed0f03   Vladimir Davydov   memcg: cleanup km...
604
   * memcg_create_kmem_cache - Create a cache for a memory cgroup.
794b1248b   Vladimir Davydov   memcg, slab: sepa...
605
606
607
608
609
610
611
   * @memcg: The memory cgroup the new cache is for.
   * @root_cache: The parent of the new cache.
   *
   * This function attempts to create a kmem cache that will serve allocation
   * requests going from @memcg to @root_cache. The new cache inherits properties
   * from its parent.
   */
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
612
613
  void memcg_create_kmem_cache(struct mem_cgroup *memcg,
  			     struct kmem_cache *root_cache)
2633d7a02   Glauber Costa   slab/slub: consid...
614
  {
3e0350a36   Vladimir Davydov   memcg: zap memcg_...
615
  	static char memcg_name_buf[NAME_MAX + 1]; /* protected by slab_mutex */
33398cf2f   Michal Hocko   memcg: export str...
616
  	struct cgroup_subsys_state *css = &memcg->css;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
617
  	struct memcg_cache_array *arr;
bd6731458   Vladimir Davydov   memcg, slab: simp...
618
  	struct kmem_cache *s = NULL;
794b1248b   Vladimir Davydov   memcg, slab: sepa...
619
  	char *cache_name;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
620
  	int idx;
794b1248b   Vladimir Davydov   memcg, slab: sepa...
621
622
  
  	get_online_cpus();
03afc0e25   Vladimir Davydov   slab: get_online_...
623
  	get_online_mems();
794b1248b   Vladimir Davydov   memcg, slab: sepa...
624
  	mutex_lock(&slab_mutex);
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
625
  	/*
567e9ab2e   Johannes Weiner   mm: memcontrol: g...
626
  	 * The memory cgroup could have been offlined while the cache
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
627
628
  	 * creation work was pending.
  	 */
570332978   Roman Gushchin   mm: memcg/slab: d...
629
  	if (memcg->kmem_state != KMEM_ONLINE)
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
630
  		goto out_unlock;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
631
632
633
  	idx = memcg_cache_id(memcg);
  	arr = rcu_dereference_protected(root_cache->memcg_params.memcg_caches,
  					lockdep_is_held(&slab_mutex));
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
634
635
636
637
638
  	/*
  	 * Since per-memcg caches are created asynchronously on first
  	 * allocation (see memcg_kmem_get_cache()), several threads can try to
  	 * create the same cache, but only one of them may succeed.
  	 */
f7ce3190c   Vladimir Davydov   slab: embed memcg...
639
  	if (arr->entries[idx])
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
640
  		goto out_unlock;
f1008365b   Vladimir Davydov   slab: use css id ...
641
  	cgroup_name(css->cgroup, memcg_name_buf, sizeof(memcg_name_buf));
73f576c04   Johannes Weiner   mm: memcontrol: f...
642
643
  	cache_name = kasprintf(GFP_KERNEL, "%s(%llu:%s)", root_cache->name,
  			       css->serial_nr, memcg_name_buf);
794b1248b   Vladimir Davydov   memcg, slab: sepa...
644
645
  	if (!cache_name)
  		goto out_unlock;
c9a77a792   Vladimir Davydov   mm/slab_common.c:...
646
  	s = create_cache(cache_name, root_cache->object_size,
613a5eb56   Shakeel Butt   slab, slub: remov...
647
  			 root_cache->align,
f773e36de   Greg Thelen   memcg: prevent me...
648
  			 root_cache->flags & CACHE_CREATE_MASK,
8eb8284b4   David Windsor   usercopy: Prepare...
649
  			 root_cache->useroffset, root_cache->usersize,
f773e36de   Greg Thelen   memcg: prevent me...
650
  			 root_cache->ctor, memcg, root_cache);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
651
652
653
654
655
  	/*
  	 * If we could not create a memcg cache, do not complain, because
  	 * that's not critical at all as we can always proceed with the root
  	 * cache.
  	 */
bd6731458   Vladimir Davydov   memcg, slab: simp...
656
  	if (IS_ERR(s)) {
794b1248b   Vladimir Davydov   memcg, slab: sepa...
657
  		kfree(cache_name);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
658
  		goto out_unlock;
bd6731458   Vladimir Davydov   memcg, slab: simp...
659
  	}
794b1248b   Vladimir Davydov   memcg, slab: sepa...
660

d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
661
  	/*
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
662
  	 * Since readers won't lock (see memcg_kmem_get_cache()), we need a
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
663
664
665
666
  	 * barrier here to ensure nobody will see the kmem_cache partially
  	 * initialized.
  	 */
  	smp_wmb();
f7ce3190c   Vladimir Davydov   slab: embed memcg...
667
  	arr->entries[idx] = s;
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
668

794b1248b   Vladimir Davydov   memcg, slab: sepa...
669
670
  out_unlock:
  	mutex_unlock(&slab_mutex);
03afc0e25   Vladimir Davydov   slab: get_online_...
671
672
  
  	put_online_mems();
794b1248b   Vladimir Davydov   memcg, slab: sepa...
673
  	put_online_cpus();
2633d7a02   Glauber Costa   slab/slub: consid...
674
  }
b8529907b   Vladimir Davydov   memcg, slab: do n...
675

0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
676
  static void kmemcg_workfn(struct work_struct *work)
01fb58bcb   Tejun Heo   slab: remove sync...
677
678
  {
  	struct kmem_cache *s = container_of(work, struct kmem_cache,
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
679
  					    memcg_params.work);
01fb58bcb   Tejun Heo   slab: remove sync...
680
681
682
683
684
  
  	get_online_cpus();
  	get_online_mems();
  
  	mutex_lock(&slab_mutex);
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
685
  	s->memcg_params.work_fn(s);
01fb58bcb   Tejun Heo   slab: remove sync...
686
687
688
689
  	mutex_unlock(&slab_mutex);
  
  	put_online_mems();
  	put_online_cpus();
01fb58bcb   Tejun Heo   slab: remove sync...
690
  }
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
691
  static void kmemcg_rcufn(struct rcu_head *head)
01fb58bcb   Tejun Heo   slab: remove sync...
692
693
  {
  	struct kmem_cache *s = container_of(head, struct kmem_cache,
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
694
  					    memcg_params.rcu_head);
01fb58bcb   Tejun Heo   slab: remove sync...
695
696
  
  	/*
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
697
  	 * We need to grab blocking locks.  Bounce to ->work.  The
01fb58bcb   Tejun Heo   slab: remove sync...
698
699
700
  	 * work item shares the space with the RCU head and can't be
  	 * initialized eariler.
  	 */
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
701
702
  	INIT_WORK(&s->memcg_params.work, kmemcg_workfn);
  	queue_work(memcg_kmem_cache_wq, &s->memcg_params.work);
01fb58bcb   Tejun Heo   slab: remove sync...
703
  }
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
  static void kmemcg_cache_shutdown_fn(struct kmem_cache *s)
  {
  	WARN_ON(shutdown_cache(s));
  }
  
  static void kmemcg_cache_shutdown(struct percpu_ref *percpu_ref)
  {
  	struct kmem_cache *s = container_of(percpu_ref, struct kmem_cache,
  					    memcg_params.refcnt);
  	unsigned long flags;
  
  	spin_lock_irqsave(&memcg_kmem_wq_lock, flags);
  	if (s->memcg_params.root_cache->memcg_params.dying)
  		goto unlock;
  
  	s->memcg_params.work_fn = kmemcg_cache_shutdown_fn;
  	INIT_WORK(&s->memcg_params.work, kmemcg_workfn);
  	queue_work(memcg_kmem_cache_wq, &s->memcg_params.work);
  
  unlock:
  	spin_unlock_irqrestore(&memcg_kmem_wq_lock, flags);
  }
  
  static void kmemcg_cache_deactivate_after_rcu(struct kmem_cache *s)
  {
  	__kmemcg_cache_deactivate_after_rcu(s);
  	percpu_ref_kill(&s->memcg_params.refcnt);
  }
434866947   Roman Gushchin   mm: memcg/slab: g...
732
  static void kmemcg_cache_deactivate(struct kmem_cache *s)
01fb58bcb   Tejun Heo   slab: remove sync...
733
  {
f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
734
  	if (WARN_ON_ONCE(is_root_cache(s)))
01fb58bcb   Tejun Heo   slab: remove sync...
735
  		return;
434866947   Roman Gushchin   mm: memcg/slab: g...
736
  	__kmemcg_cache_deactivate(s);
fcf8a1e48   Waiman Long   mm, memcg: add a ...
737
  	s->flags |= SLAB_DEACTIVATED;
434866947   Roman Gushchin   mm: memcg/slab: g...
738

63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
739
740
741
742
743
744
  	/*
  	 * memcg_kmem_wq_lock is used to synchronize memcg_params.dying
  	 * flag and make sure that no new kmem_cache deactivation tasks
  	 * are queued (see flush_memcg_workqueue() ).
  	 */
  	spin_lock_irq(&memcg_kmem_wq_lock);
92ee383f6   Shakeel Butt   mm: fix race betw...
745
  	if (s->memcg_params.root_cache->memcg_params.dying)
63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
746
  		goto unlock;
92ee383f6   Shakeel Butt   mm: fix race betw...
747

f0a3a24b5   Roman Gushchin   mm: memcg/slab: r...
748
  	s->memcg_params.work_fn = kmemcg_cache_deactivate_after_rcu;
0b14e8aa6   Roman Gushchin   mm: memcg/slab: r...
749
  	call_rcu(&s->memcg_params.rcu_head, kmemcg_rcufn);
63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
750
751
  unlock:
  	spin_unlock_irq(&memcg_kmem_wq_lock);
01fb58bcb   Tejun Heo   slab: remove sync...
752
  }
fb2f2b0ad   Roman Gushchin   mm: memcg/slab: r...
753
754
  void memcg_deactivate_kmem_caches(struct mem_cgroup *memcg,
  				  struct mem_cgroup *parent)
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
755
756
757
  {
  	int idx;
  	struct memcg_cache_array *arr;
d6e0b7fa1   Vladimir Davydov   slub: make dead c...
758
  	struct kmem_cache *s, *c;
fb2f2b0ad   Roman Gushchin   mm: memcg/slab: r...
759
  	unsigned int nr_reparented;
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
760
761
  
  	idx = memcg_cache_id(memcg);
d6e0b7fa1   Vladimir Davydov   slub: make dead c...
762
763
  	get_online_cpus();
  	get_online_mems();
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
764
  	mutex_lock(&slab_mutex);
510ded33e   Tejun Heo   slab: implement s...
765
  	list_for_each_entry(s, &slab_root_caches, root_caches_node) {
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
766
767
  		arr = rcu_dereference_protected(s->memcg_params.memcg_caches,
  						lockdep_is_held(&slab_mutex));
d6e0b7fa1   Vladimir Davydov   slub: make dead c...
768
769
770
  		c = arr->entries[idx];
  		if (!c)
  			continue;
434866947   Roman Gushchin   mm: memcg/slab: g...
771
  		kmemcg_cache_deactivate(c);
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
772
773
  		arr->entries[idx] = NULL;
  	}
fb2f2b0ad   Roman Gushchin   mm: memcg/slab: r...
774
775
776
777
778
779
780
781
782
783
784
785
  	nr_reparented = 0;
  	list_for_each_entry(s, &memcg->kmem_caches,
  			    memcg_params.kmem_caches_node) {
  		WRITE_ONCE(s->memcg_params.memcg, parent);
  		css_put(&memcg->css);
  		nr_reparented++;
  	}
  	if (nr_reparented) {
  		list_splice_init(&memcg->kmem_caches,
  				 &parent->kmem_caches);
  		css_get_many(&parent->css, nr_reparented);
  	}
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
786
  	mutex_unlock(&slab_mutex);
d6e0b7fa1   Vladimir Davydov   slub: make dead c...
787
788
789
  
  	put_online_mems();
  	put_online_cpus();
2a4db7eb9   Vladimir Davydov   memcg: free memcg...
790
  }
657dc2f97   Tejun Heo   slab: remove sync...
791
  static int shutdown_memcg_caches(struct kmem_cache *s)
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
  {
  	struct memcg_cache_array *arr;
  	struct kmem_cache *c, *c2;
  	LIST_HEAD(busy);
  	int i;
  
  	BUG_ON(!is_root_cache(s));
  
  	/*
  	 * First, shutdown active caches, i.e. caches that belong to online
  	 * memory cgroups.
  	 */
  	arr = rcu_dereference_protected(s->memcg_params.memcg_caches,
  					lockdep_is_held(&slab_mutex));
  	for_each_memcg_cache_index(i) {
  		c = arr->entries[i];
  		if (!c)
  			continue;
657dc2f97   Tejun Heo   slab: remove sync...
810
  		if (shutdown_cache(c))
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
811
812
813
814
815
  			/*
  			 * The cache still has objects. Move it to a temporary
  			 * list so as not to try to destroy it for a second
  			 * time while iterating over inactive caches below.
  			 */
9eeadc8b6   Tejun Heo   slab: reorganize ...
816
  			list_move(&c->memcg_params.children_node, &busy);
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
817
818
819
820
821
822
823
824
825
826
827
828
829
830
  		else
  			/*
  			 * The cache is empty and will be destroyed soon. Clear
  			 * the pointer to it in the memcg_caches array so that
  			 * it will never be accessed even if the root cache
  			 * stays alive.
  			 */
  			arr->entries[i] = NULL;
  	}
  
  	/*
  	 * Second, shutdown all caches left from memory cgroups that are now
  	 * offline.
  	 */
9eeadc8b6   Tejun Heo   slab: reorganize ...
831
832
  	list_for_each_entry_safe(c, c2, &s->memcg_params.children,
  				 memcg_params.children_node)
657dc2f97   Tejun Heo   slab: remove sync...
833
  		shutdown_cache(c);
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
834

9eeadc8b6   Tejun Heo   slab: reorganize ...
835
  	list_splice(&busy, &s->memcg_params.children);
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
836
837
838
839
840
  
  	/*
  	 * A cache being destroyed must be empty. In particular, this means
  	 * that all per memcg caches attached to it must be empty too.
  	 */
9eeadc8b6   Tejun Heo   slab: reorganize ...
841
  	if (!list_empty(&s->memcg_params.children))
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
842
843
844
  		return -EBUSY;
  	return 0;
  }
92ee383f6   Shakeel Butt   mm: fix race betw...
845
846
847
  
  static void flush_memcg_workqueue(struct kmem_cache *s)
  {
63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
848
  	spin_lock_irq(&memcg_kmem_wq_lock);
92ee383f6   Shakeel Butt   mm: fix race betw...
849
  	s->memcg_params.dying = true;
63b02ef7d   Roman Gushchin   mm: memcg/slab: s...
850
  	spin_unlock_irq(&memcg_kmem_wq_lock);
92ee383f6   Shakeel Butt   mm: fix race betw...
851
852
  
  	/*
434866947   Roman Gushchin   mm: memcg/slab: g...
853
  	 * SLAB and SLUB deactivate the kmem_caches through call_rcu. Make
92ee383f6   Shakeel Butt   mm: fix race betw...
854
855
  	 * sure all registered rcu callbacks have been invoked.
  	 */
434866947   Roman Gushchin   mm: memcg/slab: g...
856
  	rcu_barrier();
92ee383f6   Shakeel Butt   mm: fix race betw...
857
858
859
860
861
862
  
  	/*
  	 * SLAB and SLUB create memcg kmem_caches through workqueue and SLUB
  	 * deactivates the memcg kmem_caches through workqueue. Make sure all
  	 * previous workitems on workqueue are processed.
  	 */
904c1db4b   Adrian Huang   mm: memcg/slab: c...
863
864
  	if (likely(memcg_kmem_cache_wq))
  		flush_workqueue(memcg_kmem_cache_wq);
e4d09b31a   Roman Gushchin   mm: memcg/slab: w...
865
866
867
868
869
870
871
872
873
874
875
876
  
  	/*
  	 * If we're racing with children kmem_cache deactivation, it might
  	 * take another rcu grace period to complete their destruction.
  	 * At this moment the corresponding percpu_ref_kill() call should be
  	 * done, but it might take another rcu grace period to complete
  	 * switching to the atomic mode.
  	 * Please, note that we check without grabbing the slab_mutex. It's safe
  	 * because at this moment the children list can't grow.
  	 */
  	if (!list_empty(&s->memcg_params.children))
  		rcu_barrier();
92ee383f6   Shakeel Butt   mm: fix race betw...
877
  }
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
878
  #else
657dc2f97   Tejun Heo   slab: remove sync...
879
  static inline int shutdown_memcg_caches(struct kmem_cache *s)
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
880
881
882
  {
  	return 0;
  }
92ee383f6   Shakeel Butt   mm: fix race betw...
883
884
885
886
  
  static inline void flush_memcg_workqueue(struct kmem_cache *s)
  {
  }
84c07d11a   Kirill Tkhai   mm: introduce CON...
887
  #endif /* CONFIG_MEMCG_KMEM */
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
888

41a212859   Christoph Lameter   slub: use sysfs'e...
889
890
  void slab_kmem_cache_release(struct kmem_cache *s)
  {
52b4b950b   Dmitry Safonov   mm: slab: free km...
891
  	__kmem_cache_release(s);
f7ce3190c   Vladimir Davydov   slab: embed memcg...
892
  	destroy_memcg_params(s);
3dec16ea3   Andrzej Hajda   mm/slab: convert ...
893
  	kfree_const(s->name);
41a212859   Christoph Lameter   slub: use sysfs'e...
894
895
  	kmem_cache_free(kmem_cache, s);
  }
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
896
897
  void kmem_cache_destroy(struct kmem_cache *s)
  {
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
898
  	int err;
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
899

3942d2991   Sergey Senozhatsky   mm/slab_common: a...
900
901
  	if (unlikely(!s))
  		return;
92ee383f6   Shakeel Butt   mm: fix race betw...
902
  	flush_memcg_workqueue(s);
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
903
  	get_online_cpus();
03afc0e25   Vladimir Davydov   slab: get_online_...
904
  	get_online_mems();
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
905
  	mutex_lock(&slab_mutex);
b8529907b   Vladimir Davydov   memcg, slab: do n...
906

945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
907
  	s->refcount--;
b8529907b   Vladimir Davydov   memcg, slab: do n...
908
909
  	if (s->refcount)
  		goto out_unlock;
657dc2f97   Tejun Heo   slab: remove sync...
910
  	err = shutdown_memcg_caches(s);
d60fdcc9e   Vladimir Davydov   mm/slab_common.c:...
911
  	if (!err)
657dc2f97   Tejun Heo   slab: remove sync...
912
  		err = shutdown_cache(s);
b8529907b   Vladimir Davydov   memcg, slab: do n...
913

cd918c557   Vladimir Davydov   mm/slab_common.c:...
914
  	if (err) {
756a025f0   Joe Perches   mm: coalesce spli...
915
916
917
  		pr_err("kmem_cache_destroy %s: Slab cache still has objects
  ",
  		       s->name);
cd918c557   Vladimir Davydov   mm/slab_common.c:...
918
919
  		dump_stack();
  	}
b8529907b   Vladimir Davydov   memcg, slab: do n...
920
921
  out_unlock:
  	mutex_unlock(&slab_mutex);
d5b3cf713   Vladimir Davydov   memcg: zap memcg_...
922

03afc0e25   Vladimir Davydov   slab: get_online_...
923
  	put_online_mems();
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
924
925
926
  	put_online_cpus();
  }
  EXPORT_SYMBOL(kmem_cache_destroy);
03afc0e25   Vladimir Davydov   slab: get_online_...
927
928
929
930
931
932
  /**
   * kmem_cache_shrink - Shrink a cache.
   * @cachep: The cache to shrink.
   *
   * Releases as many slabs as possible for a cache.
   * To help debugging, a zero exit status indicates all slabs were released.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
933
934
   *
   * Return: %0 if all slabs were released, non-zero otherwise
03afc0e25   Vladimir Davydov   slab: get_online_...
935
936
937
938
939
940
941
   */
  int kmem_cache_shrink(struct kmem_cache *cachep)
  {
  	int ret;
  
  	get_online_cpus();
  	get_online_mems();
55834c590   Alexander Potapenko   mm: kasan: initia...
942
  	kasan_cache_shrink(cachep);
c9fc58640   Tejun Heo   slab: introduce _...
943
  	ret = __kmem_cache_shrink(cachep);
03afc0e25   Vladimir Davydov   slab: get_online_...
944
945
946
947
948
  	put_online_mems();
  	put_online_cpus();
  	return ret;
  }
  EXPORT_SYMBOL(kmem_cache_shrink);
04f768a39   Waiman Long   mm, slab: extend ...
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
  /**
   * kmem_cache_shrink_all - shrink a cache and all memcg caches for root cache
   * @s: The cache pointer
   */
  void kmem_cache_shrink_all(struct kmem_cache *s)
  {
  	struct kmem_cache *c;
  
  	if (!IS_ENABLED(CONFIG_MEMCG_KMEM) || !is_root_cache(s)) {
  		kmem_cache_shrink(s);
  		return;
  	}
  
  	get_online_cpus();
  	get_online_mems();
  	kasan_cache_shrink(s);
  	__kmem_cache_shrink(s);
  
  	/*
  	 * We have to take the slab_mutex to protect from the memcg list
  	 * modification.
  	 */
  	mutex_lock(&slab_mutex);
  	for_each_memcg_cache(c, s) {
  		/*
  		 * Don't need to shrink deactivated memcg caches.
  		 */
  		if (s->flags & SLAB_DEACTIVATED)
  			continue;
  		kasan_cache_shrink(c);
  		__kmem_cache_shrink(c);
  	}
  	mutex_unlock(&slab_mutex);
  	put_online_mems();
  	put_online_cpus();
  }
fda901241   Denis Kirjanov   slab: convert sla...
985
  bool slab_is_available(void)
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
986
987
988
  {
  	return slab_state >= UP;
  }
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
989

45530c447   Christoph Lameter   mm, sl[au]b: crea...
990
991
  #ifndef CONFIG_SLOB
  /* Create a cache during boot when no slab services are available yet */
361d575e5   Alexey Dobriyan   slab: make create...
992
993
994
  void __init create_boot_cache(struct kmem_cache *s, const char *name,
  		unsigned int size, slab_flags_t flags,
  		unsigned int useroffset, unsigned int usersize)
45530c447   Christoph Lameter   mm, sl[au]b: crea...
995
996
  {
  	int err;
59bb47985   Vlastimil Babka   mm, sl[aou]b: gua...
997
  	unsigned int align = ARCH_KMALLOC_MINALIGN;
45530c447   Christoph Lameter   mm, sl[au]b: crea...
998
999
1000
  
  	s->name = name;
  	s->size = s->object_size = size;
59bb47985   Vlastimil Babka   mm, sl[aou]b: gua...
1001
1002
1003
1004
1005
1006
1007
1008
  
  	/*
  	 * For power of two sizes, guarantee natural alignment for kmalloc
  	 * caches, regardless of SL*B debugging options.
  	 */
  	if (is_power_of_2(size))
  		align = max(align, size);
  	s->align = calculate_alignment(flags, align, size);
8eb8284b4   David Windsor   usercopy: Prepare...
1009
1010
  	s->useroffset = useroffset;
  	s->usersize = usersize;
f7ce3190c   Vladimir Davydov   slab: embed memcg...
1011
1012
  
  	slab_init_memcg_params(s);
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1013
1014
1015
  	err = __kmem_cache_create(s, flags);
  
  	if (err)
361d575e5   Alexey Dobriyan   slab: make create...
1016
1017
  		panic("Creation of kmalloc slab %s size=%u failed. Reason %d
  ",
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1018
1019
1020
1021
  					name, size, err);
  
  	s->refcount = -1;	/* Exempt from merging for now */
  }
55de8b9c6   Alexey Dobriyan   slab: make create...
1022
1023
1024
  struct kmem_cache *__init create_kmalloc_cache(const char *name,
  		unsigned int size, slab_flags_t flags,
  		unsigned int useroffset, unsigned int usersize)
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1025
1026
1027
1028
1029
1030
  {
  	struct kmem_cache *s = kmem_cache_zalloc(kmem_cache, GFP_NOWAIT);
  
  	if (!s)
  		panic("Out of memory when creating slab %s
  ", name);
6c0c21adc   David Windsor   usercopy: Mark km...
1031
  	create_boot_cache(s, name, size, flags, useroffset, usersize);
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1032
  	list_add(&s->list, &slab_caches);
c03914b7a   Roman Gushchin   mm: memcg/slab: p...
1033
  	memcg_link_cache(s, NULL);
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1034
1035
1036
  	s->refcount = 1;
  	return s;
  }
cc252eae8   Vlastimil Babka   mm, slab: combine...
1037
  struct kmem_cache *
a07057dce   Arnd Bergmann   mm/slab_common.c:...
1038
1039
  kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init =
  { /* initialization for https://bugs.llvm.org/show_bug.cgi?id=42570 */ };
9425c58e5   Christoph Lameter   slab: Common defi...
1040
  EXPORT_SYMBOL(kmalloc_caches);
f97d5f634   Christoph Lameter   slab: Common func...
1041
  /*
2c59dd654   Christoph Lameter   slab: Common Kmal...
1042
1043
1044
1045
1046
   * Conversion table for small slabs sizes / 8 to the index in the
   * kmalloc array. This is necessary for slabs < 192 since we have non power
   * of two cache sizes there. The size of larger slabs can be determined using
   * fls.
   */
d5f866550   Alexey Dobriyan   slab: make size_i...
1047
  static u8 size_index[24] __ro_after_init = {
2c59dd654   Christoph Lameter   slab: Common Kmal...
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
  	3,	/* 8 */
  	4,	/* 16 */
  	5,	/* 24 */
  	5,	/* 32 */
  	6,	/* 40 */
  	6,	/* 48 */
  	6,	/* 56 */
  	6,	/* 64 */
  	1,	/* 72 */
  	1,	/* 80 */
  	1,	/* 88 */
  	1,	/* 96 */
  	7,	/* 104 */
  	7,	/* 112 */
  	7,	/* 120 */
  	7,	/* 128 */
  	2,	/* 136 */
  	2,	/* 144 */
  	2,	/* 152 */
  	2,	/* 160 */
  	2,	/* 168 */
  	2,	/* 176 */
  	2,	/* 184 */
  	2	/* 192 */
  };
ac914d08b   Alexey Dobriyan   slab: make size_i...
1073
  static inline unsigned int size_index_elem(unsigned int bytes)
2c59dd654   Christoph Lameter   slab: Common Kmal...
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  {
  	return (bytes - 1) / 8;
  }
  
  /*
   * Find the kmem_cache structure that serves a given size of
   * allocation
   */
  struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags)
  {
d5f866550   Alexey Dobriyan   slab: make size_i...
1084
  	unsigned int index;
2c59dd654   Christoph Lameter   slab: Common Kmal...
1085
1086
1087
1088
1089
1090
  
  	if (size <= 192) {
  		if (!size)
  			return ZERO_SIZE_PTR;
  
  		index = size_index[size_index_elem(size)];
61448479a   Dmitry Vyukov   mm: don't warn ab...
1091
  	} else {
221d7da66   Yangtao Li   mm, slab: remove ...
1092
  		if (WARN_ON_ONCE(size > KMALLOC_MAX_CACHE_SIZE))
61448479a   Dmitry Vyukov   mm: don't warn ab...
1093
  			return NULL;
2c59dd654   Christoph Lameter   slab: Common Kmal...
1094
  		index = fls(size - 1);
61448479a   Dmitry Vyukov   mm: don't warn ab...
1095
  	}
2c59dd654   Christoph Lameter   slab: Common Kmal...
1096

cc252eae8   Vlastimil Babka   mm, slab: combine...
1097
  	return kmalloc_caches[kmalloc_type(flags)][index];
2c59dd654   Christoph Lameter   slab: Common Kmal...
1098
1099
1100
  }
  
  /*
4066c33d0   Gavin Guo   mm/slab_common: s...
1101
1102
1103
1104
   * kmalloc_info[] is to make slub_debug=,kmalloc-xx option work at boot time.
   * kmalloc_index() supports up to 2^26=64MB, so the final entry of the table is
   * kmalloc-67108864.
   */
af3b5f876   Vlastimil Babka   mm, slab: rename ...
1105
  const struct kmalloc_info_struct kmalloc_info[] __initconst = {
4066c33d0   Gavin Guo   mm/slab_common: s...
1106
1107
1108
1109
1110
  	{NULL,                      0},		{"kmalloc-96",             96},
  	{"kmalloc-192",           192},		{"kmalloc-8",               8},
  	{"kmalloc-16",             16},		{"kmalloc-32",             32},
  	{"kmalloc-64",             64},		{"kmalloc-128",           128},
  	{"kmalloc-256",           256},		{"kmalloc-512",           512},
f0d778741   Vlastimil Babka   mm, slab: shorten...
1111
1112
1113
1114
1115
1116
1117
1118
1119
  	{"kmalloc-1k",           1024},		{"kmalloc-2k",           2048},
  	{"kmalloc-4k",           4096},		{"kmalloc-8k",           8192},
  	{"kmalloc-16k",         16384},		{"kmalloc-32k",         32768},
  	{"kmalloc-64k",         65536},		{"kmalloc-128k",       131072},
  	{"kmalloc-256k",       262144},		{"kmalloc-512k",       524288},
  	{"kmalloc-1M",        1048576},		{"kmalloc-2M",        2097152},
  	{"kmalloc-4M",        4194304},		{"kmalloc-8M",        8388608},
  	{"kmalloc-16M",      16777216},		{"kmalloc-32M",      33554432},
  	{"kmalloc-64M",      67108864}
4066c33d0   Gavin Guo   mm/slab_common: s...
1120
1121
1122
  };
  
  /*
34cc6990d   Daniel Sanders   slab: correct siz...
1123
1124
1125
1126
1127
1128
1129
1130
1131
   * Patch up the size_index table if we have strange large alignment
   * requirements for the kmalloc array. This is only the case for
   * MIPS it seems. The standard arches will not generate any code here.
   *
   * Largest permitted alignment is 256 bytes due to the way we
   * handle the index determination for the smaller caches.
   *
   * Make sure that nothing crazy happens if someone starts tinkering
   * around with ARCH_KMALLOC_MINALIGN
f97d5f634   Christoph Lameter   slab: Common func...
1132
   */
34cc6990d   Daniel Sanders   slab: correct siz...
1133
  void __init setup_kmalloc_cache_index_table(void)
f97d5f634   Christoph Lameter   slab: Common func...
1134
  {
ac914d08b   Alexey Dobriyan   slab: make size_i...
1135
  	unsigned int i;
f97d5f634   Christoph Lameter   slab: Common func...
1136

2c59dd654   Christoph Lameter   slab: Common Kmal...
1137
1138
1139
1140
  	BUILD_BUG_ON(KMALLOC_MIN_SIZE > 256 ||
  		(KMALLOC_MIN_SIZE & (KMALLOC_MIN_SIZE - 1)));
  
  	for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) {
ac914d08b   Alexey Dobriyan   slab: make size_i...
1141
  		unsigned int elem = size_index_elem(i);
2c59dd654   Christoph Lameter   slab: Common Kmal...
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
  
  		if (elem >= ARRAY_SIZE(size_index))
  			break;
  		size_index[elem] = KMALLOC_SHIFT_LOW;
  	}
  
  	if (KMALLOC_MIN_SIZE >= 64) {
  		/*
  		 * The 96 byte size cache is not used if the alignment
  		 * is 64 byte.
  		 */
  		for (i = 64 + 8; i <= 96; i += 8)
  			size_index[size_index_elem(i)] = 7;
  
  	}
  
  	if (KMALLOC_MIN_SIZE >= 128) {
  		/*
  		 * The 192 byte sized cache is not used if the alignment
  		 * is 128 byte. Redirect kmalloc to use the 256 byte cache
  		 * instead.
  		 */
  		for (i = 128 + 8; i <= 192; i += 8)
  			size_index[size_index_elem(i)] = 8;
  	}
34cc6990d   Daniel Sanders   slab: correct siz...
1167
  }
f0d778741   Vlastimil Babka   mm, slab: shorten...
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
  static const char *
  kmalloc_cache_name(const char *prefix, unsigned int size)
  {
  
  	static const char units[3] = "\0kM";
  	int idx = 0;
  
  	while (size >= 1024 && (size % 1024 == 0)) {
  		size /= 1024;
  		idx++;
  	}
  
  	return kasprintf(GFP_NOWAIT, "%s-%u%c", prefix, size, units[idx]);
  }
1291523f2   Vlastimil Babka   mm, slab/slub: in...
1182
1183
  static void __init
  new_kmalloc_cache(int idx, int type, slab_flags_t flags)
a9730fca9   Christoph Lameter   Fix kmalloc slab ...
1184
  {
1291523f2   Vlastimil Babka   mm, slab/slub: in...
1185
1186
1187
1188
  	const char *name;
  
  	if (type == KMALLOC_RECLAIM) {
  		flags |= SLAB_RECLAIM_ACCOUNT;
f0d778741   Vlastimil Babka   mm, slab: shorten...
1189
  		name = kmalloc_cache_name("kmalloc-rcl",
1291523f2   Vlastimil Babka   mm, slab/slub: in...
1190
1191
1192
1193
1194
1195
1196
  						kmalloc_info[idx].size);
  		BUG_ON(!name);
  	} else {
  		name = kmalloc_info[idx].name;
  	}
  
  	kmalloc_caches[type][idx] = create_kmalloc_cache(name,
6c0c21adc   David Windsor   usercopy: Mark km...
1197
1198
  					kmalloc_info[idx].size, flags, 0,
  					kmalloc_info[idx].size);
a9730fca9   Christoph Lameter   Fix kmalloc slab ...
1199
  }
34cc6990d   Daniel Sanders   slab: correct siz...
1200
1201
1202
1203
1204
  /*
   * Create the kmalloc array. Some of the regular kmalloc arrays
   * may already have been created because they were needed to
   * enable allocations for slab creation.
   */
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1205
  void __init create_kmalloc_caches(slab_flags_t flags)
34cc6990d   Daniel Sanders   slab: correct siz...
1206
  {
1291523f2   Vlastimil Babka   mm, slab/slub: in...
1207
  	int i, type;
34cc6990d   Daniel Sanders   slab: correct siz...
1208

1291523f2   Vlastimil Babka   mm, slab/slub: in...
1209
1210
1211
1212
  	for (type = KMALLOC_NORMAL; type <= KMALLOC_RECLAIM; type++) {
  		for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
  			if (!kmalloc_caches[type][i])
  				new_kmalloc_cache(i, type, flags);
f97d5f634   Christoph Lameter   slab: Common func...
1213

1291523f2   Vlastimil Babka   mm, slab/slub: in...
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
  			/*
  			 * Caches that are not of the two-to-the-power-of size.
  			 * These have to be created immediately after the
  			 * earlier power of two caches
  			 */
  			if (KMALLOC_MIN_SIZE <= 32 && i == 6 &&
  					!kmalloc_caches[type][1])
  				new_kmalloc_cache(1, type, flags);
  			if (KMALLOC_MIN_SIZE <= 64 && i == 7 &&
  					!kmalloc_caches[type][2])
  				new_kmalloc_cache(2, type, flags);
  		}
8a965b3ba   Christoph Lameter   mm, slab_common: ...
1226
  	}
f97d5f634   Christoph Lameter   slab: Common func...
1227
1228
  	/* Kmalloc array is now usable */
  	slab_state = UP;
f97d5f634   Christoph Lameter   slab: Common func...
1229
1230
  #ifdef CONFIG_ZONE_DMA
  	for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) {
cc252eae8   Vlastimil Babka   mm, slab: combine...
1231
  		struct kmem_cache *s = kmalloc_caches[KMALLOC_NORMAL][i];
f97d5f634   Christoph Lameter   slab: Common func...
1232
1233
  
  		if (s) {
0be70327e   Alexey Dobriyan   slab: make kmallo...
1234
  			unsigned int size = kmalloc_size(i);
f0d778741   Vlastimil Babka   mm, slab: shorten...
1235
  			const char *n = kmalloc_cache_name("dma-kmalloc", size);
f97d5f634   Christoph Lameter   slab: Common func...
1236
1237
  
  			BUG_ON(!n);
cc252eae8   Vlastimil Babka   mm, slab: combine...
1238
1239
  			kmalloc_caches[KMALLOC_DMA][i] = create_kmalloc_cache(
  				n, size, SLAB_CACHE_DMA | flags, 0, 0);
f97d5f634   Christoph Lameter   slab: Common func...
1240
1241
1242
1243
  		}
  	}
  #endif
  }
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1244
  #endif /* !CONFIG_SLOB */
cea371f4f   Vladimir Davydov   slab: document km...
1245
1246
1247
1248
1249
  /*
   * To avoid unnecessary overhead, we pass through large allocation requests
   * directly to the page allocator. We use __GFP_COMP, because we will need to
   * know the allocation order to free the pages properly in kfree.
   */
52383431b   Vladimir Davydov   mm: get rid of __...
1250
1251
  void *kmalloc_order(size_t size, gfp_t flags, unsigned int order)
  {
6a486c0ad   Vlastimil Babka   mm, sl[ou]b: impr...
1252
  	void *ret = NULL;
52383431b   Vladimir Davydov   mm: get rid of __...
1253
1254
1255
  	struct page *page;
  
  	flags |= __GFP_COMP;
4949148ad   Vladimir Davydov   mm: charge/unchar...
1256
  	page = alloc_pages(flags, order);
6a486c0ad   Vlastimil Babka   mm, sl[ou]b: impr...
1257
1258
1259
1260
1261
  	if (likely(page)) {
  		ret = page_address(page);
  		mod_node_page_state(page_pgdat(page), NR_SLAB_UNRECLAIMABLE,
  				    1 << order);
  	}
0116523cf   Andrey Konovalov   kasan, mm: change...
1262
  	ret = kasan_kmalloc_large(ret, size, flags);
a2f775751   Andrey Konovalov   kmemleak: account...
1263
  	/* As ret might get tagged, call kmemleak hook after KASAN. */
53128245b   Andrey Konovalov   kasan, kmemleak: ...
1264
  	kmemleak_alloc(ret, size, 1, flags);
52383431b   Vladimir Davydov   mm: get rid of __...
1265
1266
1267
  	return ret;
  }
  EXPORT_SYMBOL(kmalloc_order);
f1b6eb6e6   Christoph Lameter   mm/sl[aou]b: Move...
1268
1269
1270
1271
1272
1273
1274
1275
1276
  #ifdef CONFIG_TRACING
  void *kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order)
  {
  	void *ret = kmalloc_order(size, flags, order);
  	trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << order, flags);
  	return ret;
  }
  EXPORT_SYMBOL(kmalloc_order_trace);
  #endif
45530c447   Christoph Lameter   mm, sl[au]b: crea...
1277

7c00fce98   Thomas Garnier   mm: reorganize SL...
1278
1279
1280
  #ifdef CONFIG_SLAB_FREELIST_RANDOM
  /* Randomize a generic freelist */
  static void freelist_randomize(struct rnd_state *state, unsigned int *list,
302d55d51   Alexey Dobriyan   slab: use 32-bit ...
1281
  			       unsigned int count)
7c00fce98   Thomas Garnier   mm: reorganize SL...
1282
  {
7c00fce98   Thomas Garnier   mm: reorganize SL...
1283
  	unsigned int rand;
302d55d51   Alexey Dobriyan   slab: use 32-bit ...
1284
  	unsigned int i;
7c00fce98   Thomas Garnier   mm: reorganize SL...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
  
  	for (i = 0; i < count; i++)
  		list[i] = i;
  
  	/* Fisher-Yates shuffle */
  	for (i = count - 1; i > 0; i--) {
  		rand = prandom_u32_state(state);
  		rand %= (i + 1);
  		swap(list[i], list[rand]);
  	}
  }
  
  /* Create a random sequence per cache */
  int cache_random_seq_create(struct kmem_cache *cachep, unsigned int count,
  				    gfp_t gfp)
  {
  	struct rnd_state state;
  
  	if (count < 2 || cachep->random_seq)
  		return 0;
  
  	cachep->random_seq = kcalloc(count, sizeof(unsigned int), gfp);
  	if (!cachep->random_seq)
  		return -ENOMEM;
  
  	/* Get best entropy at this stage of boot */
  	prandom_seed_state(&state, get_random_long());
  
  	freelist_randomize(&state, cachep->random_seq, count);
  	return 0;
  }
  
  /* Destroy the per-cache random freelist sequence */
  void cache_random_seq_destroy(struct kmem_cache *cachep)
  {
  	kfree(cachep->random_seq);
  	cachep->random_seq = NULL;
  }
  #endif /* CONFIG_SLAB_FREELIST_RANDOM */
5b3657710   Yang Shi   mm: slabinfo: rem...
1324
  #if defined(CONFIG_SLAB) || defined(CONFIG_SLUB_DEBUG)
e9b4db2b8   Wanpeng Li   mm/slab: Fix /pro...
1325
  #ifdef CONFIG_SLAB
0825a6f98   Joe Perches   mm: use octal not...
1326
  #define SLABINFO_RIGHTS (0600)
e9b4db2b8   Wanpeng Li   mm/slab: Fix /pro...
1327
  #else
0825a6f98   Joe Perches   mm: use octal not...
1328
  #define SLABINFO_RIGHTS (0400)
e9b4db2b8   Wanpeng Li   mm/slab: Fix /pro...
1329
  #endif
b047501cd   Vladimir Davydov   memcg: use generi...
1330
  static void print_slabinfo_header(struct seq_file *m)
bcee6e2a1   Glauber Costa   mm/sl[au]b: Move ...
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
  {
  	/*
  	 * Output format version, so at least we can change it
  	 * without _too_ many complaints.
  	 */
  #ifdef CONFIG_DEBUG_SLAB
  	seq_puts(m, "slabinfo - version: 2.1 (statistics)
  ");
  #else
  	seq_puts(m, "slabinfo - version: 2.1
  ");
  #endif
756a025f0   Joe Perches   mm: coalesce spli...
1343
  	seq_puts(m, "# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab>");
bcee6e2a1   Glauber Costa   mm/sl[au]b: Move ...
1344
1345
1346
  	seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>");
  	seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
  #ifdef CONFIG_DEBUG_SLAB
756a025f0   Joe Perches   mm: coalesce spli...
1347
  	seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> <error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>");
bcee6e2a1   Glauber Costa   mm/sl[au]b: Move ...
1348
1349
1350
1351
1352
  	seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>");
  #endif
  	seq_putc(m, '
  ');
  }
1df3b26f2   Vladimir Davydov   slab: print slabi...
1353
  void *slab_start(struct seq_file *m, loff_t *pos)
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1354
  {
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1355
  	mutex_lock(&slab_mutex);
510ded33e   Tejun Heo   slab: implement s...
1356
  	return seq_list_start(&slab_root_caches, *pos);
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1357
  }
276a2439c   Wanpeng Li   mm/slab: Give s_n...
1358
  void *slab_next(struct seq_file *m, void *p, loff_t *pos)
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1359
  {
510ded33e   Tejun Heo   slab: implement s...
1360
  	return seq_list_next(p, &slab_root_caches, pos);
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1361
  }
276a2439c   Wanpeng Li   mm/slab: Give s_n...
1362
  void slab_stop(struct seq_file *m, void *p)
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1363
1364
1365
  {
  	mutex_unlock(&slab_mutex);
  }
749c54151   Glauber Costa   memcg: aggregate ...
1366
1367
1368
1369
1370
  static void
  memcg_accumulate_slabinfo(struct kmem_cache *s, struct slabinfo *info)
  {
  	struct kmem_cache *c;
  	struct slabinfo sinfo;
749c54151   Glauber Costa   memcg: aggregate ...
1371
1372
1373
  
  	if (!is_root_cache(s))
  		return;
426589f57   Vladimir Davydov   slab: link memcg ...
1374
  	for_each_memcg_cache(c, s) {
749c54151   Glauber Costa   memcg: aggregate ...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
  		memset(&sinfo, 0, sizeof(sinfo));
  		get_slabinfo(c, &sinfo);
  
  		info->active_slabs += sinfo.active_slabs;
  		info->num_slabs += sinfo.num_slabs;
  		info->shared_avail += sinfo.shared_avail;
  		info->active_objs += sinfo.active_objs;
  		info->num_objs += sinfo.num_objs;
  	}
  }
b047501cd   Vladimir Davydov   memcg: use generi...
1385
  static void cache_show(struct kmem_cache *s, struct seq_file *m)
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1386
  {
0d7561c61   Glauber Costa   sl[au]b: Process ...
1387
1388
1389
1390
  	struct slabinfo sinfo;
  
  	memset(&sinfo, 0, sizeof(sinfo));
  	get_slabinfo(s, &sinfo);
749c54151   Glauber Costa   memcg: aggregate ...
1391
  	memcg_accumulate_slabinfo(s, &sinfo);
0d7561c61   Glauber Costa   sl[au]b: Process ...
1392
  	seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
749c54151   Glauber Costa   memcg: aggregate ...
1393
  		   cache_name(s), sinfo.active_objs, sinfo.num_objs, s->size,
0d7561c61   Glauber Costa   sl[au]b: Process ...
1394
1395
1396
1397
1398
1399
1400
1401
1402
  		   sinfo.objects_per_slab, (1 << sinfo.cache_order));
  
  	seq_printf(m, " : tunables %4u %4u %4u",
  		   sinfo.limit, sinfo.batchcount, sinfo.shared);
  	seq_printf(m, " : slabdata %6lu %6lu %6lu",
  		   sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
  	slabinfo_show_stats(m, s);
  	seq_putc(m, '
  ');
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1403
  }
1df3b26f2   Vladimir Davydov   slab: print slabi...
1404
  static int slab_show(struct seq_file *m, void *p)
749c54151   Glauber Costa   memcg: aggregate ...
1405
  {
510ded33e   Tejun Heo   slab: implement s...
1406
  	struct kmem_cache *s = list_entry(p, struct kmem_cache, root_caches_node);
749c54151   Glauber Costa   memcg: aggregate ...
1407

510ded33e   Tejun Heo   slab: implement s...
1408
  	if (p == slab_root_caches.next)
1df3b26f2   Vladimir Davydov   slab: print slabi...
1409
  		print_slabinfo_header(m);
510ded33e   Tejun Heo   slab: implement s...
1410
  	cache_show(s, m);
b047501cd   Vladimir Davydov   memcg: use generi...
1411
1412
  	return 0;
  }
852d8be0a   Yang Shi   mm: oom: show unr...
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
  void dump_unreclaimable_slab(void)
  {
  	struct kmem_cache *s, *s2;
  	struct slabinfo sinfo;
  
  	/*
  	 * Here acquiring slab_mutex is risky since we don't prefer to get
  	 * sleep in oom path. But, without mutex hold, it may introduce a
  	 * risk of crash.
  	 * Use mutex_trylock to protect the list traverse, dump nothing
  	 * without acquiring the mutex.
  	 */
  	if (!mutex_trylock(&slab_mutex)) {
  		pr_warn("excessive unreclaimable slab but cannot dump stats
  ");
  		return;
  	}
  
  	pr_info("Unreclaimable slab info:
  ");
  	pr_info("Name                      Used          Total
  ");
  
  	list_for_each_entry_safe(s, s2, &slab_caches, list) {
  		if (!is_root_cache(s) || (s->flags & SLAB_RECLAIM_ACCOUNT))
  			continue;
  
  		get_slabinfo(s, &sinfo);
  
  		if (sinfo.num_objs > 0)
  			pr_info("%-17s %10luKB %10luKB
  ", cache_name(s),
  				(sinfo.active_objs * s->size) / 1024,
  				(sinfo.num_objs * s->size) / 1024);
  	}
  	mutex_unlock(&slab_mutex);
  }
5b3657710   Yang Shi   mm: slabinfo: rem...
1450
  #if defined(CONFIG_MEMCG)
bc2791f85   Tejun Heo   slab: link memcg ...
1451
1452
  void *memcg_slab_start(struct seq_file *m, loff_t *pos)
  {
aa9694bb7   Chris Down   mm, memcg: create...
1453
  	struct mem_cgroup *memcg = mem_cgroup_from_seq(m);
bc2791f85   Tejun Heo   slab: link memcg ...
1454
1455
1456
1457
1458
1459
1460
  
  	mutex_lock(&slab_mutex);
  	return seq_list_start(&memcg->kmem_caches, *pos);
  }
  
  void *memcg_slab_next(struct seq_file *m, void *p, loff_t *pos)
  {
aa9694bb7   Chris Down   mm, memcg: create...
1461
  	struct mem_cgroup *memcg = mem_cgroup_from_seq(m);
bc2791f85   Tejun Heo   slab: link memcg ...
1462
1463
1464
1465
1466
1467
1468
1469
  
  	return seq_list_next(p, &memcg->kmem_caches, pos);
  }
  
  void memcg_slab_stop(struct seq_file *m, void *p)
  {
  	mutex_unlock(&slab_mutex);
  }
b047501cd   Vladimir Davydov   memcg: use generi...
1470
1471
  int memcg_slab_show(struct seq_file *m, void *p)
  {
bc2791f85   Tejun Heo   slab: link memcg ...
1472
1473
  	struct kmem_cache *s = list_entry(p, struct kmem_cache,
  					  memcg_params.kmem_caches_node);
aa9694bb7   Chris Down   mm, memcg: create...
1474
  	struct mem_cgroup *memcg = mem_cgroup_from_seq(m);
b047501cd   Vladimir Davydov   memcg: use generi...
1475

bc2791f85   Tejun Heo   slab: link memcg ...
1476
  	if (p == memcg->kmem_caches.next)
b047501cd   Vladimir Davydov   memcg: use generi...
1477
  		print_slabinfo_header(m);
bc2791f85   Tejun Heo   slab: link memcg ...
1478
  	cache_show(s, m);
b047501cd   Vladimir Davydov   memcg: use generi...
1479
  	return 0;
749c54151   Glauber Costa   memcg: aggregate ...
1480
  }
b047501cd   Vladimir Davydov   memcg: use generi...
1481
  #endif
749c54151   Glauber Costa   memcg: aggregate ...
1482

b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
  /*
   * slabinfo_op - iterator that generates /proc/slabinfo
   *
   * Output layout:
   * cache-name
   * num-active-objs
   * total-objs
   * object size
   * num-active-slabs
   * total-slabs
   * num-pages-per-slab
   * + further values on SMP and with statistics enabled
   */
  static const struct seq_operations slabinfo_op = {
1df3b26f2   Vladimir Davydov   slab: print slabi...
1497
  	.start = slab_start,
276a2439c   Wanpeng Li   mm/slab: Give s_n...
1498
1499
  	.next = slab_next,
  	.stop = slab_stop,
1df3b26f2   Vladimir Davydov   slab: print slabi...
1500
  	.show = slab_show,
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
  };
  
  static int slabinfo_open(struct inode *inode, struct file *file)
  {
  	return seq_open(file, &slabinfo_op);
  }
  
  static const struct file_operations proc_slabinfo_operations = {
  	.open		= slabinfo_open,
  	.read		= seq_read,
  	.write          = slabinfo_write,
  	.llseek		= seq_lseek,
  	.release	= seq_release,
  };
  
  static int __init slab_proc_init(void)
  {
e9b4db2b8   Wanpeng Li   mm/slab: Fix /pro...
1518
1519
  	proc_create("slabinfo", SLABINFO_RIGHTS, NULL,
  						&proc_slabinfo_operations);
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
1520
1521
1522
  	return 0;
  }
  module_init(slab_proc_init);
fcf8a1e48   Waiman Long   mm, memcg: add a ...
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
  
  #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_MEMCG_KMEM)
  /*
   * Display information about kmem caches that have child memcg caches.
   */
  static int memcg_slabinfo_show(struct seq_file *m, void *unused)
  {
  	struct kmem_cache *s, *c;
  	struct slabinfo sinfo;
  
  	mutex_lock(&slab_mutex);
  	seq_puts(m, "# <name> <css_id[:dead|deact]> <active_objs> <num_objs>");
  	seq_puts(m, " <active_slabs> <num_slabs>
  ");
  	list_for_each_entry(s, &slab_root_caches, root_caches_node) {
  		/*
  		 * Skip kmem caches that don't have any memcg children.
  		 */
  		if (list_empty(&s->memcg_params.children))
  			continue;
  
  		memset(&sinfo, 0, sizeof(sinfo));
  		get_slabinfo(s, &sinfo);
  		seq_printf(m, "%-17s root       %6lu %6lu %6lu %6lu
  ",
  			   cache_name(s), sinfo.active_objs, sinfo.num_objs,
  			   sinfo.active_slabs, sinfo.num_slabs);
  
  		for_each_memcg_cache(c, s) {
  			struct cgroup_subsys_state *css;
  			char *status = "";
  
  			css = &c->memcg_params.memcg->css;
  			if (!(css->flags & CSS_ONLINE))
  				status = ":dead";
  			else if (c->flags & SLAB_DEACTIVATED)
  				status = ":deact";
  
  			memset(&sinfo, 0, sizeof(sinfo));
  			get_slabinfo(c, &sinfo);
  			seq_printf(m, "%-17s %4d%-6s %6lu %6lu %6lu %6lu
  ",
  				   cache_name(c), css->id, status,
  				   sinfo.active_objs, sinfo.num_objs,
  				   sinfo.active_slabs, sinfo.num_slabs);
  		}
  	}
  	mutex_unlock(&slab_mutex);
  	return 0;
  }
  DEFINE_SHOW_ATTRIBUTE(memcg_slabinfo);
  
  static int __init memcg_slabinfo_init(void)
  {
  	debugfs_create_file("memcg_slabinfo", S_IFREG | S_IRUGO,
  			    NULL, NULL, &memcg_slabinfo_fops);
  	return 0;
  }
  
  late_initcall(memcg_slabinfo_init);
  #endif /* CONFIG_DEBUG_FS && CONFIG_MEMCG_KMEM */
5b3657710   Yang Shi   mm: slabinfo: rem...
1584
  #endif /* CONFIG_SLAB || CONFIG_SLUB_DEBUG */
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1585
1586
1587
1588
1589
1590
1591
1592
1593
  
  static __always_inline void *__do_krealloc(const void *p, size_t new_size,
  					   gfp_t flags)
  {
  	void *ret;
  	size_t ks = 0;
  
  	if (p)
  		ks = ksize(p);
0316bec22   Andrey Ryabinin   mm: slub: add ker...
1594
  	if (ks >= new_size) {
0116523cf   Andrey Konovalov   kasan, mm: change...
1595
  		p = kasan_krealloc((void *)p, new_size, flags);
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1596
  		return (void *)p;
0316bec22   Andrey Ryabinin   mm: slub: add ker...
1597
  	}
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
  
  	ret = kmalloc_track_caller(new_size, flags);
  	if (ret && p)
  		memcpy(ret, p, ks);
  
  	return ret;
  }
  
  /**
   * __krealloc - like krealloc() but don't free @p.
   * @p: object to reallocate memory for.
   * @new_size: how many bytes of memory are required.
   * @flags: the type of memory to allocate.
   *
   * This function is like krealloc() except it never frees the originally
   * allocated buffer. Use this if you don't want to free the buffer immediately
   * like, for example, with RCU.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
1615
1616
   *
   * Return: pointer to the allocated memory or %NULL in case of error
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
   */
  void *__krealloc(const void *p, size_t new_size, gfp_t flags)
  {
  	if (unlikely(!new_size))
  		return ZERO_SIZE_PTR;
  
  	return __do_krealloc(p, new_size, flags);
  
  }
  EXPORT_SYMBOL(__krealloc);
  
  /**
   * krealloc - reallocate memory. The contents will remain unchanged.
   * @p: object to reallocate memory for.
   * @new_size: how many bytes of memory are required.
   * @flags: the type of memory to allocate.
   *
   * The contents of the object pointed to are preserved up to the
   * lesser of the new and old sizes.  If @p is %NULL, krealloc()
   * behaves exactly like kmalloc().  If @new_size is 0 and @p is not a
   * %NULL pointer, the object pointed to is freed.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
1638
1639
   *
   * Return: pointer to the allocated memory or %NULL in case of error
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
   */
  void *krealloc(const void *p, size_t new_size, gfp_t flags)
  {
  	void *ret;
  
  	if (unlikely(!new_size)) {
  		kfree(p);
  		return ZERO_SIZE_PTR;
  	}
  
  	ret = __do_krealloc(p, new_size, flags);
772a2fa50   Andrey Konovalov   kasan, mm: perfor...
1651
  	if (ret && kasan_reset_tag(p) != kasan_reset_tag(ret))
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
  		kfree(p);
  
  	return ret;
  }
  EXPORT_SYMBOL(krealloc);
  
  /**
   * kzfree - like kfree but zero memory
   * @p: object to free memory of
   *
   * The memory of the object @p points to is zeroed before freed.
   * If @p is %NULL, kzfree() does nothing.
   *
   * Note: this function zeroes the whole allocated buffer which can be a good
   * deal bigger than the requested buffer size passed to kmalloc(). So be
   * careful when using this function in performance sensitive code.
   */
  void kzfree(const void *p)
  {
  	size_t ks;
  	void *mem = (void *)p;
  
  	if (unlikely(ZERO_OR_NULL_PTR(mem)))
  		return;
  	ks = ksize(mem);
  	memset(mem, 0, ks);
  	kfree(mem);
  }
  EXPORT_SYMBOL(kzfree);
10d1f8cb3   Marco Elver   mm/slab: refactor...
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
  /**
   * ksize - get the actual amount of memory allocated for a given object
   * @objp: Pointer to the object
   *
   * kmalloc may internally round up allocations and return more memory
   * than requested. ksize() can be used to determine the actual amount of
   * memory allocated. The caller may use this additional memory, even though
   * a smaller amount of memory was initially specified with the kmalloc call.
   * The caller must guarantee that objp points to a valid object previously
   * allocated with either kmalloc() or kmem_cache_alloc(). The object
   * must not be freed during the duration of the call.
   *
   * Return: size of the actual memory used by @objp in bytes
   */
  size_t ksize(const void *objp)
  {
0d4ca4c9b   Marco Elver   mm/kasan: add obj...
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
  	size_t size;
  
  	if (WARN_ON_ONCE(!objp))
  		return 0;
  	/*
  	 * We need to check that the pointed to object is valid, and only then
  	 * unpoison the shadow memory below. We use __kasan_check_read(), to
  	 * generate a more useful report at the time ksize() is called (rather
  	 * than later where behaviour is undefined due to potential
  	 * use-after-free or double-free).
  	 *
  	 * If the pointed to memory is invalid we return 0, to avoid users of
  	 * ksize() writing to and potentially corrupting the memory region.
  	 *
  	 * We want to perform the check before __ksize(), to avoid potentially
  	 * crashing in __ksize() due to accessing invalid metadata.
  	 */
  	if (unlikely(objp == ZERO_SIZE_PTR) || !__kasan_check_read(objp, 1))
  		return 0;
  
  	size = __ksize(objp);
10d1f8cb3   Marco Elver   mm/slab: refactor...
1718
1719
1720
1721
1722
1723
1724
1725
  	/*
  	 * We assume that ksize callers could use whole allocated area,
  	 * so we need to unpoison this area.
  	 */
  	kasan_unpoison_shadow(objp, size);
  	return size;
  }
  EXPORT_SYMBOL(ksize);
928cec9cd   Andrey Ryabinin   mm: move slab rel...
1726
1727
1728
1729
1730
1731
1732
  /* Tracepoints definitions. */
  EXPORT_TRACEPOINT_SYMBOL(kmalloc);
  EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
  EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
  EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
  EXPORT_TRACEPOINT_SYMBOL(kfree);
  EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
4f6923fbb   Howard McLauchlan   mm: make should_f...
1733
1734
1735
1736
1737
1738
1739
1740
  
  int should_failslab(struct kmem_cache *s, gfp_t gfpflags)
  {
  	if (__should_failslab(s, gfpflags))
  		return -ENOMEM;
  	return 0;
  }
  ALLOW_ERROR_INJECTION(should_failslab, ERRNO);