Blame view

mm/slab.c 105 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /*
   * linux/mm/slab.c
   * Written by Mark Hemment, 1996/97.
   * (markhe@nextd.demon.co.uk)
   *
   * kmem_cache_destroy() + some cleanup - 1999 Andrea Arcangeli
   *
   * Major cleanup, different bufctl logic, per-cpu arrays
   *	(c) 2000 Manfred Spraul
   *
   * Cleanup, make the head arrays unconditional, preparation for NUMA
   * 	(c) 2002 Manfred Spraul
   *
   * An implementation of the Slab Allocator as described in outline in;
   *	UNIX Internals: The New Frontiers by Uresh Vahalia
   *	Pub: Prentice Hall	ISBN 0-13-101908-2
   * or with a little more detail in;
   *	The Slab Allocator: An Object-Caching Kernel Memory Allocator
   *	Jeff Bonwick (Sun Microsystems).
   *	Presented at: USENIX Summer 1994 Technical Conference
   *
   * The memory is organized in caches, one cache for each object type.
   * (e.g. inode_cache, dentry_cache, buffer_head, vm_area_struct)
   * Each cache consists out of many slabs (they are small (usually one
   * page long) and always contiguous), and each slab contains multiple
   * initialized objects.
   *
   * This means, that your constructor is used only for newly allocated
183ff22bb   Simon Arlott   spelling fixes: mm/
30
   * slabs and you must pass objects with the same initializations to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
   * kmem_cache_free.
   *
   * Each cache can only support one memory type (GFP_DMA, GFP_HIGHMEM,
   * normal). If you need a special memory type, then must create a new
   * cache for that memory type.
   *
   * In order to reduce fragmentation, the slabs are sorted in 3 groups:
   *   full slabs with 0 free objects
   *   partial slabs
   *   empty slabs with no allocated objects
   *
   * If partial slabs exist, then new allocations come from these slabs,
   * otherwise from empty slabs or new slabs are allocated.
   *
   * kmem_cache_destroy() CAN CRASH if you try to allocate from the cache
   * during kmem_cache_destroy(). The caller must prevent concurrent allocs.
   *
   * Each cache has a short per-cpu head array, most allocs
   * and frees go into that array, and if that array overflows, then 1/2
   * of the entries in the array are given back into the global cache.
   * The head array is strictly LIFO and should improve the cache hit rates.
   * On SMP, it additionally reduces the spinlock operations.
   *
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
54
   * The c_cpuarray may not be read with enabled local interrupts -
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
   * it's changed with a smp_call_function().
   *
   * SMP synchronization:
   *  constructors and destructors are called without any locking.
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
59
   *  Several members in struct kmem_cache and struct slab never change, they
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
69
70
71
   *	are accessed without any locking.
   *  The per-cpu arrays are never accessed from the wrong cpu, no locking,
   *  	and local interrupts are disabled so slab code is preempt-safe.
   *  The non-constant members are protected with a per-cache irq spinlock.
   *
   * Many thanks to Mark Hemment, who wrote another per-cpu slab patch
   * in 2000 - many ideas in the current implementation are derived from
   * his patch.
   *
   * Further notes from the original documentation:
   *
   * 11 April '97.  Started multi-threading - markhe
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
72
   *	The global cache-chain is protected by the mutex 'slab_mutex'.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
75
76
77
78
   *	The sem is only needed when accessing/extending the cache-chain, which
   *	can never happen inside an interrupt (kmem_cache_create(),
   *	kmem_cache_shrink() and kmem_cache_reap()).
   *
   *	At present, each engine can be growing a cache.  This should be blocked.
   *
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
79
80
81
82
83
84
85
86
87
   * 15 March 2005. NUMA slab allocator.
   *	Shai Fultheim <shai@scalex86.org>.
   *	Shobhit Dayal <shobhit@calsoftinc.com>
   *	Alok N Kataria <alokk@calsoftinc.com>
   *	Christoph Lameter <christoph@lameter.com>
   *
   *	Modified the slab allocator to be node aware on NUMA systems.
   *	Each node has its own list of partial, free and full slabs.
   *	All object allocations for a node occur from node specific slab lists.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
  #include	<linux/slab.h>
  #include	<linux/mm.h>
c9cf55285   Randy Dunlap   [PATCH] add poiso...
91
  #include	<linux/poison.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
  #include	<linux/swap.h>
  #include	<linux/cache.h>
  #include	<linux/interrupt.h>
  #include	<linux/init.h>
  #include	<linux/compiler.h>
101a50019   Paul Jackson   [PATCH] cpuset me...
97
  #include	<linux/cpuset.h>
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
98
  #include	<linux/proc_fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
102
103
104
105
  #include	<linux/seq_file.h>
  #include	<linux/notifier.h>
  #include	<linux/kallsyms.h>
  #include	<linux/cpu.h>
  #include	<linux/sysctl.h>
  #include	<linux/module.h>
  #include	<linux/rcupdate.h>
543537bd9   Paulo Marques   [PATCH] create a ...
106
  #include	<linux/string.h>
138ae6631   Andrew Morton   [PATCH] slab: use...
107
  #include	<linux/uaccess.h>
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
108
  #include	<linux/nodemask.h>
d5cff6352   Catalin Marinas   kmemleak: Add the...
109
  #include	<linux/kmemleak.h>
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
110
  #include	<linux/mempolicy.h>
fc0abb145   Ingo Molnar   [PATCH] sem2mutex...
111
  #include	<linux/mutex.h>
8a8b6502f   Akinobu Mita   [PATCH] fault-inj...
112
  #include	<linux/fault-inject.h>
e7eebaf6a   Ingo Molnar   [PATCH] pi-futex:...
113
  #include	<linux/rtmutex.h>
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
114
  #include	<linux/reciprocal_div.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
115
  #include	<linux/debugobjects.h>
8f9f8d9e8   David Rientjes   slab: add memory ...
116
  #include	<linux/memory.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
117
  #include	<linux/prefetch.h>
3f8c24529   Ingo Molnar   sched/headers: Pr...
118
  #include	<linux/sched/task_stack.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119

381760ead   Mel Gorman   mm: micro-optimis...
120
  #include	<net/sock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
  #include	<asm/cacheflush.h>
  #include	<asm/tlbflush.h>
  #include	<asm/page.h>
4dee6b64e   Steven Rostedt   tracing/mm: Move ...
124
  #include <trace/events/kmem.h>
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
125
  #include	"internal.h"
b9ce5ef49   Glauber Costa   sl[au]b: always g...
126
  #include	"slab.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  /*
50953fe9e   Christoph Lameter   slab allocators: ...
128
   * DEBUG	- 1 for kmem_cache_create() to honour; SLAB_RED_ZONE & SLAB_POISON.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
   *		  0 for faster, smaller code (especially in the critical paths).
   *
   * STATS	- 1 to collect stats for /proc/slabinfo.
   *		  0 for faster, smaller code (especially in the critical paths).
   *
   * FORCED_DEBUG	- 1 enables SLAB_RED_ZONE and SLAB_POISON (if possible)
   */
  
  #ifdef CONFIG_DEBUG_SLAB
  #define	DEBUG		1
  #define	STATS		1
  #define	FORCED_DEBUG	1
  #else
  #define	DEBUG		0
  #define	STATS		0
  #define	FORCED_DEBUG	0
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
  /* Shouldn't this be in a header file somewhere? */
  #define	BYTES_PER_WORD		sizeof(void *)
87a927c71   David Woodhouse   Fix slab redzone ...
148
  #define	REDZONE_ALIGN		max(BYTES_PER_WORD, __alignof__(unsigned long long))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
  #ifndef ARCH_KMALLOC_FLAGS
  #define ARCH_KMALLOC_FLAGS SLAB_HWCACHE_ALIGN
  #endif
f315e3fa1   Joonsoo Kim   slab: restrict th...
153
154
155
156
157
158
159
160
  #define FREELIST_BYTE_INDEX (((PAGE_SIZE >> BITS_PER_BYTE) \
  				<= SLAB_OBJ_MIN_SIZE) ? 1 : 0)
  
  #if FREELIST_BYTE_INDEX
  typedef unsigned char freelist_idx_t;
  #else
  typedef unsigned short freelist_idx_t;
  #endif
30321c7b6   David Miller   slab: Fix off by ...
161
  #define SLAB_OBJ_MAX_NUM ((1 << sizeof(freelist_idx_t) * BITS_PER_BYTE) - 1)
f315e3fa1   Joonsoo Kim   slab: restrict th...
162

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
163
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
   * struct array_cache
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
170
171
172
173
174
175
176
177
178
179
   * Purpose:
   * - LIFO ordering, to hand out cache-warm objects from _alloc
   * - reduce the number of linked list operations
   * - reduce spinlock operations
   *
   * The limit is stored in the per-cpu structure to reduce the data cache
   * footprint.
   *
   */
  struct array_cache {
  	unsigned int avail;
  	unsigned int limit;
  	unsigned int batchcount;
  	unsigned int touched;
bda5b655f   Robert P. J. Day   Delete gcc-2.95 c...
180
  	void *entry[];	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
181
182
183
  			 * Must have this definition in here for the proper
  			 * alignment of array_cache. Also simplifies accessing
  			 * the entries.
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
184
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
  };
c8522a3a5   Joonsoo Kim   slab: introduce a...
186
187
188
189
  struct alien_cache {
  	spinlock_t lock;
  	struct array_cache ac;
  };
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
190
  /*
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
191
192
   * Need this for bootstrapping a per node allocator.
   */
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
193
  #define NUM_INIT_LISTS (2 * MAX_NUMNODES)
ce8eb6c42   Christoph Lameter   slab: Rename list...
194
  static struct kmem_cache_node __initdata init_kmem_cache_node[NUM_INIT_LISTS];
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
195
  #define	CACHE_CACHE 0
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
196
  #define	SIZE_NODE (MAX_NUMNODES)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
197

ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
198
  static int drain_freelist(struct kmem_cache *cache,
ce8eb6c42   Christoph Lameter   slab: Rename list...
199
  			struct kmem_cache_node *n, int tofree);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
200
  static void free_block(struct kmem_cache *cachep, void **objpp, int len,
97654dfa2   Joonsoo Kim   slab: defer slab_...
201
202
  			int node, struct list_head *list);
  static void slabs_destroy(struct kmem_cache *cachep, struct list_head *list);
83b519e8b   Pekka Enberg   slab: setup alloc...
203
  static int enable_cpucache(struct kmem_cache *cachep, gfp_t gfp);
65f27f384   David Howells   WorkStruct: Pass ...
204
  static void cache_reap(struct work_struct *unused);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
205

76b342bdc   Joonsoo Kim   mm/slab: separate...
206
207
208
209
210
  static inline void fixup_objfreelist_debug(struct kmem_cache *cachep,
  						void **list);
  static inline void fixup_slab_list(struct kmem_cache *cachep,
  				struct kmem_cache_node *n, struct page *page,
  				void **list);
e0a427267   Ingo Molnar   [PATCH] mm/slab.c...
211
  static int slab_early_init = 1;
ce8eb6c42   Christoph Lameter   slab: Rename list...
212
  #define INDEX_NODE kmalloc_index(sizeof(struct kmem_cache_node))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213

ce8eb6c42   Christoph Lameter   slab: Rename list...
214
  static void kmem_cache_node_init(struct kmem_cache_node *parent)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
215
216
217
218
  {
  	INIT_LIST_HEAD(&parent->slabs_full);
  	INIT_LIST_HEAD(&parent->slabs_partial);
  	INIT_LIST_HEAD(&parent->slabs_free);
bf00bd345   David Rientjes   mm, slab: maintai...
219
  	parent->total_slabs = 0;
f728b0a5d   Greg Thelen   mm, slab: faster ...
220
  	parent->free_slabs = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
221
222
  	parent->shared = NULL;
  	parent->alien = NULL;
2e1217cf9   Ravikiran G Thirumalai   [PATCH] NUMA slab...
223
  	parent->colour_next = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
224
225
226
227
  	spin_lock_init(&parent->list_lock);
  	parent->free_objects = 0;
  	parent->free_touched = 0;
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
228
229
230
  #define MAKE_LIST(cachep, listp, slab, nodeid)				\
  	do {								\
  		INIT_LIST_HEAD(listp);					\
18bf85411   Christoph Lameter   slab: use get_nod...
231
  		list_splice(&get_node(cachep, nodeid)->slab, listp);	\
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
232
  	} while (0)
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
233
234
  #define	MAKE_ALL_LISTS(cachep, ptr, nodeid)				\
  	do {								\
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
235
236
237
238
  	MAKE_LIST((cachep), (&(ptr)->slabs_full), slabs_full, nodeid);	\
  	MAKE_LIST((cachep), (&(ptr)->slabs_partial), slabs_partial, nodeid); \
  	MAKE_LIST((cachep), (&(ptr)->slabs_free), slabs_free, nodeid);	\
  	} while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239

4fd0b46e8   Alexey Dobriyan   slab, slub, slob:...
240
241
  #define CFLGS_OBJFREELIST_SLAB	((slab_flags_t __force)0x40000000U)
  #define CFLGS_OFF_SLAB		((slab_flags_t __force)0x80000000U)
b03a017be   Joonsoo Kim   mm/slab: introduc...
242
  #define	OBJFREELIST_SLAB(x)	((x)->flags & CFLGS_OBJFREELIST_SLAB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
244
245
  #define	OFF_SLAB(x)	((x)->flags & CFLGS_OFF_SLAB)
  
  #define BATCHREFILL_LIMIT	16
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
246
247
248
  /*
   * Optimization question: fewer reaps means less probability for unnessary
   * cpucache drain/refill cycles.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
   *
dc6f3f276   Adrian Bunk   mm/slab.c: fix a ...
250
   * OTOH the cpuarrays can contain lots of objects,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
   * which could lock up otherwise freeable slabs.
   */
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
253
254
  #define REAPTIMEOUT_AC		(2*HZ)
  #define REAPTIMEOUT_NODE	(4*HZ)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
258
259
260
  
  #if STATS
  #define	STATS_INC_ACTIVE(x)	((x)->num_active++)
  #define	STATS_DEC_ACTIVE(x)	((x)->num_active--)
  #define	STATS_INC_ALLOCED(x)	((x)->num_allocations++)
  #define	STATS_INC_GROWN(x)	((x)->grown++)
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
261
  #define	STATS_ADD_REAPED(x,y)	((x)->reaped += (y))
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
262
263
264
265
266
  #define	STATS_SET_HIGH(x)						\
  	do {								\
  		if ((x)->num_active > (x)->high_mark)			\
  			(x)->high_mark = (x)->num_active;		\
  	} while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
268
  #define	STATS_INC_ERR(x)	((x)->errors++)
  #define	STATS_INC_NODEALLOCS(x)	((x)->node_allocs++)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
269
  #define	STATS_INC_NODEFREES(x)	((x)->node_frees++)
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
270
  #define STATS_INC_ACOVERFLOW(x)   ((x)->node_overflow++)
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
271
272
273
274
275
  #define	STATS_SET_FREEABLE(x, i)					\
  	do {								\
  		if ((x)->max_freeable < i)				\
  			(x)->max_freeable = i;				\
  	} while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
279
280
281
282
283
284
  #define STATS_INC_ALLOCHIT(x)	atomic_inc(&(x)->allochit)
  #define STATS_INC_ALLOCMISS(x)	atomic_inc(&(x)->allocmiss)
  #define STATS_INC_FREEHIT(x)	atomic_inc(&(x)->freehit)
  #define STATS_INC_FREEMISS(x)	atomic_inc(&(x)->freemiss)
  #else
  #define	STATS_INC_ACTIVE(x)	do { } while (0)
  #define	STATS_DEC_ACTIVE(x)	do { } while (0)
  #define	STATS_INC_ALLOCED(x)	do { } while (0)
  #define	STATS_INC_GROWN(x)	do { } while (0)
4e60c86bd   Andi Kleen   gcc-4.6: mm: fix ...
285
  #define	STATS_ADD_REAPED(x,y)	do { (void)(y); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
288
  #define	STATS_SET_HIGH(x)	do { } while (0)
  #define	STATS_INC_ERR(x)	do { } while (0)
  #define	STATS_INC_NODEALLOCS(x)	do { } while (0)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
289
  #define	STATS_INC_NODEFREES(x)	do { } while (0)
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
290
  #define STATS_INC_ACOVERFLOW(x)   do { } while (0)
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
291
  #define	STATS_SET_FREEABLE(x, i) do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
294
295
296
297
298
  #define STATS_INC_ALLOCHIT(x)	do { } while (0)
  #define STATS_INC_ALLOCMISS(x)	do { } while (0)
  #define STATS_INC_FREEHIT(x)	do { } while (0)
  #define STATS_INC_FREEMISS(x)	do { } while (0)
  #endif
  
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
300
301
  /*
   * memory layout of objects:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
   * 0		: objp
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
303
   * 0 .. cachep->obj_offset - BYTES_PER_WORD - 1: padding. This ensures that
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
   * 		the end of an object is aligned with the end of the real
   * 		allocation. Catches writes behind the end of the allocation.
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
306
   * cachep->obj_offset - BYTES_PER_WORD .. cachep->obj_offset - 1:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
   * 		redzone word.
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
308
   * cachep->obj_offset: The real object.
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
309
310
   * cachep->size - 2* BYTES_PER_WORD: redzone word [BYTES_PER_WORD long]
   * cachep->size - 1* BYTES_PER_WORD: last caller address
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
311
   *					[BYTES_PER_WORD long]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
313
  static int obj_offset(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  {
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
315
  	return cachep->obj_offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
  }
b46b8f19c   David Woodhouse   Increase slab red...
317
  static unsigned long long *dbg_redzone1(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
b46b8f19c   David Woodhouse   Increase slab red...
320
321
  	return (unsigned long long*) (objp + obj_offset(cachep) -
  				      sizeof(unsigned long long));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
  }
b46b8f19c   David Woodhouse   Increase slab red...
323
  static unsigned long long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
326
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
  	if (cachep->flags & SLAB_STORE_USER)
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
327
  		return (unsigned long long *)(objp + cachep->size -
b46b8f19c   David Woodhouse   Increase slab red...
328
  					      sizeof(unsigned long long) -
87a927c71   David Woodhouse   Fix slab redzone ...
329
  					      REDZONE_ALIGN);
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
330
  	return (unsigned long long *) (objp + cachep->size -
b46b8f19c   David Woodhouse   Increase slab red...
331
  				       sizeof(unsigned long long));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
333
  static void **dbg_userword(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
334
335
  {
  	BUG_ON(!(cachep->flags & SLAB_STORE_USER));
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
336
  	return (void **)(objp + cachep->size - BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
  }
  
  #else
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
340
  #define obj_offset(x)			0
b46b8f19c   David Woodhouse   Increase slab red...
341
342
  #define dbg_redzone1(cachep, objp)	({BUG(); (unsigned long long *)NULL;})
  #define dbg_redzone2(cachep, objp)	({BUG(); (unsigned long long *)NULL;})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
344
345
346
347
  #define dbg_userword(cachep, objp)	({BUG(); (void **)NULL;})
  
  #endif
  
  /*
3df1cccdf   David Rientjes   slab: introduce s...
348
349
   * Do not go above this order unless 0 objects fit into the slab or
   * overridden on the command line.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
   */
543585cc5   David Rientjes   slab: rename slab...
351
352
353
  #define	SLAB_MAX_ORDER_HI	1
  #define	SLAB_MAX_ORDER_LO	0
  static int slab_max_order = SLAB_MAX_ORDER_LO;
3df1cccdf   David Rientjes   slab: introduce s...
354
  static bool slab_max_order_set __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355

8456a648c   Joonsoo Kim   slab: use struct ...
356
  static inline void *index_to_obj(struct kmem_cache *cache, struct page *page,
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
357
358
  				 unsigned int idx)
  {
8456a648c   Joonsoo Kim   slab: use struct ...
359
  	return page->s_mem + cache->size * idx;
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
360
  }
6fb924304   Joonsoo Kim   mm/slab: remove u...
361
  #define BOOT_CPUCACHE_ENTRIES	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
  /* internal cache of cache description objs */
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
363
  static struct kmem_cache kmem_cache_boot = {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
364
365
366
  	.batchcount = 1,
  	.limit = BOOT_CPUCACHE_ENTRIES,
  	.shared = 1,
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
367
  	.size = sizeof(struct kmem_cache),
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
368
  	.name = "kmem_cache",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
  };
1871e52c7   Tejun Heo   percpu: make perc...
370
  static DEFINE_PER_CPU(struct delayed_work, slab_reap_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
372
  static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
374
  	return this_cpu_ptr(cachep->cpu_cache);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
376
377
378
  /*
   * Calculate the number of objects and left-over bytes for a given buffer size.
   */
70f75067b   Joonsoo Kim   mm/slab: avoid re...
379
  static unsigned int cache_estimate(unsigned long gfporder, size_t buffer_size,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
380
  		slab_flags_t flags, size_t *left_over)
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
381
  {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
382
  	unsigned int num;
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
383
  	size_t slab_size = PAGE_SIZE << gfporder;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384

fbaccacff   Steven Rostedt   [PATCH] slab: cac...
385
386
387
388
389
  	/*
  	 * The slab management structure can be either off the slab or
  	 * on it. For the latter case, the memory allocated for a
  	 * slab is used for:
  	 *
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
390
  	 * - @buffer_size bytes for each object
2e6b36021   Joonsoo Kim   mm/slab: put the ...
391
392
393
394
395
  	 * - One freelist_idx_t for each object
  	 *
  	 * We don't need to consider alignment of freelist because
  	 * freelist will be at the end of slab page. The objects will be
  	 * at the correct alignment.
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
396
397
398
399
400
401
  	 *
  	 * If the slab management structure is off the slab, then the
  	 * alignment will already be calculated into the size. Because
  	 * the slabs are all pages aligned, the objects will be at the
  	 * correct alignment when allocated.
  	 */
b03a017be   Joonsoo Kim   mm/slab: introduc...
402
  	if (flags & (CFLGS_OBJFREELIST_SLAB | CFLGS_OFF_SLAB)) {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
403
  		num = slab_size / buffer_size;
2e6b36021   Joonsoo Kim   mm/slab: put the ...
404
  		*left_over = slab_size % buffer_size;
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
405
  	} else {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
406
  		num = slab_size / (buffer_size + sizeof(freelist_idx_t));
2e6b36021   Joonsoo Kim   mm/slab: put the ...
407
408
  		*left_over = slab_size %
  			(buffer_size + sizeof(freelist_idx_t));
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
409
  	}
70f75067b   Joonsoo Kim   mm/slab: avoid re...
410
411
  
  	return num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
412
  }
f28510d30   Christoph Lameter   slab: Only define...
413
  #if DEBUG
d40cee245   Harvey Harrison   mm: remove remain...
414
  #define slab_error(cachep, msg) __slab_error(__func__, cachep, msg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
416
417
  static void __slab_error(const char *function, struct kmem_cache *cachep,
  			char *msg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
  {
1170532bb   Joe Perches   mm: convert print...
419
420
  	pr_err("slab error in %s(): cache `%s': %s
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
421
  	       function, cachep->name, msg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
  	dump_stack();
373d4d099   Rusty Russell   taint: add explic...
423
  	add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
  }
f28510d30   Christoph Lameter   slab: Only define...
425
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426

3395ee058   Paul Menage   [PATCH] mm: add n...
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
  /*
   * By default on NUMA we use alien caches to stage the freeing of
   * objects allocated from other nodes. This causes massive memory
   * inefficiencies when using fake NUMA setup to split memory into a
   * large number of small nodes, so it can be disabled on the command
   * line
    */
  
  static int use_alien_caches __read_mostly = 1;
  static int __init noaliencache_setup(char *s)
  {
  	use_alien_caches = 0;
  	return 1;
  }
  __setup("noaliencache", noaliencache_setup);
3df1cccdf   David Rientjes   slab: introduce s...
442
443
444
445
446
447
448
449
450
451
  static int __init slab_max_order_setup(char *str)
  {
  	get_option(&str, &slab_max_order);
  	slab_max_order = slab_max_order < 0 ? 0 :
  				min(slab_max_order, MAX_ORDER - 1);
  	slab_max_order_set = true;
  
  	return 1;
  }
  __setup("slab_max_order=", slab_max_order_setup);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
452
453
454
455
456
457
458
  #ifdef CONFIG_NUMA
  /*
   * Special reaping functions for NUMA systems called from cache_reap().
   * These take care of doing round robin flushing of alien caches (containing
   * objects freed on different nodes from which they were allocated) and the
   * flushing of remote pcps by calling drain_node_pages.
   */
1871e52c7   Tejun Heo   percpu: make perc...
459
  static DEFINE_PER_CPU(unsigned long, slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
460
461
462
  
  static void init_reap_node(int cpu)
  {
0edaf86cf   Andrew Morton   include/linux/nod...
463
464
  	per_cpu(slab_reap_node, cpu) = next_node_in(cpu_to_mem(cpu),
  						    node_online_map);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
465
466
467
468
  }
  
  static void next_reap_node(void)
  {
909ea9646   Christoph Lameter   core: Replace __g...
469
  	int node = __this_cpu_read(slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
470

0edaf86cf   Andrew Morton   include/linux/nod...
471
  	node = next_node_in(node, node_online_map);
909ea9646   Christoph Lameter   core: Replace __g...
472
  	__this_cpu_write(slab_reap_node, node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
473
474
475
476
477
478
  }
  
  #else
  #define init_reap_node(cpu) do { } while (0)
  #define next_reap_node(void) do { } while (0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479
480
481
482
483
484
485
  /*
   * Initiate the reap timer running on the target CPU.  We run at around 1 to 2Hz
   * via the workqueue/eventd.
   * Add the CPU number into the expiration time to minimize the possibility of
   * the CPUs getting into lockstep and contending for the global cache chain
   * lock.
   */
0db0628d9   Paul Gortmaker   kernel: delete __...
486
  static void start_cpu_timer(int cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
487
  {
1871e52c7   Tejun Heo   percpu: make perc...
488
  	struct delayed_work *reap_work = &per_cpu(slab_reap_work, cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
489

eac0337af   Tejun Heo   slab, workqueue: ...
490
  	if (reap_work->work.func == NULL) {
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
491
  		init_reap_node(cpu);
203b42f73   Tejun Heo   workqueue: make d...
492
  		INIT_DEFERRABLE_WORK(reap_work, cache_reap);
2b2842146   Arjan van de Ven   [PATCH] user of t...
493
494
  		schedule_delayed_work_on(cpu, reap_work,
  					__round_jiffies_relative(HZ, cpu));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
496
  	}
  }
1fe00d50a   Joonsoo Kim   slab: factor out ...
497
  static void init_arraycache(struct array_cache *ac, int limit, int batch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
498
  {
1fe00d50a   Joonsoo Kim   slab: factor out ...
499
500
501
502
503
  	if (ac) {
  		ac->avail = 0;
  		ac->limit = limit;
  		ac->batchcount = batch;
  		ac->touched = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
504
  	}
1fe00d50a   Joonsoo Kim   slab: factor out ...
505
506
507
508
509
  }
  
  static struct array_cache *alloc_arraycache(int node, int entries,
  					    int batchcount, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
510
  	size_t memsize = sizeof(void *) * entries + sizeof(struct array_cache);
1fe00d50a   Joonsoo Kim   slab: factor out ...
511
512
513
  	struct array_cache *ac = NULL;
  
  	ac = kmalloc_node(memsize, gfp, node);
92d1d07da   Qian Cai   mm/slab.c: kmemle...
514
515
516
517
518
519
520
521
  	/*
  	 * The array_cache structures contain pointers to free object.
  	 * However, when such objects are allocated or transferred to another
  	 * cache the pointers are not cleared and they could be counted as
  	 * valid references during a kmemleak scan. Therefore, kmemleak must
  	 * not scan such objects.
  	 */
  	kmemleak_no_scan(ac);
1fe00d50a   Joonsoo Kim   slab: factor out ...
522
523
  	init_arraycache(ac, entries, batchcount);
  	return ac;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
525
526
  static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep,
  					struct page *page, void *objp)
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
527
  {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
528
529
530
  	struct kmem_cache_node *n;
  	int page_node;
  	LIST_HEAD(list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
531

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
532
533
  	page_node = page_to_nid(page);
  	n = get_node(cachep, page_node);
381760ead   Mel Gorman   mm: micro-optimis...
534

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
535
536
537
  	spin_lock(&n->list_lock);
  	free_block(cachep, &objp, 1, page_node, &list);
  	spin_unlock(&n->list_lock);
381760ead   Mel Gorman   mm: micro-optimis...
538

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
539
  	slabs_destroy(cachep, &list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
540
  }
3ded175a4   Christoph Lameter   [PATCH] slab: add...
541
542
543
544
545
546
547
548
549
550
  /*
   * Transfer objects in one arraycache to another.
   * Locking must be handled by the caller.
   *
   * Return the number of entries transferred.
   */
  static int transfer_objects(struct array_cache *to,
  		struct array_cache *from, unsigned int max)
  {
  	/* Figure out how many entries to transfer */
732eacc05   Hagen Paul Pfeifer   replace nested ma...
551
  	int nr = min3(from->avail, max, to->limit - to->avail);
3ded175a4   Christoph Lameter   [PATCH] slab: add...
552
553
554
555
556
557
558
559
560
  
  	if (!nr)
  		return 0;
  
  	memcpy(to->entry + to->avail, from->entry + from->avail -nr,
  			sizeof(void *) *nr);
  
  	from->avail -= nr;
  	to->avail += nr;
3ded175a4   Christoph Lameter   [PATCH] slab: add...
561
562
  	return nr;
  }
dabc3e291   Kees Cook   mm/slab: add naiv...
563
564
565
566
567
568
569
570
571
  /* &alien->lock must be held by alien callers. */
  static __always_inline void __free_one(struct array_cache *ac, void *objp)
  {
  	/* Avoid trivial double-free. */
  	if (IS_ENABLED(CONFIG_SLAB_FREELIST_HARDENED) &&
  	    WARN_ON_ONCE(ac->avail > 0 && ac->entry[ac->avail - 1] == objp))
  		return;
  	ac->entry[ac->avail++] = objp;
  }
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
572
573
574
  #ifndef CONFIG_NUMA
  
  #define drain_alien_cache(cachep, alien) do { } while (0)
ce8eb6c42   Christoph Lameter   slab: Rename list...
575
  #define reap_alien(cachep, n) do { } while (0)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
576

c8522a3a5   Joonsoo Kim   slab: introduce a...
577
578
  static inline struct alien_cache **alloc_alien_cache(int node,
  						int limit, gfp_t gfp)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
579
  {
8888177ea   Joonsoo Kim   mm/slab: remove B...
580
  	return NULL;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
581
  }
c8522a3a5   Joonsoo Kim   slab: introduce a...
582
  static inline void free_alien_cache(struct alien_cache **ac_ptr)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
583
584
585
586
587
588
589
590
591
592
593
594
595
  {
  }
  
  static inline int cache_free_alien(struct kmem_cache *cachep, void *objp)
  {
  	return 0;
  }
  
  static inline void *alternate_node_alloc(struct kmem_cache *cachep,
  		gfp_t flags)
  {
  	return NULL;
  }
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
596
  static inline void *____cache_alloc_node(struct kmem_cache *cachep,
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
597
598
599
600
  		 gfp_t flags, int nodeid)
  {
  	return NULL;
  }
4167e9b2c   David Rientjes   mm: remove GFP_TH...
601
602
  static inline gfp_t gfp_exact_node(gfp_t flags)
  {
444eb2a44   Mel Gorman   mm: thp: set THP ...
603
  	return flags & ~__GFP_NOFAIL;
4167e9b2c   David Rientjes   mm: remove GFP_TH...
604
  }
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
605
  #else	/* CONFIG_NUMA */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
606
  static void *____cache_alloc_node(struct kmem_cache *, gfp_t, int);
c61afb181   Paul Jackson   [PATCH] cpuset me...
607
  static void *alternate_node_alloc(struct kmem_cache *, gfp_t);
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
608

c8522a3a5   Joonsoo Kim   slab: introduce a...
609
610
611
  static struct alien_cache *__alloc_alien_cache(int node, int entries,
  						int batch, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
612
  	size_t memsize = sizeof(void *) * entries + sizeof(struct alien_cache);
c8522a3a5   Joonsoo Kim   slab: introduce a...
613
614
615
  	struct alien_cache *alc = NULL;
  
  	alc = kmalloc_node(memsize, gfp, node);
09c2e76ed   Christoph Lameter   slab: alien cache...
616
  	if (alc) {
92d1d07da   Qian Cai   mm/slab.c: kmemle...
617
  		kmemleak_no_scan(alc);
09c2e76ed   Christoph Lameter   slab: alien cache...
618
619
620
  		init_arraycache(&alc->ac, entries, batch);
  		spin_lock_init(&alc->lock);
  	}
c8522a3a5   Joonsoo Kim   slab: introduce a...
621
622
623
624
  	return alc;
  }
  
  static struct alien_cache **alloc_alien_cache(int node, int limit, gfp_t gfp)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
625
  {
c8522a3a5   Joonsoo Kim   slab: introduce a...
626
  	struct alien_cache **alc_ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
627
628
629
630
  	int i;
  
  	if (limit > 1)
  		limit = 12;
b9726c26d   Alexey Dobriyan   numa: make "nr_no...
631
  	alc_ptr = kcalloc_node(nr_node_ids, sizeof(void *), gfp, node);
c8522a3a5   Joonsoo Kim   slab: introduce a...
632
633
634
635
636
637
638
639
640
641
642
643
  	if (!alc_ptr)
  		return NULL;
  
  	for_each_node(i) {
  		if (i == node || !node_online(i))
  			continue;
  		alc_ptr[i] = __alloc_alien_cache(node, limit, 0xbaadf00d, gfp);
  		if (!alc_ptr[i]) {
  			for (i--; i >= 0; i--)
  				kfree(alc_ptr[i]);
  			kfree(alc_ptr);
  			return NULL;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
644
645
  		}
  	}
c8522a3a5   Joonsoo Kim   slab: introduce a...
646
  	return alc_ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
647
  }
c8522a3a5   Joonsoo Kim   slab: introduce a...
648
  static void free_alien_cache(struct alien_cache **alc_ptr)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
649
650
  {
  	int i;
c8522a3a5   Joonsoo Kim   slab: introduce a...
651
  	if (!alc_ptr)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
652
  		return;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
653
  	for_each_node(i)
c8522a3a5   Joonsoo Kim   slab: introduce a...
654
655
  	    kfree(alc_ptr[i]);
  	kfree(alc_ptr);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
656
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
657
  static void __drain_alien_cache(struct kmem_cache *cachep,
833b706cc   Joonsoo Kim   slab: destroy a s...
658
659
  				struct array_cache *ac, int node,
  				struct list_head *list)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
660
  {
18bf85411   Christoph Lameter   slab: use get_nod...
661
  	struct kmem_cache_node *n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
662
663
  
  	if (ac->avail) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
664
  		spin_lock(&n->list_lock);
e00946fe2   Christoph Lameter   [PATCH] slab: Byp...
665
666
667
668
669
  		/*
  		 * Stuff objects into the remote nodes shared array first.
  		 * That way we could avoid the overhead of putting the objects
  		 * into the free lists and getting them back later.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
670
671
  		if (n->shared)
  			transfer_objects(n->shared, ac, ac->limit);
e00946fe2   Christoph Lameter   [PATCH] slab: Byp...
672

833b706cc   Joonsoo Kim   slab: destroy a s...
673
  		free_block(cachep, ac->entry, ac->avail, node, list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
674
  		ac->avail = 0;
ce8eb6c42   Christoph Lameter   slab: Rename list...
675
  		spin_unlock(&n->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
676
677
  	}
  }
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
678
679
680
  /*
   * Called from cache_reap() to regularly drain alien caches round robin.
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
681
  static void reap_alien(struct kmem_cache *cachep, struct kmem_cache_node *n)
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
682
  {
909ea9646   Christoph Lameter   core: Replace __g...
683
  	int node = __this_cpu_read(slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
684

ce8eb6c42   Christoph Lameter   slab: Rename list...
685
  	if (n->alien) {
c8522a3a5   Joonsoo Kim   slab: introduce a...
686
687
688
689
690
  		struct alien_cache *alc = n->alien[node];
  		struct array_cache *ac;
  
  		if (alc) {
  			ac = &alc->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
691
  			if (ac->avail && spin_trylock_irq(&alc->lock)) {
833b706cc   Joonsoo Kim   slab: destroy a s...
692
693
694
  				LIST_HEAD(list);
  
  				__drain_alien_cache(cachep, ac, node, &list);
49dfc304b   Joonsoo Kim   slab: use the loc...
695
  				spin_unlock_irq(&alc->lock);
833b706cc   Joonsoo Kim   slab: destroy a s...
696
  				slabs_destroy(cachep, &list);
c8522a3a5   Joonsoo Kim   slab: introduce a...
697
  			}
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
698
699
700
  		}
  	}
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
701
  static void drain_alien_cache(struct kmem_cache *cachep,
c8522a3a5   Joonsoo Kim   slab: introduce a...
702
  				struct alien_cache **alien)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
703
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
704
  	int i = 0;
c8522a3a5   Joonsoo Kim   slab: introduce a...
705
  	struct alien_cache *alc;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
706
707
708
709
  	struct array_cache *ac;
  	unsigned long flags;
  
  	for_each_online_node(i) {
c8522a3a5   Joonsoo Kim   slab: introduce a...
710
711
  		alc = alien[i];
  		if (alc) {
833b706cc   Joonsoo Kim   slab: destroy a s...
712
  			LIST_HEAD(list);
c8522a3a5   Joonsoo Kim   slab: introduce a...
713
  			ac = &alc->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
714
  			spin_lock_irqsave(&alc->lock, flags);
833b706cc   Joonsoo Kim   slab: destroy a s...
715
  			__drain_alien_cache(cachep, ac, i, &list);
49dfc304b   Joonsoo Kim   slab: use the loc...
716
  			spin_unlock_irqrestore(&alc->lock, flags);
833b706cc   Joonsoo Kim   slab: destroy a s...
717
  			slabs_destroy(cachep, &list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
718
719
720
  		}
  	}
  }
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
721

25c4f304b   Joonsoo Kim   mm/slab: factor o...
722
723
  static int __cache_free_alien(struct kmem_cache *cachep, void *objp,
  				int node, int page_node)
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
724
  {
ce8eb6c42   Christoph Lameter   slab: Rename list...
725
  	struct kmem_cache_node *n;
c8522a3a5   Joonsoo Kim   slab: introduce a...
726
727
  	struct alien_cache *alien = NULL;
  	struct array_cache *ac;
97654dfa2   Joonsoo Kim   slab: defer slab_...
728
  	LIST_HEAD(list);
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
729

18bf85411   Christoph Lameter   slab: use get_nod...
730
  	n = get_node(cachep, node);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
731
  	STATS_INC_NODEFREES(cachep);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
732
733
  	if (n->alien && n->alien[page_node]) {
  		alien = n->alien[page_node];
c8522a3a5   Joonsoo Kim   slab: introduce a...
734
  		ac = &alien->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
735
  		spin_lock(&alien->lock);
c8522a3a5   Joonsoo Kim   slab: introduce a...
736
  		if (unlikely(ac->avail == ac->limit)) {
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
737
  			STATS_INC_ACOVERFLOW(cachep);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
738
  			__drain_alien_cache(cachep, ac, page_node, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
739
  		}
dabc3e291   Kees Cook   mm/slab: add naiv...
740
  		__free_one(ac, objp);
49dfc304b   Joonsoo Kim   slab: use the loc...
741
  		spin_unlock(&alien->lock);
833b706cc   Joonsoo Kim   slab: destroy a s...
742
  		slabs_destroy(cachep, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
743
  	} else {
25c4f304b   Joonsoo Kim   mm/slab: factor o...
744
  		n = get_node(cachep, page_node);
18bf85411   Christoph Lameter   slab: use get_nod...
745
  		spin_lock(&n->list_lock);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
746
  		free_block(cachep, &objp, 1, page_node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
747
  		spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
748
  		slabs_destroy(cachep, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
749
750
751
  	}
  	return 1;
  }
25c4f304b   Joonsoo Kim   mm/slab: factor o...
752
753
754
755
756
757
758
759
760
761
762
763
764
765
  
  static inline int cache_free_alien(struct kmem_cache *cachep, void *objp)
  {
  	int page_node = page_to_nid(virt_to_page(objp));
  	int node = numa_mem_id();
  	/*
  	 * Make sure we are not freeing a object from another node to the array
  	 * cache on this cpu.
  	 */
  	if (likely(node == page_node))
  		return 0;
  
  	return __cache_free_alien(cachep, objp, node, page_node);
  }
4167e9b2c   David Rientjes   mm: remove GFP_TH...
766
767
  
  /*
444eb2a44   Mel Gorman   mm: thp: set THP ...
768
769
   * Construct gfp mask to allocate from a specific node but do not reclaim or
   * warn about failures.
4167e9b2c   David Rientjes   mm: remove GFP_TH...
770
771
772
   */
  static inline gfp_t gfp_exact_node(gfp_t flags)
  {
444eb2a44   Mel Gorman   mm: thp: set THP ...
773
  	return (flags | __GFP_THISNODE | __GFP_NOWARN) & ~(__GFP_RECLAIM|__GFP_NOFAIL);
4167e9b2c   David Rientjes   mm: remove GFP_TH...
774
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
775
  #endif
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  static int init_cache_node(struct kmem_cache *cachep, int node, gfp_t gfp)
  {
  	struct kmem_cache_node *n;
  
  	/*
  	 * Set up the kmem_cache_node for cpu before we can
  	 * begin anything. Make sure some other cpu on this
  	 * node has not already allocated this
  	 */
  	n = get_node(cachep, node);
  	if (n) {
  		spin_lock_irq(&n->list_lock);
  		n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount +
  				cachep->num;
  		spin_unlock_irq(&n->list_lock);
  
  		return 0;
  	}
  
  	n = kmalloc_node(sizeof(struct kmem_cache_node), gfp, node);
  	if (!n)
  		return -ENOMEM;
  
  	kmem_cache_node_init(n);
  	n->next_reap = jiffies + REAPTIMEOUT_NODE +
  		    ((unsigned long)cachep) % REAPTIMEOUT_NODE;
  
  	n->free_limit =
  		(1 + nr_cpus_node(node)) * cachep->batchcount + cachep->num;
  
  	/*
  	 * The kmem_cache_nodes don't come and go as CPUs
  	 * come and go.  slab_mutex is sufficient
  	 * protection here.
  	 */
  	cachep->node[node] = n;
  
  	return 0;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
815
  #if (defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG)) || defined(CONFIG_SMP)
8f9f8d9e8   David Rientjes   slab: add memory ...
816
  /*
6a67368c3   Christoph Lameter   slab: Rename node...
817
   * Allocates and initializes node for a node on each slab cache, used for
ce8eb6c42   Christoph Lameter   slab: Rename list...
818
   * either memory or cpu hotplug.  If memory is being hot-added, the kmem_cache_node
8f9f8d9e8   David Rientjes   slab: add memory ...
819
   * will be allocated off-node since memory is not yet online for the new node.
6a67368c3   Christoph Lameter   slab: Rename node...
820
   * When hotplugging memory or a cpu, existing node are not replaced if
8f9f8d9e8   David Rientjes   slab: add memory ...
821
822
   * already in use.
   *
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
823
   * Must hold slab_mutex.
8f9f8d9e8   David Rientjes   slab: add memory ...
824
   */
6a67368c3   Christoph Lameter   slab: Rename node...
825
  static int init_cache_node_node(int node)
8f9f8d9e8   David Rientjes   slab: add memory ...
826
  {
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
827
  	int ret;
8f9f8d9e8   David Rientjes   slab: add memory ...
828
  	struct kmem_cache *cachep;
8f9f8d9e8   David Rientjes   slab: add memory ...
829

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
830
  	list_for_each_entry(cachep, &slab_caches, list) {
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
831
832
833
  		ret = init_cache_node(cachep, node, GFP_KERNEL);
  		if (ret)
  			return ret;
8f9f8d9e8   David Rientjes   slab: add memory ...
834
  	}
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
835

8f9f8d9e8   David Rientjes   slab: add memory ...
836
837
  	return 0;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
838
  #endif
8f9f8d9e8   David Rientjes   slab: add memory ...
839

c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
  static int setup_kmem_cache_node(struct kmem_cache *cachep,
  				int node, gfp_t gfp, bool force_change)
  {
  	int ret = -ENOMEM;
  	struct kmem_cache_node *n;
  	struct array_cache *old_shared = NULL;
  	struct array_cache *new_shared = NULL;
  	struct alien_cache **new_alien = NULL;
  	LIST_HEAD(list);
  
  	if (use_alien_caches) {
  		new_alien = alloc_alien_cache(node, cachep->limit, gfp);
  		if (!new_alien)
  			goto fail;
  	}
  
  	if (cachep->shared) {
  		new_shared = alloc_arraycache(node,
  			cachep->shared * cachep->batchcount, 0xbaadf00d, gfp);
  		if (!new_shared)
  			goto fail;
  	}
  
  	ret = init_cache_node(cachep, node, gfp);
  	if (ret)
  		goto fail;
  
  	n = get_node(cachep, node);
  	spin_lock_irq(&n->list_lock);
  	if (n->shared && force_change) {
  		free_block(cachep, n->shared->entry,
  				n->shared->avail, node, &list);
  		n->shared->avail = 0;
  	}
  
  	if (!n->shared || force_change) {
  		old_shared = n->shared;
  		n->shared = new_shared;
  		new_shared = NULL;
  	}
  
  	if (!n->alien) {
  		n->alien = new_alien;
  		new_alien = NULL;
  	}
  
  	spin_unlock_irq(&n->list_lock);
  	slabs_destroy(cachep, &list);
801faf0db   Joonsoo Kim   mm/slab: lockless...
888
889
890
891
  	/*
  	 * To protect lockless access to n->shared during irq disabled context.
  	 * If n->shared isn't NULL in irq disabled context, accessing to it is
  	 * guaranteed to be valid until irq is re-enabled, because it will be
6564a25e6   Paul E. McKenney   slab: Replace syn...
892
  	 * freed after synchronize_rcu().
801faf0db   Joonsoo Kim   mm/slab: lockless...
893
  	 */
86d9f4853   Joonsoo Kim   mm/slab: fix kmem...
894
  	if (old_shared && force_change)
6564a25e6   Paul E. McKenney   slab: Replace syn...
895
  		synchronize_rcu();
801faf0db   Joonsoo Kim   mm/slab: lockless...
896

c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
897
898
899
900
901
902
903
  fail:
  	kfree(old_shared);
  	kfree(new_shared);
  	free_alien_cache(new_alien);
  
  	return ret;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
904
  #ifdef CONFIG_SMP
0db0628d9   Paul Gortmaker   kernel: delete __...
905
  static void cpuup_canceled(long cpu)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
906
907
  {
  	struct kmem_cache *cachep;
ce8eb6c42   Christoph Lameter   slab: Rename list...
908
  	struct kmem_cache_node *n = NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
909
  	int node = cpu_to_mem(cpu);
a70f73028   Rusty Russell   cpumask: replace ...
910
  	const struct cpumask *mask = cpumask_of_node(node);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
911

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
912
  	list_for_each_entry(cachep, &slab_caches, list) {
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
913
914
  		struct array_cache *nc;
  		struct array_cache *shared;
c8522a3a5   Joonsoo Kim   slab: introduce a...
915
  		struct alien_cache **alien;
97654dfa2   Joonsoo Kim   slab: defer slab_...
916
  		LIST_HEAD(list);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
917

18bf85411   Christoph Lameter   slab: use get_nod...
918
  		n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
919
  		if (!n)
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
920
  			continue;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
921

ce8eb6c42   Christoph Lameter   slab: Rename list...
922
  		spin_lock_irq(&n->list_lock);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
923

ce8eb6c42   Christoph Lameter   slab: Rename list...
924
925
  		/* Free limit for this kmem_cache_node */
  		n->free_limit -= cachep->batchcount;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
926
927
928
  
  		/* cpu is dead; no one can alloc from it. */
  		nc = per_cpu_ptr(cachep->cpu_cache, cpu);
517f9f1ee   Li RongQing   mm/slab.c: remove...
929
930
  		free_block(cachep, nc->entry, nc->avail, node, &list);
  		nc->avail = 0;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
931

58463c1fe   Rusty Russell   cpumask: avoid de...
932
  		if (!cpumask_empty(mask)) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
933
  			spin_unlock_irq(&n->list_lock);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
934
  			goto free_slab;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
935
  		}
ce8eb6c42   Christoph Lameter   slab: Rename list...
936
  		shared = n->shared;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
937
938
  		if (shared) {
  			free_block(cachep, shared->entry,
97654dfa2   Joonsoo Kim   slab: defer slab_...
939
  				   shared->avail, node, &list);
ce8eb6c42   Christoph Lameter   slab: Rename list...
940
  			n->shared = NULL;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
941
  		}
ce8eb6c42   Christoph Lameter   slab: Rename list...
942
943
  		alien = n->alien;
  		n->alien = NULL;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
944

ce8eb6c42   Christoph Lameter   slab: Rename list...
945
  		spin_unlock_irq(&n->list_lock);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
946
947
948
949
950
951
  
  		kfree(shared);
  		if (alien) {
  			drain_alien_cache(cachep, alien);
  			free_alien_cache(alien);
  		}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
952
953
  
  free_slab:
97654dfa2   Joonsoo Kim   slab: defer slab_...
954
  		slabs_destroy(cachep, &list);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
955
956
957
958
959
960
  	}
  	/*
  	 * In the previous loop, all the objects were freed to
  	 * the respective cache's slabs,  now we can go ahead and
  	 * shrink each nodelist to its limit.
  	 */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
961
  	list_for_each_entry(cachep, &slab_caches, list) {
18bf85411   Christoph Lameter   slab: use get_nod...
962
  		n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
963
  		if (!n)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
964
  			continue;
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
965
  		drain_freelist(cachep, n, INT_MAX);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
966
967
  	}
  }
0db0628d9   Paul Gortmaker   kernel: delete __...
968
  static int cpuup_prepare(long cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
969
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
970
  	struct kmem_cache *cachep;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
971
  	int node = cpu_to_mem(cpu);
8f9f8d9e8   David Rientjes   slab: add memory ...
972
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973

fbf1e473b   Akinobu Mita   cpu hotplug: slab...
974
975
976
977
  	/*
  	 * We need to do this right in the beginning since
  	 * alloc_arraycache's are going to use this list.
  	 * kmalloc_node allows us to add the slab to the right
ce8eb6c42   Christoph Lameter   slab: Rename list...
978
  	 * kmem_cache_node and not this cpu's kmem_cache_node
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
979
  	 */
6a67368c3   Christoph Lameter   slab: Rename node...
980
  	err = init_cache_node_node(node);
8f9f8d9e8   David Rientjes   slab: add memory ...
981
982
  	if (err < 0)
  		goto bad;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
983
984
985
986
987
  
  	/*
  	 * Now we can go ahead with allocating the shared arrays and
  	 * array caches
  	 */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
988
  	list_for_each_entry(cachep, &slab_caches, list) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
989
990
991
  		err = setup_kmem_cache_node(cachep, node, GFP_KERNEL, false);
  		if (err)
  			goto bad;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
992
  	}
ce79ddc8e   Pekka Enberg   SLAB: Fix lockdep...
993

fbf1e473b   Akinobu Mita   cpu hotplug: slab...
994
995
  	return 0;
  bad:
12d00f6a1   Akinobu Mita   cpu hotplug: slab...
996
  	cpuup_canceled(cpu);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
997
998
  	return -ENOMEM;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
999
  int slab_prepare_cpu(unsigned int cpu)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1000
  {
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1001
  	int err;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1002

6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
  	mutex_lock(&slab_mutex);
  	err = cpuup_prepare(cpu);
  	mutex_unlock(&slab_mutex);
  	return err;
  }
  
  /*
   * This is called for a failed online attempt and for a successful
   * offline.
   *
   * Even if all the cpus of a node are down, we don't free the
221503e12   Xiao Yang   mm/slab.c: update...
1014
   * kmem_cache_node of any cache. This to avoid a race between cpu_down, and
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1015
   * a kmalloc allocation from another cpu for memory from the node of
70b6d25ec   Chen Tao   mm: fix some comm...
1016
   * the cpu going down.  The kmem_cache_node structure is usually allocated from
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1017
1018
1019
1020
1021
1022
1023
1024
1025
   * kmem_cache_create() and gets destroyed at kmem_cache_destroy().
   */
  int slab_dead_cpu(unsigned int cpu)
  {
  	mutex_lock(&slab_mutex);
  	cpuup_canceled(cpu);
  	mutex_unlock(&slab_mutex);
  	return 0;
  }
8f5be20bf   Ravikiran G Thirumalai   [PATCH] mm: slab:...
1026
  #endif
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1027
1028
1029
1030
1031
  
  static int slab_online_cpu(unsigned int cpu)
  {
  	start_cpu_timer(cpu);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1032
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
  static int slab_offline_cpu(unsigned int cpu)
  {
  	/*
  	 * Shutdown cache reaper. Note that the slab_mutex is held so
  	 * that if cache_reap() is invoked it cannot do anything
  	 * expensive but will only modify reap_work and reschedule the
  	 * timer.
  	 */
  	cancel_delayed_work_sync(&per_cpu(slab_reap_work, cpu));
  	/* Now the cache_reaper is guaranteed to be not running. */
  	per_cpu(slab_reap_work, cpu).work.func = NULL;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046

8f9f8d9e8   David Rientjes   slab: add memory ...
1047
1048
1049
1050
1051
1052
  #if defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG)
  /*
   * Drains freelist for a node on each slab cache, used for memory hot-remove.
   * Returns -EBUSY if all objects cannot be drained so that the node is not
   * removed.
   *
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1053
   * Must hold slab_mutex.
8f9f8d9e8   David Rientjes   slab: add memory ...
1054
   */
6a67368c3   Christoph Lameter   slab: Rename node...
1055
  static int __meminit drain_cache_node_node(int node)
8f9f8d9e8   David Rientjes   slab: add memory ...
1056
1057
1058
  {
  	struct kmem_cache *cachep;
  	int ret = 0;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1059
  	list_for_each_entry(cachep, &slab_caches, list) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1060
  		struct kmem_cache_node *n;
8f9f8d9e8   David Rientjes   slab: add memory ...
1061

18bf85411   Christoph Lameter   slab: use get_nod...
1062
  		n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
1063
  		if (!n)
8f9f8d9e8   David Rientjes   slab: add memory ...
1064
  			continue;
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
1065
  		drain_freelist(cachep, n, INT_MAX);
8f9f8d9e8   David Rientjes   slab: add memory ...
1066

ce8eb6c42   Christoph Lameter   slab: Rename list...
1067
1068
  		if (!list_empty(&n->slabs_full) ||
  		    !list_empty(&n->slabs_partial)) {
8f9f8d9e8   David Rientjes   slab: add memory ...
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
  			ret = -EBUSY;
  			break;
  		}
  	}
  	return ret;
  }
  
  static int __meminit slab_memory_callback(struct notifier_block *self,
  					unsigned long action, void *arg)
  {
  	struct memory_notify *mnb = arg;
  	int ret = 0;
  	int nid;
  
  	nid = mnb->status_change_nid;
  	if (nid < 0)
  		goto out;
  
  	switch (action) {
  	case MEM_GOING_ONLINE:
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1089
  		mutex_lock(&slab_mutex);
6a67368c3   Christoph Lameter   slab: Rename node...
1090
  		ret = init_cache_node_node(nid);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1091
  		mutex_unlock(&slab_mutex);
8f9f8d9e8   David Rientjes   slab: add memory ...
1092
1093
  		break;
  	case MEM_GOING_OFFLINE:
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1094
  		mutex_lock(&slab_mutex);
6a67368c3   Christoph Lameter   slab: Rename node...
1095
  		ret = drain_cache_node_node(nid);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1096
  		mutex_unlock(&slab_mutex);
8f9f8d9e8   David Rientjes   slab: add memory ...
1097
1098
1099
1100
1101
1102
1103
1104
  		break;
  	case MEM_ONLINE:
  	case MEM_OFFLINE:
  	case MEM_CANCEL_ONLINE:
  	case MEM_CANCEL_OFFLINE:
  		break;
  	}
  out:
5fda1bd5b   Prarit Bhargava   mm: notifier_from...
1105
  	return notifier_from_errno(ret);
8f9f8d9e8   David Rientjes   slab: add memory ...
1106
1107
  }
  #endif /* CONFIG_NUMA && CONFIG_MEMORY_HOTPLUG */
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1108
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
1109
   * swap the static kmem_cache_node with kmalloced memory
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1110
   */
6744f087b   Christoph Lameter   slab: Common name...
1111
  static void __init init_list(struct kmem_cache *cachep, struct kmem_cache_node *list,
8f9f8d9e8   David Rientjes   slab: add memory ...
1112
  				int nodeid)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1113
  {
6744f087b   Christoph Lameter   slab: Common name...
1114
  	struct kmem_cache_node *ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1115

6744f087b   Christoph Lameter   slab: Common name...
1116
  	ptr = kmalloc_node(sizeof(struct kmem_cache_node), GFP_NOWAIT, nodeid);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1117
  	BUG_ON(!ptr);
6744f087b   Christoph Lameter   slab: Common name...
1118
  	memcpy(ptr, list, sizeof(struct kmem_cache_node));
2b2d5493e   Ingo Molnar   [PATCH] lockdep: ...
1119
1120
1121
1122
  	/*
  	 * Do not assume that spinlocks can be initialized via memcpy:
  	 */
  	spin_lock_init(&ptr->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1123
  	MAKE_ALL_LISTS(cachep, ptr, nodeid);
6a67368c3   Christoph Lameter   slab: Rename node...
1124
  	cachep->node[nodeid] = ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1125
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1126
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
1127
1128
   * For setting up all the kmem_cache_node for cache whose buffer_size is same as
   * size of kmem_cache_node.
556a169da   Pekka Enberg   slab: fix bootstr...
1129
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
1130
  static void __init set_up_node(struct kmem_cache *cachep, int index)
556a169da   Pekka Enberg   slab: fix bootstr...
1131
1132
1133
1134
  {
  	int node;
  
  	for_each_online_node(node) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1135
  		cachep->node[node] = &init_kmem_cache_node[index + node];
6a67368c3   Christoph Lameter   slab: Rename node...
1136
  		cachep->node[node]->next_reap = jiffies +
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
1137
1138
  		    REAPTIMEOUT_NODE +
  		    ((unsigned long)cachep) % REAPTIMEOUT_NODE;
556a169da   Pekka Enberg   slab: fix bootstr...
1139
1140
1141
1142
  	}
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1143
1144
   * Initialisation.  Called after the page allocator have been initialised and
   * before smp_init().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
1146
1147
   */
  void __init kmem_cache_init(void)
  {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1148
  	int i;
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1149
  	kmem_cache = &kmem_cache_boot;
8888177ea   Joonsoo Kim   mm/slab: remove B...
1150
  	if (!IS_ENABLED(CONFIG_NUMA) || num_possible_nodes() == 1)
62918a036   Siddha, Suresh B   [PATCH] x86-64: s...
1151
  		use_alien_caches = 0;
3c5834652   Christoph Lameter   slab: Simplify bo...
1152
  	for (i = 0; i < NUM_INIT_LISTS; i++)
ce8eb6c42   Christoph Lameter   slab: Rename list...
1153
  		kmem_cache_node_init(&init_kmem_cache_node[i]);
3c5834652   Christoph Lameter   slab: Simplify bo...
1154

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
  	/*
  	 * Fragmentation resistance on low memory - only use bigger
3df1cccdf   David Rientjes   slab: introduce s...
1157
1158
  	 * page orders on machines with more than 32MB of memory if
  	 * not overridden on the command line.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
  	 */
ca79b0c21   Arun KS   mm: convert total...
1160
  	if (!slab_max_order_set && totalram_pages() > (32 << 20) >> PAGE_SHIFT)
543585cc5   David Rientjes   slab: rename slab...
1161
  		slab_max_order = SLAB_MAX_ORDER_HI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1162

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
1164
  	/* Bootstrap is tricky, because several objects are allocated
  	 * from caches that do not exist yet:
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1165
1166
1167
  	 * 1) initialize the kmem_cache cache: it contains the struct
  	 *    kmem_cache structures of all caches, except kmem_cache itself:
  	 *    kmem_cache is statically allocated.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1168
  	 *    Initially an __init data area is used for the head array and the
ce8eb6c42   Christoph Lameter   slab: Rename list...
1169
  	 *    kmem_cache_node structures, it's replaced with a kmalloc allocated
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1170
  	 *    array at the end of the bootstrap.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1171
  	 * 2) Create the first kmalloc cache.
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1172
  	 *    The struct kmem_cache for the new cache is allocated normally.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1173
1174
1175
  	 *    An __init data area is used for the head array.
  	 * 3) Create the remaining kmalloc caches, with minimally sized
  	 *    head arrays.
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1176
  	 * 4) Replace the __init data head arrays for kmem_cache and the first
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1177
  	 *    kmalloc cache with kmalloc allocated arrays.
ce8eb6c42   Christoph Lameter   slab: Rename list...
1178
  	 * 5) Replace the __init data for kmem_cache_node for kmem_cache and
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1179
1180
  	 *    the other cache's with kmalloc allocated memory.
  	 * 6) Resize the head arrays of the kmalloc caches to their final sizes.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181
  	 */
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1182
  	/* 1) create the kmem_cache */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1183

8da3430d8   Eric Dumazet   slab: NUMA kmem_c...
1184
  	/*
b56efcf0a   Eric Dumazet   slab: shrink size...
1185
  	 * struct kmem_cache size depends on nr_node_ids & nr_cpu_ids
8da3430d8   Eric Dumazet   slab: NUMA kmem_c...
1186
  	 */
2f9baa9fc   Christoph Lameter   slab: Use the new...
1187
  	create_boot_cache(kmem_cache, "kmem_cache",
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1188
  		offsetof(struct kmem_cache, node) +
6744f087b   Christoph Lameter   slab: Common name...
1189
  				  nr_node_ids * sizeof(struct kmem_cache_node *),
8eb8284b4   David Windsor   usercopy: Prepare...
1190
  				  SLAB_HWCACHE_ALIGN, 0, 0);
2f9baa9fc   Christoph Lameter   slab: Use the new...
1191
  	list_add(&kmem_cache->list, &slab_caches);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1192
  	slab_state = PARTIAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1194
  	/*
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1195
1196
  	 * Initialize the caches that provide memory for the  kmem_cache_node
  	 * structures first.  Without this, further allocations will bug.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1197
  	 */
cc252eae8   Vlastimil Babka   mm, slab: combine...
1198
  	kmalloc_caches[KMALLOC_NORMAL][INDEX_NODE] = create_kmalloc_cache(
cb5d9fb38   Pengfei Li   mm, slab: make km...
1199
  				kmalloc_info[INDEX_NODE].name[KMALLOC_NORMAL],
dc0a7f755   Pengfei Li   mm, slab: remove ...
1200
1201
1202
  				kmalloc_info[INDEX_NODE].size,
  				ARCH_KMALLOC_FLAGS, 0,
  				kmalloc_info[INDEX_NODE].size);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1203
  	slab_state = PARTIAL_NODE;
34cc6990d   Daniel Sanders   slab: correct siz...
1204
  	setup_kmalloc_cache_index_table();
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1205

e0a427267   Ingo Molnar   [PATCH] mm/slab.c...
1206
  	slab_early_init = 0;
ce8eb6c42   Christoph Lameter   slab: Rename list...
1207
  	/* 5) Replace the bootstrap kmem_cache_node */
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1208
  	{
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
1209
  		int nid;
9c09a95cf   Mel Gorman   slab: partially r...
1210
  		for_each_online_node(nid) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1211
  			init_list(kmem_cache, &init_kmem_cache_node[CACHE_CACHE + nid], nid);
556a169da   Pekka Enberg   slab: fix bootstr...
1212

cc252eae8   Vlastimil Babka   mm, slab: combine...
1213
  			init_list(kmalloc_caches[KMALLOC_NORMAL][INDEX_NODE],
ce8eb6c42   Christoph Lameter   slab: Rename list...
1214
  					  &init_kmem_cache_node[SIZE_NODE + nid], nid);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1215
1216
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1217

f97d5f634   Christoph Lameter   slab: Common func...
1218
  	create_kmalloc_caches(ARCH_KMALLOC_FLAGS);
8429db5c6   Pekka Enberg   slab: setup cpu c...
1219
1220
1221
1222
1223
  }
  
  void __init kmem_cache_init_late(void)
  {
  	struct kmem_cache *cachep;
8429db5c6   Pekka Enberg   slab: setup cpu c...
1224
  	/* 6) resize the head arrays to their final sizes */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1225
1226
  	mutex_lock(&slab_mutex);
  	list_for_each_entry(cachep, &slab_caches, list)
8429db5c6   Pekka Enberg   slab: setup cpu c...
1227
1228
  		if (enable_cpucache(cachep, GFP_NOWAIT))
  			BUG();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1229
  	mutex_unlock(&slab_mutex);
056c62418   Ravikiran G Thirumalai   [PATCH] slab: fix...
1230

97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1231
1232
  	/* Done! */
  	slab_state = FULL;
8f9f8d9e8   David Rientjes   slab: add memory ...
1233
1234
1235
  #ifdef CONFIG_NUMA
  	/*
  	 * Register a memory hotplug callback that initializes and frees
6a67368c3   Christoph Lameter   slab: Rename node...
1236
  	 * node.
8f9f8d9e8   David Rientjes   slab: add memory ...
1237
1238
1239
  	 */
  	hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI);
  #endif
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1240
1241
1242
  	/*
  	 * The reap timers are started later, with a module init call: That part
  	 * of the kernel is not yet operational.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1243
1244
1245
1246
1247
  	 */
  }
  
  static int __init cpucache_init(void)
  {
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1248
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1249

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1250
1251
  	/*
  	 * Register the timers that return unneeded pages to the page allocator
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1252
  	 */
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1253
1254
1255
  	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "SLAB online",
  				slab_online_cpu, slab_offline_cpu);
  	WARN_ON(ret < 0);
a164f8962   Glauber Costa   slab: move FULL s...
1256

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
1258
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1259
  __initcall(cpucache_init);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1260
1261
1262
  static noinline void
  slab_out_of_memory(struct kmem_cache *cachep, gfp_t gfpflags, int nodeid)
  {
9a02d6999   David Rientjes   mm, slab: suppres...
1263
  #if DEBUG
ce8eb6c42   Christoph Lameter   slab: Rename list...
1264
  	struct kmem_cache_node *n;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1265
1266
  	unsigned long flags;
  	int node;
9a02d6999   David Rientjes   mm, slab: suppres...
1267
1268
1269
1270
1271
  	static DEFINE_RATELIMIT_STATE(slab_oom_rs, DEFAULT_RATELIMIT_INTERVAL,
  				      DEFAULT_RATELIMIT_BURST);
  
  	if ((gfpflags & __GFP_NOWARN) || !__ratelimit(&slab_oom_rs))
  		return;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1272

5b3810e5c   Vlastimil Babka   mm, sl[au]b: prin...
1273
1274
1275
1276
1277
  	pr_warn("SLAB: Unable to allocate memory on node %d, gfp=%#x(%pGg)
  ",
  		nodeid, gfpflags, &gfpflags);
  	pr_warn("  cache: %s, object size: %d, order: %d
  ",
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
1278
  		cachep->name, cachep->size, cachep->gfporder);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1279

18bf85411   Christoph Lameter   slab: use get_nod...
1280
  	for_each_kmem_cache_node(cachep, node, n) {
bf00bd345   David Rientjes   mm, slab: maintai...
1281
  		unsigned long total_slabs, free_slabs, free_objs;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1282

ce8eb6c42   Christoph Lameter   slab: Rename list...
1283
  		spin_lock_irqsave(&n->list_lock, flags);
bf00bd345   David Rientjes   mm, slab: maintai...
1284
1285
1286
  		total_slabs = n->total_slabs;
  		free_slabs = n->free_slabs;
  		free_objs = n->free_objects;
ce8eb6c42   Christoph Lameter   slab: Rename list...
1287
  		spin_unlock_irqrestore(&n->list_lock, flags);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1288

bf00bd345   David Rientjes   mm, slab: maintai...
1289
1290
1291
1292
1293
  		pr_warn("  node %d: slabs: %ld/%ld, objs: %ld/%ld
  ",
  			node, total_slabs - free_slabs, total_slabs,
  			(total_slabs * cachep->num) - free_objs,
  			total_slabs * cachep->num);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1294
  	}
9a02d6999   David Rientjes   mm, slab: suppres...
1295
  #endif
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1296
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1297
  /*
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1298
1299
   * Interface to system's page allocator. No need to hold the
   * kmem_cache_node ->list_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1300
1301
1302
1303
1304
   *
   * If we requested dmaable memory, we will get it. Even if we
   * did not request dmaable memory, we might get it, but that
   * would be relatively rare and ignorable.
   */
0c3aa83e0   Joonsoo Kim   slab: change retu...
1305
1306
  static struct page *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
  								int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1307
1308
  {
  	struct page *page;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
1309

a618e89f1   Glauber Costa   slab: rename gfpf...
1310
  	flags |= cachep->allocflags;
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1311

75f296d93   Levin, Alexander (Sasha Levin)   kmemcheck: stop u...
1312
  	page = __alloc_pages_node(nodeid, flags, cachep->gfporder);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1313
  	if (!page) {
9a02d6999   David Rientjes   mm, slab: suppres...
1314
  		slab_out_of_memory(cachep, flags, nodeid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
  		return NULL;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1316
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317

74d555bed   Roman Gushchin   mm: slab: rename ...
1318
  	account_slab_page(page, cachep->gfporder, cachep);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1319
  	__SetPageSlab(page);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1320
1321
  	/* Record if ALLOC_NO_WATERMARKS was set when allocating the slab */
  	if (sk_memalloc_socks() && page_is_pfmemalloc(page))
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1322
  		SetPageSlabPfmemalloc(page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
1323

0c3aa83e0   Joonsoo Kim   slab: change retu...
1324
  	return page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1325
1326
1327
1328
1329
  }
  
  /*
   * Interface to system's page release.
   */
0c3aa83e0   Joonsoo Kim   slab: change retu...
1330
  static void kmem_freepages(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1331
  {
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1332
  	int order = cachep->gfporder;
73293c2f9   Joonsoo Kim   slab: correct pfm...
1333

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1334
  	BUG_ON(!PageSlab(page));
73293c2f9   Joonsoo Kim   slab: correct pfm...
1335
  	__ClearPageSlabPfmemalloc(page);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1336
  	__ClearPageSlab(page);
8456a648c   Joonsoo Kim   slab: use struct ...
1337
1338
  	page_mapcount_reset(page);
  	page->mapping = NULL;
1f458cbf1   Glauber Costa   memcg: destroy me...
1339

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1340
  	if (current->reclaim_state)
6cea1d569   Roman Gushchin   mm: memcg/slab: u...
1341
  		current->reclaim_state->reclaimed_slab += 1 << order;
74d555bed   Roman Gushchin   mm: slab: rename ...
1342
  	unaccount_slab_page(page, order, cachep);
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1343
  	__free_pages(page, order);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1344
1345
1346
1347
  }
  
  static void kmem_rcu_free(struct rcu_head *head)
  {
68126702b   Joonsoo Kim   slab: overloading...
1348
1349
  	struct kmem_cache *cachep;
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350

68126702b   Joonsoo Kim   slab: overloading...
1351
1352
1353
1354
  	page = container_of(head, struct page, rcu_head);
  	cachep = page->slab_cache;
  
  	kmem_freepages(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1355
1356
1357
  }
  
  #if DEBUG
40b441379   Joonsoo Kim   mm/slab: clean up...
1358
1359
  static bool is_debug_pagealloc_cache(struct kmem_cache *cachep)
  {
8e57f8acb   Vlastimil Babka   mm, debug_pageall...
1360
  	if (debug_pagealloc_enabled_static() && OFF_SLAB(cachep) &&
40b441379   Joonsoo Kim   mm/slab: clean up...
1361
1362
1363
1364
1365
  		(cachep->size % PAGE_SIZE) == 0)
  		return true;
  
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1366
1367
  
  #ifdef CONFIG_DEBUG_PAGEALLOC
80552f0f7   Qian Cai   mm/slab: Remove s...
1368
  static void slab_kernel_map(struct kmem_cache *cachep, void *objp, int map)
40b441379   Joonsoo Kim   mm/slab: clean up...
1369
1370
1371
  {
  	if (!is_debug_pagealloc_cache(cachep))
  		return;
40b441379   Joonsoo Kim   mm/slab: clean up...
1372
1373
1374
1375
1376
  	kernel_map_pages(virt_to_page(objp), cachep->size / PAGE_SIZE, map);
  }
  
  #else
  static inline void slab_kernel_map(struct kmem_cache *cachep, void *objp,
80552f0f7   Qian Cai   mm/slab: Remove s...
1377
  				int map) {}
40b441379   Joonsoo Kim   mm/slab: clean up...
1378

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379
  #endif
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1380
  static void poison_obj(struct kmem_cache *cachep, void *addr, unsigned char val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1381
  {
8c138bc00   Christoph Lameter   slab: Get rid of ...
1382
  	int size = cachep->object_size;
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1383
  	addr = &((char *)addr)[obj_offset(cachep)];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
1385
  
  	memset(addr, val, size);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1386
  	*(unsigned char *)(addr + size - 1) = POISON_END;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1387
1388
1389
1390
1391
  }
  
  static void dump_line(char *data, int offset, int limit)
  {
  	int i;
aa83aa40e   Dave Jones   [PATCH] single bi...
1392
1393
  	unsigned char error = 0;
  	int bad_count = 0;
1170532bb   Joe Perches   mm: convert print...
1394
  	pr_err("%03x: ", offset);
aa83aa40e   Dave Jones   [PATCH] single bi...
1395
1396
1397
1398
1399
  	for (i = 0; i < limit; i++) {
  		if (data[offset + i] != POISON_FREE) {
  			error = data[offset + i];
  			bad_count++;
  		}
aa83aa40e   Dave Jones   [PATCH] single bi...
1400
  	}
fdde6abb3   Sebastian Andrzej Siewior   slab: use print_h...
1401
1402
  	print_hex_dump(KERN_CONT, "", 0, 16, 1,
  			&data[offset], limit, 1);
aa83aa40e   Dave Jones   [PATCH] single bi...
1403
1404
1405
1406
  
  	if (bad_count == 1) {
  		error ^= POISON_FREE;
  		if (!(error & (error - 1))) {
1170532bb   Joe Perches   mm: convert print...
1407
1408
  			pr_err("Single bit error detected. Probably bad RAM.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1409
  #ifdef CONFIG_X86
1170532bb   Joe Perches   mm: convert print...
1410
1411
  			pr_err("Run memtest86+ or a similar memory test tool.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1412
  #else
1170532bb   Joe Perches   mm: convert print...
1413
1414
  			pr_err("Run a memory test tool.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1415
1416
1417
  #endif
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1418
1419
1420
1421
  }
  #endif
  
  #if DEBUG
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1422
  static void print_objinfo(struct kmem_cache *cachep, void *objp, int lines)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1423
1424
1425
1426
1427
  {
  	int i, size;
  	char *realobj;
  
  	if (cachep->flags & SLAB_RED_ZONE) {
1170532bb   Joe Perches   mm: convert print...
1428
1429
1430
1431
  		pr_err("Redzone: 0x%llx/0x%llx
  ",
  		       *dbg_redzone1(cachep, objp),
  		       *dbg_redzone2(cachep, objp));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
  	}
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
1433
1434
1435
  	if (cachep->flags & SLAB_STORE_USER)
  		pr_err("Last user: (%pSR)
  ", *dbg_userword(cachep, objp));
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1436
  	realobj = (char *)objp + obj_offset(cachep);
8c138bc00   Christoph Lameter   slab: Get rid of ...
1437
  	size = cachep->object_size;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1438
  	for (i = 0; i < size && lines; i += 16, lines--) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
  		int limit;
  		limit = 16;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1441
1442
  		if (i + limit > size)
  			limit = size - i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
1444
1445
  		dump_line(realobj, i, limit);
  	}
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1446
  static void check_poison_obj(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1447
1448
1449
1450
  {
  	char *realobj;
  	int size, i;
  	int lines = 0;
40b441379   Joonsoo Kim   mm/slab: clean up...
1451
1452
  	if (is_debug_pagealloc_cache(cachep))
  		return;
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1453
  	realobj = (char *)objp + obj_offset(cachep);
8c138bc00   Christoph Lameter   slab: Get rid of ...
1454
  	size = cachep->object_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1455

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1456
  	for (i = 0; i < size; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1457
  		char exp = POISON_FREE;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1458
  		if (i == size - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1459
1460
1461
1462
1463
1464
  			exp = POISON_END;
  		if (realobj[i] != exp) {
  			int limit;
  			/* Mismatch ! */
  			/* Print header */
  			if (lines == 0) {
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
1465
1466
  				pr_err("Slab corruption (%s): %s start=%px, len=%d
  ",
1170532bb   Joe Perches   mm: convert print...
1467
1468
  				       print_tainted(), cachep->name,
  				       realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1469
1470
1471
  				print_objinfo(cachep, objp, 0);
  			}
  			/* Hexdump the affected line */
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1472
  			i = (i / 16) * 16;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
  			limit = 16;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1474
1475
  			if (i + limit > size)
  				limit = size - i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
  			dump_line(realobj, i, limit);
  			i += 16;
  			lines++;
  			/* Limit to 5 lines */
  			if (lines > 5)
  				break;
  		}
  	}
  	if (lines != 0) {
  		/* Print some data about the neighboring objects, if they
  		 * exist:
  		 */
8456a648c   Joonsoo Kim   slab: use struct ...
1488
  		struct page *page = virt_to_head_page(objp);
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
1489
  		unsigned int objnr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1490

8456a648c   Joonsoo Kim   slab: use struct ...
1491
  		objnr = obj_to_index(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1492
  		if (objnr) {
8456a648c   Joonsoo Kim   slab: use struct ...
1493
  			objp = index_to_obj(cachep, page, objnr - 1);
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1494
  			realobj = (char *)objp + obj_offset(cachep);
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
1495
1496
  			pr_err("Prev obj: start=%px, len=%d
  ", realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1497
1498
  			print_objinfo(cachep, objp, 2);
  		}
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1499
  		if (objnr + 1 < cachep->num) {
8456a648c   Joonsoo Kim   slab: use struct ...
1500
  			objp = index_to_obj(cachep, page, objnr + 1);
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1501
  			realobj = (char *)objp + obj_offset(cachep);
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
1502
1503
  			pr_err("Next obj: start=%px, len=%d
  ", realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1504
1505
1506
1507
1508
  			print_objinfo(cachep, objp, 2);
  		}
  	}
  }
  #endif
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1509
  #if DEBUG
8456a648c   Joonsoo Kim   slab: use struct ...
1510
1511
  static void slab_destroy_debugcheck(struct kmem_cache *cachep,
  						struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1512
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1513
  	int i;
b03a017be   Joonsoo Kim   mm/slab: introduc...
1514
1515
1516
1517
1518
  
  	if (OBJFREELIST_SLAB(cachep) && cachep->flags & SLAB_POISON) {
  		poison_obj(cachep, page->freelist - obj_offset(cachep),
  			POISON_FREE);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1519
  	for (i = 0; i < cachep->num; i++) {
8456a648c   Joonsoo Kim   slab: use struct ...
1520
  		void *objp = index_to_obj(cachep, page, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1521
1522
  
  		if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
  			check_poison_obj(cachep, objp);
80552f0f7   Qian Cai   mm/slab: Remove s...
1524
  			slab_kernel_map(cachep, objp, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1525
1526
1527
  		}
  		if (cachep->flags & SLAB_RED_ZONE) {
  			if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
1528
  				slab_error(cachep, "start of a freed object was overwritten");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1529
  			if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
1530
  				slab_error(cachep, "end of a freed object was overwritten");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1531
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1532
  	}
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1533
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1534
  #else
8456a648c   Joonsoo Kim   slab: use struct ...
1535
1536
  static void slab_destroy_debugcheck(struct kmem_cache *cachep,
  						struct page *page)
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1537
  {
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1538
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1539
  #endif
911851e6e   Randy Dunlap   [PATCH] slab: fix...
1540
1541
1542
  /**
   * slab_destroy - destroy and release all objects in a slab
   * @cachep: cache pointer being destroyed
cb8ee1a3d   Masanari Iida   mm: Fix warning o...
1543
   * @page: page pointer being destroyed
911851e6e   Randy Dunlap   [PATCH] slab: fix...
1544
   *
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1545
1546
1547
   * Destroy all the objs in a slab page, and release the mem back to the system.
   * Before calling the slab page must have been unlinked from the cache. The
   * kmem_cache_node ->list_lock is not held/needed.
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1548
   */
8456a648c   Joonsoo Kim   slab: use struct ...
1549
  static void slab_destroy(struct kmem_cache *cachep, struct page *page)
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1550
  {
7e0073552   Joonsoo Kim   slab: replace non...
1551
  	void *freelist;
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1552

8456a648c   Joonsoo Kim   slab: use struct ...
1553
1554
  	freelist = page->freelist;
  	slab_destroy_debugcheck(cachep, page);
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1555
  	if (unlikely(cachep->flags & SLAB_TYPESAFE_BY_RCU))
bc4f610d5   Kirill A. Shutemov   slab, slub: use p...
1556
1557
  		call_rcu(&page->rcu_head, kmem_rcu_free);
  	else
0c3aa83e0   Joonsoo Kim   slab: change retu...
1558
  		kmem_freepages(cachep, page);
68126702b   Joonsoo Kim   slab: overloading...
1559
1560
  
  	/*
8456a648c   Joonsoo Kim   slab: use struct ...
1561
  	 * From now on, we don't use freelist
68126702b   Joonsoo Kim   slab: overloading...
1562
1563
1564
  	 * although actual page can be freed in rcu context
  	 */
  	if (OFF_SLAB(cachep))
8456a648c   Joonsoo Kim   slab: use struct ...
1565
  		kmem_cache_free(cachep->freelist_cache, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1566
  }
678ff6a7a   Shakeel Butt   mm: slab: fix pot...
1567
1568
1569
1570
  /*
   * Update the size of the caches before calling slabs_destroy as it may
   * recursively call kfree.
   */
97654dfa2   Joonsoo Kim   slab: defer slab_...
1571
1572
1573
  static void slabs_destroy(struct kmem_cache *cachep, struct list_head *list)
  {
  	struct page *page, *n;
16cb0ec75   Tobin C. Harding   slab: use slab_li...
1574
1575
  	list_for_each_entry_safe(page, n, list, slab_list) {
  		list_del(&page->slab_list);
97654dfa2   Joonsoo Kim   slab: defer slab_...
1576
1577
1578
  		slab_destroy(cachep, page);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1579
  /**
a70773ddb   Randy.Dunlap   [PATCH] mm/slab: ...
1580
1581
1582
   * calculate_slab_order - calculate size (page order) of slabs
   * @cachep: pointer to the cache that is being created
   * @size: size of objects to be created in this cache.
a70773ddb   Randy.Dunlap   [PATCH] mm/slab: ...
1583
1584
1585
   * @flags: slab allocation flags
   *
   * Also calculates the number of objects per slab.
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1586
1587
1588
1589
   *
   * This could be made much more intelligent.  For now, try to avoid using
   * high order pages for slabs.  When the gfp() functions are more friendly
   * towards high-order requests, this should be changed.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
1590
1591
   *
   * Return: number of left-over bytes in a slab
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1592
   */
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1593
  static size_t calculate_slab_order(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1594
  				size_t size, slab_flags_t flags)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1595
1596
  {
  	size_t left_over = 0;
9888e6fa7   Linus Torvalds   slab: clarify and...
1597
  	int gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1598

0aa817f07   Christoph Lameter   Slab allocators: ...
1599
  	for (gfporder = 0; gfporder <= KMALLOC_MAX_ORDER; gfporder++) {
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1600
1601
  		unsigned int num;
  		size_t remainder;
70f75067b   Joonsoo Kim   mm/slab: avoid re...
1602
  		num = cache_estimate(gfporder, size, flags, &remainder);
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1603
1604
  		if (!num)
  			continue;
9888e6fa7   Linus Torvalds   slab: clarify and...
1605

f315e3fa1   Joonsoo Kim   slab: restrict th...
1606
1607
1608
  		/* Can't handle number of objects more than SLAB_OBJ_MAX_NUM */
  		if (num > SLAB_OBJ_MAX_NUM)
  			break;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1609
  		if (flags & CFLGS_OFF_SLAB) {
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1610
1611
1612
1613
1614
1615
1616
  			struct kmem_cache *freelist_cache;
  			size_t freelist_size;
  
  			freelist_size = num * sizeof(freelist_idx_t);
  			freelist_cache = kmalloc_slab(freelist_size, 0u);
  			if (!freelist_cache)
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1617
  			/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1618
  			 * Needed to avoid possible looping condition
76b342bdc   Joonsoo Kim   mm/slab: separate...
1619
  			 * in cache_grow_begin()
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1620
  			 */
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1621
1622
  			if (OFF_SLAB(freelist_cache))
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1623

3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1624
1625
1626
  			/* check if off slab has enough benefit */
  			if (freelist_cache->size > cachep->size / 2)
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1627
  		}
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1628

9888e6fa7   Linus Torvalds   slab: clarify and...
1629
  		/* Found something acceptable - save it away */
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1630
  		cachep->num = num;
9888e6fa7   Linus Torvalds   slab: clarify and...
1631
  		cachep->gfporder = gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1632
1633
1634
  		left_over = remainder;
  
  		/*
f78bb8ad4   Linus Torvalds   slab: fix calcula...
1635
1636
1637
1638
1639
1640
1641
1642
  		 * A VFS-reclaimable slab tends to have most allocations
  		 * as GFP_NOFS and we really don't want to have to be allocating
  		 * higher-order pages when we are unable to shrink dcache.
  		 */
  		if (flags & SLAB_RECLAIM_ACCOUNT)
  			break;
  
  		/*
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1643
1644
1645
  		 * Large number of objects is good, but very large slabs are
  		 * currently bad for the gfp()s.
  		 */
543585cc5   David Rientjes   slab: rename slab...
1646
  		if (gfporder >= slab_max_order)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1647
  			break;
9888e6fa7   Linus Torvalds   slab: clarify and...
1648
1649
1650
  		/*
  		 * Acceptable internal fragmentation?
  		 */
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1651
  		if (left_over * 8 <= (PAGE_SIZE << gfporder))
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1652
1653
1654
1655
  			break;
  	}
  	return left_over;
  }
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1656
1657
1658
1659
1660
1661
1662
1663
  static struct array_cache __percpu *alloc_kmem_cache_cpus(
  		struct kmem_cache *cachep, int entries, int batchcount)
  {
  	int cpu;
  	size_t size;
  	struct array_cache __percpu *cpu_cache;
  
  	size = sizeof(void *) * entries + sizeof(struct array_cache);
85c9f4b04   Joonsoo Kim   mm/slab: fix unal...
1664
  	cpu_cache = __alloc_percpu(size, sizeof(void *));
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
  
  	if (!cpu_cache)
  		return NULL;
  
  	for_each_possible_cpu(cpu) {
  		init_arraycache(per_cpu_ptr(cpu_cache, cpu),
  				entries, batchcount);
  	}
  
  	return cpu_cache;
  }
bd721ea73   Fabian Frederick   treewide: replace...
1676
  static int __ref setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp)
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1677
  {
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1678
  	if (slab_state >= FULL)
83b519e8b   Pekka Enberg   slab: setup alloc...
1679
  		return enable_cpucache(cachep, gfp);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
1680

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1681
1682
1683
  	cachep->cpu_cache = alloc_kmem_cache_cpus(cachep, 1, 1);
  	if (!cachep->cpu_cache)
  		return 1;
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1684
  	if (slab_state == DOWN) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1685
1686
  		/* Creation of first cache (kmem_cache). */
  		set_up_node(kmem_cache, CACHE_CACHE);
2f9baa9fc   Christoph Lameter   slab: Use the new...
1687
  	} else if (slab_state == PARTIAL) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1688
1689
  		/* For kmem_cache_node */
  		set_up_node(cachep, SIZE_NODE);
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1690
  	} else {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1691
  		int node;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1692

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1693
1694
1695
1696
1697
  		for_each_online_node(node) {
  			cachep->node[node] = kmalloc_node(
  				sizeof(struct kmem_cache_node), gfp, node);
  			BUG_ON(!cachep->node[node]);
  			kmem_cache_node_init(cachep->node[node]);
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1698
1699
  		}
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1700

6a67368c3   Christoph Lameter   slab: Rename node...
1701
  	cachep->node[numa_mem_id()]->next_reap =
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
1702
1703
  			jiffies + REAPTIMEOUT_NODE +
  			((unsigned long)cachep) % REAPTIMEOUT_NODE;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1704
1705
1706
1707
1708
1709
1710
  
  	cpu_cache_get(cachep)->avail = 0;
  	cpu_cache_get(cachep)->limit = BOOT_CPUCACHE_ENTRIES;
  	cpu_cache_get(cachep)->batchcount = 1;
  	cpu_cache_get(cachep)->touched = 0;
  	cachep->batchcount = 1;
  	cachep->limit = BOOT_CPUCACHE_ENTRIES;
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
1711
  	return 0;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1712
  }
0293d1fdd   Alexey Dobriyan   slab: make kmem_c...
1713
  slab_flags_t kmem_cache_flags(unsigned int object_size,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1714
  	slab_flags_t flags, const char *name,
12220dea0   Joonsoo Kim   mm/slab: support ...
1715
1716
1717
1718
1719
1720
  	void (*ctor)(void *))
  {
  	return flags;
  }
  
  struct kmem_cache *
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
1721
  __kmem_cache_alias(const char *name, unsigned int size, unsigned int align,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1722
  		   slab_flags_t flags, void (*ctor)(void *))
12220dea0   Joonsoo Kim   mm/slab: support ...
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
  {
  	struct kmem_cache *cachep;
  
  	cachep = find_mergeable(size, align, flags, name, ctor);
  	if (cachep) {
  		cachep->refcount++;
  
  		/*
  		 * Adjust the object sizes so that we clear
  		 * the complete object on kzalloc.
  		 */
  		cachep->object_size = max_t(int, cachep->object_size, size);
  	}
  	return cachep;
  }
b03a017be   Joonsoo Kim   mm/slab: introduc...
1738
  static bool set_objfreelist_slab_cache(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1739
  			size_t size, slab_flags_t flags)
b03a017be   Joonsoo Kim   mm/slab: introduc...
1740
1741
1742
1743
  {
  	size_t left;
  
  	cachep->num = 0;
6471384af   Alexander Potapenko   mm: security: int...
1744
1745
1746
1747
1748
1749
1750
  	/*
  	 * If slab auto-initialization on free is enabled, store the freelist
  	 * off-slab, so that its contents don't end up in one of the allocated
  	 * objects.
  	 */
  	if (unlikely(slab_want_init_on_free(cachep)))
  		return false;
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1751
  	if (cachep->ctor || flags & SLAB_TYPESAFE_BY_RCU)
b03a017be   Joonsoo Kim   mm/slab: introduc...
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
  		return false;
  
  	left = calculate_slab_order(cachep, size,
  			flags | CFLGS_OBJFREELIST_SLAB);
  	if (!cachep->num)
  		return false;
  
  	if (cachep->num * sizeof(freelist_idx_t) > cachep->object_size)
  		return false;
  
  	cachep->colour = left / cachep->colour_off;
  
  	return true;
  }
158e319bb   Joonsoo Kim   mm/slab: clean up...
1766
  static bool set_off_slab_cache(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1767
  			size_t size, slab_flags_t flags)
158e319bb   Joonsoo Kim   mm/slab: clean up...
1768
1769
1770
1771
1772
1773
  {
  	size_t left;
  
  	cachep->num = 0;
  
  	/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1774
1775
  	 * Always use on-slab management when SLAB_NOLEAKTRACE
  	 * to avoid recursive calls into kmemleak.
158e319bb   Joonsoo Kim   mm/slab: clean up...
1776
  	 */
158e319bb   Joonsoo Kim   mm/slab: clean up...
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
  	if (flags & SLAB_NOLEAKTRACE)
  		return false;
  
  	/*
  	 * Size is large, assume best to place the slab management obj
  	 * off-slab (should allow better packing of objs).
  	 */
  	left = calculate_slab_order(cachep, size, flags | CFLGS_OFF_SLAB);
  	if (!cachep->num)
  		return false;
  
  	/*
  	 * If the slab has been placed off-slab, and we have enough space then
  	 * move it on-slab. This is at the expense of any extra colouring.
  	 */
  	if (left >= cachep->num * sizeof(freelist_idx_t))
  		return false;
  
  	cachep->colour = left / cachep->colour_off;
  
  	return true;
  }
  
  static bool set_on_slab_cache(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1801
  			size_t size, slab_flags_t flags)
158e319bb   Joonsoo Kim   mm/slab: clean up...
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
  {
  	size_t left;
  
  	cachep->num = 0;
  
  	left = calculate_slab_order(cachep, size, flags);
  	if (!cachep->num)
  		return false;
  
  	cachep->colour = left / cachep->colour_off;
  
  	return true;
  }
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1815
  /**
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
1816
   * __kmem_cache_create - Create a cache.
a755b76ab   Randy Dunlap   mm: fix slab.c ke...
1817
   * @cachep: cache management descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1818
   * @flags: SLAB flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1819
1820
1821
   *
   * Returns a ptr to the cache on success, NULL on failure.
   * Cannot be called within a int, but can be interrupted.
20c2df83d   Paul Mundt   mm: Remove slab d...
1822
   * The @ctor is run when new pages are allocated by the cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1823
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1824
1825
1826
1827
1828
1829
1830
1831
   * 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.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1832
1833
1834
   * %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.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
1835
1836
   *
   * Return: a pointer to the created cache or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1837
   */
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1838
  int __kmem_cache_create(struct kmem_cache *cachep, slab_flags_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1839
  {
d4a5fca59   David Rientjes   mm, slab: initial...
1840
  	size_t ralign = BYTES_PER_WORD;
83b519e8b   Pekka Enberg   slab: setup alloc...
1841
  	gfp_t gfp;
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1842
  	int err;
be4a7988b   Alexey Dobriyan   kasan: make kasan...
1843
  	unsigned int size = cachep->size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1844

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1845
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1846
1847
1848
1849
1850
1851
1852
  #if FORCED_DEBUG
  	/*
  	 * Enable redzoning and last user accounting, except for caches with
  	 * large objects, if the increased size would increase the object size
  	 * above the next power of two: caches with object sizes just above a
  	 * power of two have a significant amount of internal fragmentation.
  	 */
87a927c71   David Woodhouse   Fix slab redzone ...
1853
1854
  	if (size < 4096 || fls(size - 1) == fls(size-1 + REDZONE_ALIGN +
  						2 * sizeof(unsigned long long)))
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1855
  		flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1856
  	if (!(flags & SLAB_TYPESAFE_BY_RCU))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1857
1858
  		flags |= SLAB_POISON;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1859
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1860

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1861
1862
  	/*
  	 * Check that size is in terms of words.  This is needed to avoid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1863
1864
1865
  	 * unaligned accesses for some archs when redzoning is used, and makes
  	 * sure any on-slab bufctl's are also correctly aligned.
  	 */
e07719502   Canjiang Lu   mm/slab.c: replac...
1866
  	size = ALIGN(size, BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1867

87a927c71   David Woodhouse   Fix slab redzone ...
1868
1869
1870
1871
  	if (flags & SLAB_RED_ZONE) {
  		ralign = REDZONE_ALIGN;
  		/* If redzoning, ensure that the second redzone is suitably
  		 * aligned, by adjusting the object size accordingly. */
e07719502   Canjiang Lu   mm/slab.c: replac...
1872
  		size = ALIGN(size, REDZONE_ALIGN);
87a927c71   David Woodhouse   Fix slab redzone ...
1873
  	}
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1874

a44b56d35   Kevin Hilman   [PATCH] slab debu...
1875
  	/* 3) caller mandated alignment */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1876
1877
  	if (ralign < cachep->align) {
  		ralign = cachep->align;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1878
  	}
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1879
1880
  	/* disable debug if necessary */
  	if (ralign > __alignof__(unsigned long long))
a44b56d35   Kevin Hilman   [PATCH] slab debu...
1881
  		flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1882
  	/*
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1883
  	 * 4) Store it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1884
  	 */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1885
  	cachep->align = ralign;
158e319bb   Joonsoo Kim   mm/slab: clean up...
1886
1887
1888
1889
  	cachep->colour_off = cache_line_size();
  	/* Offset must be a multiple of the alignment. */
  	if (cachep->colour_off < cachep->align)
  		cachep->colour_off = cachep->align;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1890

83b519e8b   Pekka Enberg   slab: setup alloc...
1891
1892
1893
1894
  	if (slab_is_available())
  		gfp = GFP_KERNEL;
  	else
  		gfp = GFP_NOWAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1895
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1896

ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1897
1898
1899
1900
  	/*
  	 * Both debugging options require word-alignment which is calculated
  	 * into align above.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1901
  	if (flags & SLAB_RED_ZONE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1902
  		/* add space for red zone words */
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1903
1904
  		cachep->obj_offset += sizeof(unsigned long long);
  		size += 2 * sizeof(unsigned long long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1905
1906
  	}
  	if (flags & SLAB_STORE_USER) {
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1907
  		/* user store requires one word storage behind the end of
87a927c71   David Woodhouse   Fix slab redzone ...
1908
1909
  		 * the real object. But if the second red zone needs to be
  		 * aligned to 64 bits, we must allow that much space.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910
  		 */
87a927c71   David Woodhouse   Fix slab redzone ...
1911
1912
1913
1914
  		if (flags & SLAB_RED_ZONE)
  			size += REDZONE_ALIGN;
  		else
  			size += BYTES_PER_WORD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1915
  	}
832a15d20   Joonsoo Kim   mm/slab: align ca...
1916
  #endif
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
1917
  	kasan_cache_create(cachep, &size, &flags);
832a15d20   Joonsoo Kim   mm/slab: align ca...
1918
1919
1920
1921
1922
1923
1924
1925
1926
  	size = ALIGN(size, cachep->align);
  	/*
  	 * We should restrict the number of objects in a slab to implement
  	 * byte sized index. Refer comment on SLAB_OBJ_MIN_SIZE definition.
  	 */
  	if (FREELIST_BYTE_INDEX && size < SLAB_OBJ_MIN_SIZE)
  		size = ALIGN(SLAB_OBJ_MIN_SIZE, cachep->align);
  
  #if DEBUG
03a2d2a3e   Joonsoo Kim   mm/slab: fix unex...
1927
1928
1929
1930
1931
1932
1933
  	/*
  	 * To activate debug pagealloc, off-slab management is necessary
  	 * requirement. In early phase of initialization, small sized slab
  	 * doesn't get initialized so it would not be possible. So, we need
  	 * to check size >= 256. It guarantees that all necessary small
  	 * sized slab is initialized in current slab initialization sequence.
  	 */
8e57f8acb   Vlastimil Babka   mm, debug_pageall...
1934
  	if (debug_pagealloc_enabled_static() && (flags & SLAB_POISON) &&
f3a3c320d   Joonsoo Kim   mm/slab: do not c...
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
  		size >= 256 && cachep->object_size > cache_line_size()) {
  		if (size < PAGE_SIZE || size % PAGE_SIZE == 0) {
  			size_t tmp_size = ALIGN(size, PAGE_SIZE);
  
  			if (set_off_slab_cache(cachep, tmp_size, flags)) {
  				flags |= CFLGS_OFF_SLAB;
  				cachep->obj_offset += tmp_size - size;
  				size = tmp_size;
  				goto done;
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1946
1947
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1948

b03a017be   Joonsoo Kim   mm/slab: introduc...
1949
1950
1951
1952
  	if (set_objfreelist_slab_cache(cachep, size, flags)) {
  		flags |= CFLGS_OBJFREELIST_SLAB;
  		goto done;
  	}
158e319bb   Joonsoo Kim   mm/slab: clean up...
1953
  	if (set_off_slab_cache(cachep, size, flags)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1954
  		flags |= CFLGS_OFF_SLAB;
158e319bb   Joonsoo Kim   mm/slab: clean up...
1955
  		goto done;
832a15d20   Joonsoo Kim   mm/slab: align ca...
1956
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1957

158e319bb   Joonsoo Kim   mm/slab: clean up...
1958
1959
  	if (set_on_slab_cache(cachep, size, flags))
  		goto done;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1960

158e319bb   Joonsoo Kim   mm/slab: clean up...
1961
  	return -E2BIG;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1962

158e319bb   Joonsoo Kim   mm/slab: clean up...
1963
1964
  done:
  	cachep->freelist_size = cachep->num * sizeof(freelist_idx_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1965
  	cachep->flags = flags;
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1966
  	cachep->allocflags = __GFP_COMP;
a3187e438   Yang Shi   mm: slab: remove ...
1967
  	if (flags & SLAB_CACHE_DMA)
a618e89f1   Glauber Costa   slab: rename gfpf...
1968
  		cachep->allocflags |= GFP_DMA;
6d6ea1e96   Nicolas Boichat   mm: add support f...
1969
1970
  	if (flags & SLAB_CACHE_DMA32)
  		cachep->allocflags |= GFP_DMA32;
a3ba07444   David Rientjes   mm/slab.c: only s...
1971
1972
  	if (flags & SLAB_RECLAIM_ACCOUNT)
  		cachep->allocflags |= __GFP_RECLAIMABLE;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
1973
  	cachep->size = size;
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
1974
  	cachep->reciprocal_buffer_size = reciprocal_value(size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1975

40b441379   Joonsoo Kim   mm/slab: clean up...
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
  #if DEBUG
  	/*
  	 * If we're going to use the generic kernel_map_pages()
  	 * poisoning, then it's going to smash the contents of
  	 * the redzone and userword anyhow, so switch them off.
  	 */
  	if (IS_ENABLED(CONFIG_PAGE_POISONING) &&
  		(cachep->flags & SLAB_POISON) &&
  		is_debug_pagealloc_cache(cachep))
  		cachep->flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
  #endif
  
  	if (OFF_SLAB(cachep)) {
158e319bb   Joonsoo Kim   mm/slab: clean up...
1989
1990
  		cachep->freelist_cache =
  			kmalloc_slab(cachep->freelist_size, 0u);
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
1991
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1992

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1993
1994
  	err = setup_cpu_cache(cachep, gfp);
  	if (err) {
52b4b950b   Dmitry Safonov   mm: slab: free km...
1995
  		__kmem_cache_release(cachep);
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1996
  		return err;
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
1997
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1998

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1999
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2000
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
  
  #if DEBUG
  static void check_irq_off(void)
  {
  	BUG_ON(!irqs_disabled());
  }
  
  static void check_irq_on(void)
  {
  	BUG_ON(irqs_disabled());
  }
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2012
2013
2014
2015
  static void check_mutex_acquired(void)
  {
  	BUG_ON(!mutex_is_locked(&slab_mutex));
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2016
  static void check_spinlock_acquired(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2017
2018
2019
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2020
  	assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2021
2022
  #endif
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2023

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2024
  static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2025
2026
2027
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2028
  	assert_spin_locked(&get_node(cachep, node)->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2029
2030
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2031
2032
2033
  #else
  #define check_irq_off()	do { } while(0)
  #define check_irq_on()	do { } while(0)
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2034
  #define check_mutex_acquired()	do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2035
  #define check_spinlock_acquired(x) do { } while(0)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2036
  #define check_spinlock_acquired_node(x, y) do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2037
  #endif
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
  static void drain_array_locked(struct kmem_cache *cachep, struct array_cache *ac,
  				int node, bool free_all, struct list_head *list)
  {
  	int tofree;
  
  	if (!ac || !ac->avail)
  		return;
  
  	tofree = free_all ? ac->avail : (ac->limit + 4) / 5;
  	if (tofree > ac->avail)
  		tofree = (ac->avail + 1) / 2;
  
  	free_block(cachep, ac->entry, tofree, node, list);
  	ac->avail -= tofree;
  	memmove(ac->entry, &(ac->entry[tofree]), sizeof(void *) * ac->avail);
  }
aab2207cf   Christoph Lameter   [PATCH] slab: mak...
2054

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2055
2056
  static void do_drain(void *arg)
  {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2057
  	struct kmem_cache *cachep = arg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2058
  	struct array_cache *ac;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2059
  	int node = numa_mem_id();
18bf85411   Christoph Lameter   slab: use get_nod...
2060
  	struct kmem_cache_node *n;
97654dfa2   Joonsoo Kim   slab: defer slab_...
2061
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2062
2063
  
  	check_irq_off();
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2064
  	ac = cpu_cache_get(cachep);
18bf85411   Christoph Lameter   slab: use get_nod...
2065
2066
  	n = get_node(cachep, node);
  	spin_lock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
2067
  	free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
2068
  	spin_unlock(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069
  	ac->avail = 0;
678ff6a7a   Shakeel Butt   mm: slab: fix pot...
2070
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2071
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2072
  static void drain_cpu_caches(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2073
  {
ce8eb6c42   Christoph Lameter   slab: Rename list...
2074
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2075
  	int node;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2076
  	LIST_HEAD(list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2077

15c8b6c1a   Jens Axboe   on_each_cpu(): ki...
2078
  	on_each_cpu(do_drain, cachep, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2079
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2080
2081
  	for_each_kmem_cache_node(cachep, node, n)
  		if (n->alien)
ce8eb6c42   Christoph Lameter   slab: Rename list...
2082
  			drain_alien_cache(cachep, n->alien);
a4523a8b3   Roland Dreier   [PATCH] slab: Fix...
2083

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2084
2085
2086
2087
2088
2089
2090
  	for_each_kmem_cache_node(cachep, node, n) {
  		spin_lock_irq(&n->list_lock);
  		drain_array_locked(cachep, n->shared, node, true, &list);
  		spin_unlock_irq(&n->list_lock);
  
  		slabs_destroy(cachep, &list);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2091
  }
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2092
2093
2094
2095
2096
2097
2098
  /*
   * Remove slabs from the list of free slabs.
   * Specify the number of slabs to drain in tofree.
   *
   * Returns the actual number of slabs released.
   */
  static int drain_freelist(struct kmem_cache *cache,
ce8eb6c42   Christoph Lameter   slab: Rename list...
2099
  			struct kmem_cache_node *n, int tofree)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
  {
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2101
2102
  	struct list_head *p;
  	int nr_freed;
8456a648c   Joonsoo Kim   slab: use struct ...
2103
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2104

ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2105
  	nr_freed = 0;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2106
  	while (nr_freed < tofree && !list_empty(&n->slabs_free)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2107

ce8eb6c42   Christoph Lameter   slab: Rename list...
2108
2109
2110
2111
  		spin_lock_irq(&n->list_lock);
  		p = n->slabs_free.prev;
  		if (p == &n->slabs_free) {
  			spin_unlock_irq(&n->list_lock);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2112
2113
  			goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114

16cb0ec75   Tobin C. Harding   slab: use slab_li...
2115
2116
  		page = list_entry(p, struct page, slab_list);
  		list_del(&page->slab_list);
f728b0a5d   Greg Thelen   mm, slab: faster ...
2117
  		n->free_slabs--;
bf00bd345   David Rientjes   mm, slab: maintai...
2118
  		n->total_slabs--;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2119
2120
2121
2122
  		/*
  		 * Safe to drop the lock. The slab is no longer linked
  		 * to the cache.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
2123
2124
  		n->free_objects -= cache->num;
  		spin_unlock_irq(&n->list_lock);
8456a648c   Joonsoo Kim   slab: use struct ...
2125
  		slab_destroy(cache, page);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2126
  		nr_freed++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2127
  	}
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2128
2129
  out:
  	return nr_freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2130
  }
f9e13c0a5   Shakeel Butt   slab, slub: skip ...
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
  bool __kmem_cache_empty(struct kmem_cache *s)
  {
  	int node;
  	struct kmem_cache_node *n;
  
  	for_each_kmem_cache_node(s, node, n)
  		if (!list_empty(&n->slabs_full) ||
  		    !list_empty(&n->slabs_partial))
  			return false;
  	return true;
  }
c9fc58640   Tejun Heo   slab: introduce _...
2142
  int __kmem_cache_shrink(struct kmem_cache *cachep)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2143
  {
18bf85411   Christoph Lameter   slab: use get_nod...
2144
2145
  	int ret = 0;
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2146
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2147
2148
2149
2150
  
  	drain_cpu_caches(cachep);
  
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2151
  	for_each_kmem_cache_node(cachep, node, n) {
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
2152
  		drain_freelist(cachep, n, INT_MAX);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2153

ce8eb6c42   Christoph Lameter   slab: Rename list...
2154
2155
  		ret += !list_empty(&n->slabs_full) ||
  			!list_empty(&n->slabs_partial);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2156
2157
2158
  	}
  	return (ret ? 1 : 0);
  }
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
2159
  int __kmem_cache_shutdown(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2160
  {
c9fc58640   Tejun Heo   slab: introduce _...
2161
  	return __kmem_cache_shrink(cachep);
52b4b950b   Dmitry Safonov   mm: slab: free km...
2162
2163
2164
2165
  }
  
  void __kmem_cache_release(struct kmem_cache *cachep)
  {
12c3667fb   Christoph Lameter   mm/sl[aou]b: Get ...
2166
  	int i;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2167
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2168

c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2169
  	cache_random_seq_destroy(cachep);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
2170
  	free_percpu(cachep->cpu_cache);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2171

ce8eb6c42   Christoph Lameter   slab: Rename list...
2172
  	/* NUMA: free the node structures */
18bf85411   Christoph Lameter   slab: use get_nod...
2173
2174
2175
2176
2177
  	for_each_kmem_cache_node(cachep, i, n) {
  		kfree(n->shared);
  		free_alien_cache(n->alien);
  		kfree(n);
  		cachep->node[i] = NULL;
12c3667fb   Christoph Lameter   mm/sl[aou]b: Get ...
2178
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2179
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2180

e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2181
2182
  /*
   * Get the memory for a slab management obj.
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
   *
   * For a slab cache when the slab descriptor is off-slab, the
   * slab descriptor can't come from the same cache which is being created,
   * Because if it is the case, that means we defer the creation of
   * the kmalloc_{dma,}_cache of size sizeof(slab descriptor) to this point.
   * And we eventually call down to __kmem_cache_create(), which
   * in turn looks up in the kmalloc_{dma,}_caches for the disired-size one.
   * This is a "chicken-and-egg" problem.
   *
   * So the off-slab slab descriptor shall come from the kmalloc_{dma,}_caches,
   * which are all initialized during kmem_cache_init().
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2194
   */
7e0073552   Joonsoo Kim   slab: replace non...
2195
  static void *alloc_slabmgmt(struct kmem_cache *cachep,
0c3aa83e0   Joonsoo Kim   slab: change retu...
2196
2197
  				   struct page *page, int colour_off,
  				   gfp_t local_flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2198
  {
7e0073552   Joonsoo Kim   slab: replace non...
2199
  	void *freelist;
0c3aa83e0   Joonsoo Kim   slab: change retu...
2200
  	void *addr = page_address(page);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2201

51dedad06   Andrey Konovalov   kasan, slab: make...
2202
  	page->s_mem = addr + colour_off;
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2203
  	page->active = 0;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2204
2205
2206
  	if (OBJFREELIST_SLAB(cachep))
  		freelist = NULL;
  	else if (OFF_SLAB(cachep)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2207
  		/* Slab management obj is off-slab. */
8456a648c   Joonsoo Kim   slab: use struct ...
2208
  		freelist = kmem_cache_alloc_node(cachep->freelist_cache,
8759ec50a   Pekka Enberg   slab: remove GFP_...
2209
  					      local_flags, nodeid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2210
  	} else {
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2211
2212
2213
  		/* We will use last bytes at the slab for freelist */
  		freelist = addr + (PAGE_SIZE << cachep->gfporder) -
  				cachep->freelist_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2214
  	}
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2215

8456a648c   Joonsoo Kim   slab: use struct ...
2216
  	return freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2217
  }
7cc68973c   Joonsoo Kim   slab: fix the typ...
2218
  static inline freelist_idx_t get_free_obj(struct page *page, unsigned int idx)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2219
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2220
  	return ((freelist_idx_t *)page->freelist)[idx];
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2221
2222
2223
  }
  
  static inline void set_free_obj(struct page *page,
7cc68973c   Joonsoo Kim   slab: fix the typ...
2224
  					unsigned int idx, freelist_idx_t val)
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2225
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2226
  	((freelist_idx_t *)(page->freelist))[idx] = val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2227
  }
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2228
  static void cache_init_objs_debug(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2229
  {
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2230
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2231
2232
2233
  	int i;
  
  	for (i = 0; i < cachep->num; i++) {
8456a648c   Joonsoo Kim   slab: use struct ...
2234
  		void *objp = index_to_obj(cachep, page, i);
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2235

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2236
2237
2238
2239
2240
2241
2242
2243
  		if (cachep->flags & SLAB_STORE_USER)
  			*dbg_userword(cachep, objp) = NULL;
  
  		if (cachep->flags & SLAB_RED_ZONE) {
  			*dbg_redzone1(cachep, objp) = RED_INACTIVE;
  			*dbg_redzone2(cachep, objp) = RED_INACTIVE;
  		}
  		/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2244
2245
2246
  		 * Constructors are not allowed to allocate memory from the same
  		 * cache which they are a constructor for.  Otherwise, deadlock.
  		 * They must also be threaded.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2247
  		 */
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2248
2249
2250
  		if (cachep->ctor && !(cachep->flags & SLAB_POISON)) {
  			kasan_unpoison_object_data(cachep,
  						   objp + obj_offset(cachep));
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
2251
  			cachep->ctor(objp + obj_offset(cachep));
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2252
2253
2254
  			kasan_poison_object_data(
  				cachep, objp + obj_offset(cachep));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2255
2256
2257
  
  		if (cachep->flags & SLAB_RED_ZONE) {
  			if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2258
  				slab_error(cachep, "constructor overwrote the end of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2259
  			if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2260
  				slab_error(cachep, "constructor overwrote the start of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2261
  		}
40b441379   Joonsoo Kim   mm/slab: clean up...
2262
2263
2264
  		/* need to poison the objs? */
  		if (cachep->flags & SLAB_POISON) {
  			poison_obj(cachep, objp, POISON_FREE);
80552f0f7   Qian Cai   mm/slab: Remove s...
2265
  			slab_kernel_map(cachep, objp, 0);
40b441379   Joonsoo Kim   mm/slab: clean up...
2266
  		}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2267
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2268
  #endif
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2269
  }
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2270
2271
2272
2273
2274
  #ifdef CONFIG_SLAB_FREELIST_RANDOM
  /* Hold information during a freelist initialization */
  union freelist_init_state {
  	struct {
  		unsigned int pos;
7c00fce98   Thomas Garnier   mm: reorganize SL...
2275
  		unsigned int *list;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2276
  		unsigned int count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
  	};
  	struct rnd_state rnd_state;
  };
  
  /*
   * Initialize the state based on the randomization methode available.
   * return true if the pre-computed list is available, false otherwize.
   */
  static bool freelist_state_initialize(union freelist_init_state *state,
  				struct kmem_cache *cachep,
  				unsigned int count)
  {
  	bool ret;
  	unsigned int rand;
  
  	/* Use best entropy available to define a random shift */
7c00fce98   Thomas Garnier   mm: reorganize SL...
2293
  	rand = get_random_int();
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2294
2295
2296
2297
2298
2299
2300
2301
  
  	/* Use a random state if the pre-computed list is not available */
  	if (!cachep->random_seq) {
  		prandom_seed_state(&state->rnd_state, rand);
  		ret = false;
  	} else {
  		state->list = cachep->random_seq;
  		state->count = count;
c4e490cf1   John Sperbeck   mm/slab.c: fix SL...
2302
  		state->pos = rand % count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2303
2304
2305
2306
2307
2308
2309
2310
  		ret = true;
  	}
  	return ret;
  }
  
  /* Get the next entry on the list and randomize it using a random shift */
  static freelist_idx_t next_random_slot(union freelist_init_state *state)
  {
c4e490cf1   John Sperbeck   mm/slab.c: fix SL...
2311
2312
2313
  	if (state->pos >= state->count)
  		state->pos = 0;
  	return state->list[state->pos++];
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2314
  }
7c00fce98   Thomas Garnier   mm: reorganize SL...
2315
2316
2317
2318
2319
2320
  /* Swap two freelist entries */
  static void swap_free_obj(struct page *page, unsigned int a, unsigned int b)
  {
  	swap(((freelist_idx_t *)page->freelist)[a],
  		((freelist_idx_t *)page->freelist)[b]);
  }
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2321
2322
2323
2324
2325
2326
  /*
   * Shuffle the freelist initialization state based on pre-computed lists.
   * return true if the list was successfully shuffled, false otherwise.
   */
  static bool shuffle_freelist(struct kmem_cache *cachep, struct page *page)
  {
7c00fce98   Thomas Garnier   mm: reorganize SL...
2327
  	unsigned int objfreelist = 0, i, rand, count = cachep->num;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
  	union freelist_init_state state;
  	bool precomputed;
  
  	if (count < 2)
  		return false;
  
  	precomputed = freelist_state_initialize(&state, cachep, count);
  
  	/* Take a random entry as the objfreelist */
  	if (OBJFREELIST_SLAB(cachep)) {
  		if (!precomputed)
  			objfreelist = count - 1;
  		else
  			objfreelist = next_random_slot(&state);
  		page->freelist = index_to_obj(cachep, page, objfreelist) +
  						obj_offset(cachep);
  		count--;
  	}
  
  	/*
  	 * On early boot, generate the list dynamically.
  	 * Later use a pre-computed list for speed.
  	 */
  	if (!precomputed) {
7c00fce98   Thomas Garnier   mm: reorganize SL...
2352
2353
2354
2355
2356
2357
2358
2359
2360
  		for (i = 0; i < count; i++)
  			set_free_obj(page, i, i);
  
  		/* Fisher-Yates shuffle */
  		for (i = count - 1; i > 0; i--) {
  			rand = prandom_u32_state(&state.rnd_state);
  			rand %= (i + 1);
  			swap_free_obj(page, i, rand);
  		}
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
  	} else {
  		for (i = 0; i < count; i++)
  			set_free_obj(page, i, next_random_slot(&state));
  	}
  
  	if (OBJFREELIST_SLAB(cachep))
  		set_free_obj(page, cachep->num - 1, objfreelist);
  
  	return true;
  }
  #else
  static inline bool shuffle_freelist(struct kmem_cache *cachep,
  				struct page *page)
  {
  	return false;
  }
  #endif /* CONFIG_SLAB_FREELIST_RANDOM */
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2378
2379
2380
2381
  static void cache_init_objs(struct kmem_cache *cachep,
  			    struct page *page)
  {
  	int i;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2382
  	void *objp;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2383
  	bool shuffled;
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2384
2385
  
  	cache_init_objs_debug(cachep, page);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2386
2387
2388
2389
  	/* Try to randomize the freelist if enabled */
  	shuffled = shuffle_freelist(cachep, page);
  
  	if (!shuffled && OBJFREELIST_SLAB(cachep)) {
b03a017be   Joonsoo Kim   mm/slab: introduc...
2390
2391
2392
  		page->freelist = index_to_obj(cachep, page, cachep->num - 1) +
  						obj_offset(cachep);
  	}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2393
  	for (i = 0; i < cachep->num; i++) {
b3cbd9bf7   Andrey Ryabinin   mm/kasan: get rid...
2394
  		objp = index_to_obj(cachep, page, i);
4d176711e   Andrey Konovalov   kasan: preassign ...
2395
  		objp = kasan_init_slab_obj(cachep, objp);
b3cbd9bf7   Andrey Ryabinin   mm/kasan: get rid...
2396

10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2397
  		/* constructor could break poison info */
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2398
  		if (DEBUG == 0 && cachep->ctor) {
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2399
2400
2401
2402
  			kasan_unpoison_object_data(cachep, objp);
  			cachep->ctor(objp);
  			kasan_poison_object_data(cachep, objp);
  		}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2403

c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2404
2405
  		if (!shuffled)
  			set_free_obj(page, i, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2406
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2408
  static void *slab_get_obj(struct kmem_cache *cachep, struct page *page)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2409
  {
b1cb0982b   Joonsoo Kim   slab: change the ...
2410
  	void *objp;
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2411

e5c58dfdc   Joonsoo Kim   slab: introduce h...
2412
  	objp = index_to_obj(cachep, page, get_free_obj(page, page->active));
8456a648c   Joonsoo Kim   slab: use struct ...
2413
  	page->active++;
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2414
2415
2416
  
  	return objp;
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2417
2418
  static void slab_put_obj(struct kmem_cache *cachep,
  			struct page *page, void *objp)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2419
  {
8456a648c   Joonsoo Kim   slab: use struct ...
2420
  	unsigned int objnr = obj_to_index(cachep, page, objp);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2421
  #if DEBUG
16025177e   Joonsoo Kim   slab: remove kmem...
2422
  	unsigned int i;
b1cb0982b   Joonsoo Kim   slab: change the ...
2423

b1cb0982b   Joonsoo Kim   slab: change the ...
2424
  	/* Verify double free bug */
8456a648c   Joonsoo Kim   slab: use struct ...
2425
  	for (i = page->active; i < cachep->num; i++) {
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2426
  		if (get_free_obj(page, i) == objnr) {
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
2427
2428
  			pr_err("slab: double free detected in cache '%s', objp %px
  ",
756a025f0   Joe Perches   mm: coalesce spli...
2429
  			       cachep->name, objp);
b1cb0982b   Joonsoo Kim   slab: change the ...
2430
2431
  			BUG();
  		}
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2432
2433
  	}
  #endif
8456a648c   Joonsoo Kim   slab: use struct ...
2434
  	page->active--;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2435
2436
  	if (!page->freelist)
  		page->freelist = objp + obj_offset(cachep);
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2437
  	set_free_obj(page, page->active, objnr);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2438
  }
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2439
2440
2441
  /*
   * Map pages beginning at addr to the given cache and slab. This is required
   * for the slab allocator to be able to lookup the cache and slab of a
ccd35fb9f   Nick Piggin   kernel: kmem_ptr_...
2442
   * virtual address for kfree, ksize, and slab debugging.
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2443
   */
8456a648c   Joonsoo Kim   slab: use struct ...
2444
  static void slab_map_pages(struct kmem_cache *cache, struct page *page,
7e0073552   Joonsoo Kim   slab: replace non...
2445
  			   void *freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2446
  {
a57a49887   Joonsoo Kim   slab: use __GFP_C...
2447
  	page->slab_cache = cache;
8456a648c   Joonsoo Kim   slab: use struct ...
2448
  	page->freelist = freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2449
2450
2451
2452
2453
2454
  }
  
  /*
   * Grow (by 1) the number of slabs within a cache.  This is called by
   * kmem_cache_alloc() when there are no active objs left in a cache.
   */
76b342bdc   Joonsoo Kim   mm/slab: separate...
2455
2456
  static struct page *cache_grow_begin(struct kmem_cache *cachep,
  				gfp_t flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2457
  {
7e0073552   Joonsoo Kim   slab: replace non...
2458
  	void *freelist;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2459
2460
  	size_t offset;
  	gfp_t local_flags;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2461
  	int page_node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2462
  	struct kmem_cache_node *n;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2463
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2464

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2465
2466
2467
  	/*
  	 * Be lazy and only check for valid flags here,  keeping it out of the
  	 * critical path in kmem_cache_alloc().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2468
  	 */
444050990   Long Li   mm, slab: check G...
2469
2470
  	if (unlikely(flags & GFP_SLAB_BUG_MASK))
  		flags = kmalloc_fix_flags(flags);
128227e7f   Matthew Wilcox   slab: __GFP_ZERO ...
2471
  	WARN_ON_ONCE(cachep->ctor && (flags & __GFP_ZERO));
6cb062296   Christoph Lameter   Categorize GFP flags
2472
  	local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2473

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2474
  	check_irq_off();
d0164adc8   Mel Gorman   mm, page_alloc: d...
2475
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2476
2477
2478
  		local_irq_enable();
  
  	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2479
2480
  	 * Get mem for the objs.  Attempt to allocate a physical page from
  	 * 'nodeid'.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2481
  	 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
2482
  	page = kmem_getpages(cachep, local_flags, nodeid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
2483
  	if (!page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2484
  		goto failed;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2485
2486
  	page_node = page_to_nid(page);
  	n = get_node(cachep, page_node);
03d1d43a1   Joonsoo Kim   mm/slab: racy acc...
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
  
  	/* Get colour for the slab, and cal the next value. */
  	n->colour_next++;
  	if (n->colour_next >= cachep->colour)
  		n->colour_next = 0;
  
  	offset = n->colour_next;
  	if (offset >= cachep->colour)
  		offset = 0;
  
  	offset *= cachep->colour_off;
51dedad06   Andrey Konovalov   kasan, slab: make...
2498
2499
2500
2501
2502
2503
  	/*
  	 * Call kasan_poison_slab() before calling alloc_slabmgmt(), so
  	 * page_address() in the latter returns a non-tagged pointer,
  	 * as it should be for slab pages.
  	 */
  	kasan_poison_slab(page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2504
  	/* Get slab management. */
8456a648c   Joonsoo Kim   slab: use struct ...
2505
  	freelist = alloc_slabmgmt(cachep, page, offset,
511e3a058   Joonsoo Kim   mm/slab: make cac...
2506
  			local_flags & ~GFP_CONSTRAINT_MASK, page_node);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2507
  	if (OFF_SLAB(cachep) && !freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2508
  		goto opps1;
8456a648c   Joonsoo Kim   slab: use struct ...
2509
  	slab_map_pages(cachep, page, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2510

8456a648c   Joonsoo Kim   slab: use struct ...
2511
  	cache_init_objs(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2512

d0164adc8   Mel Gorman   mm, page_alloc: d...
2513
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2514
  		local_irq_disable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2515

76b342bdc   Joonsoo Kim   mm/slab: separate...
2516
  	return page;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2517
  opps1:
0c3aa83e0   Joonsoo Kim   slab: change retu...
2518
  	kmem_freepages(cachep, page);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2519
  failed:
d0164adc8   Mel Gorman   mm, page_alloc: d...
2520
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2521
  		local_irq_disable();
76b342bdc   Joonsoo Kim   mm/slab: separate...
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
  	return NULL;
  }
  
  static void cache_grow_end(struct kmem_cache *cachep, struct page *page)
  {
  	struct kmem_cache_node *n;
  	void *list = NULL;
  
  	check_irq_off();
  
  	if (!page)
  		return;
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2534
  	INIT_LIST_HEAD(&page->slab_list);
76b342bdc   Joonsoo Kim   mm/slab: separate...
2535
2536
2537
  	n = get_node(cachep, page_to_nid(page));
  
  	spin_lock(&n->list_lock);
bf00bd345   David Rientjes   mm, slab: maintai...
2538
  	n->total_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2539
  	if (!page->active) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2540
  		list_add_tail(&page->slab_list, &n->slabs_free);
f728b0a5d   Greg Thelen   mm, slab: faster ...
2541
  		n->free_slabs++;
bf00bd345   David Rientjes   mm, slab: maintai...
2542
  	} else
76b342bdc   Joonsoo Kim   mm/slab: separate...
2543
  		fixup_slab_list(cachep, n, page, &list);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
2544

76b342bdc   Joonsoo Kim   mm/slab: separate...
2545
2546
2547
2548
2549
  	STATS_INC_GROWN(cachep);
  	n->free_objects += cachep->num - page->active;
  	spin_unlock(&n->list_lock);
  
  	fixup_objfreelist_debug(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2550
2551
2552
2553
2554
2555
2556
2557
  }
  
  #if DEBUG
  
  /*
   * Perform extra freeing checks:
   * - detect bad pointers.
   * - POISON/RED_ZONE checking
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2558
2559
2560
   */
  static void kfree_debugcheck(const void *objp)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2561
  	if (!virt_addr_valid(objp)) {
1170532bb   Joe Perches   mm: convert print...
2562
2563
  		pr_err("kfree_debugcheck: out of range ptr %lxh
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2564
2565
  		       (unsigned long)objp);
  		BUG();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2566
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2567
  }
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2568
2569
  static inline void verify_redzone_free(struct kmem_cache *cache, void *obj)
  {
b46b8f19c   David Woodhouse   Increase slab red...
2570
  	unsigned long long redzone1, redzone2;
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
  
  	redzone1 = *dbg_redzone1(cache, obj);
  	redzone2 = *dbg_redzone2(cache, obj);
  
  	/*
  	 * Redzone is ok.
  	 */
  	if (redzone1 == RED_ACTIVE && redzone2 == RED_ACTIVE)
  		return;
  
  	if (redzone1 == RED_INACTIVE && redzone2 == RED_INACTIVE)
  		slab_error(cache, "double free detected");
  	else
  		slab_error(cache, "memory outside object was overwritten");
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
2585
2586
  	pr_err("%px: redzone 1:0x%llx, redzone 2:0x%llx
  ",
1170532bb   Joe Perches   mm: convert print...
2587
  	       obj, redzone1, redzone2);
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2588
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2589
  static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2590
  				   unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2591
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2592
  	unsigned int objnr;
8456a648c   Joonsoo Kim   slab: use struct ...
2593
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2594

80cbd911c   Matthew Wilcox   Fix kmem_cache_fr...
2595
  	BUG_ON(virt_to_cache(objp) != cachep);
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
2596
  	objp -= obj_offset(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2597
  	kfree_debugcheck(objp);
b49af68ff   Christoph Lameter   Add virt_to_head_...
2598
  	page = virt_to_head_page(objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2599

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2600
  	if (cachep->flags & SLAB_RED_ZONE) {
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2601
  		verify_redzone_free(cachep, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2602
2603
2604
  		*dbg_redzone1(cachep, objp) = RED_INACTIVE;
  		*dbg_redzone2(cachep, objp) = RED_INACTIVE;
  	}
7878c231d   Qian Cai   slab: remove /pro...
2605
  	if (cachep->flags & SLAB_STORE_USER)
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2606
  		*dbg_userword(cachep, objp) = (void *)caller;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2607

8456a648c   Joonsoo Kim   slab: use struct ...
2608
  	objnr = obj_to_index(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2609
2610
  
  	BUG_ON(objnr >= cachep->num);
8456a648c   Joonsoo Kim   slab: use struct ...
2611
  	BUG_ON(objp != index_to_obj(cachep, page, objnr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2612

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2613
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2614
  		poison_obj(cachep, objp, POISON_FREE);
80552f0f7   Qian Cai   mm/slab: Remove s...
2615
  		slab_kernel_map(cachep, objp, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2616
2617
2618
  	}
  	return objp;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2619
2620
2621
  #else
  #define kfree_debugcheck(x) do { } while(0)
  #define cache_free_debugcheck(x,objp,z) (objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2622
  #endif
b03a017be   Joonsoo Kim   mm/slab: introduc...
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
  static inline void fixup_objfreelist_debug(struct kmem_cache *cachep,
  						void **list)
  {
  #if DEBUG
  	void *next = *list;
  	void *objp;
  
  	while (next) {
  		objp = next - obj_offset(cachep);
  		next = *(void **)next;
  		poison_obj(cachep, objp, POISON_FREE);
  	}
  #endif
  }
d8410234d   Joonsoo Kim   mm/slab: factor o...
2637
  static inline void fixup_slab_list(struct kmem_cache *cachep,
b03a017be   Joonsoo Kim   mm/slab: introduc...
2638
2639
  				struct kmem_cache_node *n, struct page *page,
  				void **list)
d8410234d   Joonsoo Kim   mm/slab: factor o...
2640
2641
  {
  	/* move slabp to correct slabp list: */
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2642
  	list_del(&page->slab_list);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2643
  	if (page->active == cachep->num) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2644
  		list_add(&page->slab_list, &n->slabs_full);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
  		if (OBJFREELIST_SLAB(cachep)) {
  #if DEBUG
  			/* Poisoning will be done without holding the lock */
  			if (cachep->flags & SLAB_POISON) {
  				void **objp = page->freelist;
  
  				*objp = *list;
  				*list = objp;
  			}
  #endif
  			page->freelist = NULL;
  		}
  	} else
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2658
  		list_add(&page->slab_list, &n->slabs_partial);
d8410234d   Joonsoo Kim   mm/slab: factor o...
2659
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2660
2661
  /* Try to find non-pfmemalloc slab if needed */
  static noinline struct page *get_valid_first_slab(struct kmem_cache_node *n,
bf00bd345   David Rientjes   mm, slab: maintai...
2662
  					struct page *page, bool pfmemalloc)
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
  {
  	if (!page)
  		return NULL;
  
  	if (pfmemalloc)
  		return page;
  
  	if (!PageSlabPfmemalloc(page))
  		return page;
  
  	/* No need to keep pfmemalloc slab if we have enough free objects */
  	if (n->free_objects > n->free_limit) {
  		ClearPageSlabPfmemalloc(page);
  		return page;
  	}
  
  	/* Move pfmemalloc slab to the end of list to speed up next search */
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2680
  	list_del(&page->slab_list);
bf00bd345   David Rientjes   mm, slab: maintai...
2681
  	if (!page->active) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2682
  		list_add_tail(&page->slab_list, &n->slabs_free);
bf00bd345   David Rientjes   mm, slab: maintai...
2683
  		n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2684
  	} else
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2685
  		list_add_tail(&page->slab_list, &n->slabs_partial);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2686

16cb0ec75   Tobin C. Harding   slab: use slab_li...
2687
  	list_for_each_entry(page, &n->slabs_partial, slab_list) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2688
2689
2690
  		if (!PageSlabPfmemalloc(page))
  			return page;
  	}
f728b0a5d   Greg Thelen   mm, slab: faster ...
2691
  	n->free_touched = 1;
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2692
  	list_for_each_entry(page, &n->slabs_free, slab_list) {
f728b0a5d   Greg Thelen   mm, slab: faster ...
2693
  		if (!PageSlabPfmemalloc(page)) {
bf00bd345   David Rientjes   mm, slab: maintai...
2694
  			n->free_slabs--;
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2695
  			return page;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2696
  		}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2697
2698
2699
2700
2701
2702
  	}
  
  	return NULL;
  }
  
  static struct page *get_first_slab(struct kmem_cache_node *n, bool pfmemalloc)
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2703
2704
  {
  	struct page *page;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2705
  	assert_spin_locked(&n->list_lock);
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2706
2707
  	page = list_first_entry_or_null(&n->slabs_partial, struct page,
  					slab_list);
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2708
2709
  	if (!page) {
  		n->free_touched = 1;
bf00bd345   David Rientjes   mm, slab: maintai...
2710
  		page = list_first_entry_or_null(&n->slabs_free, struct page,
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2711
  						slab_list);
f728b0a5d   Greg Thelen   mm, slab: faster ...
2712
  		if (page)
bf00bd345   David Rientjes   mm, slab: maintai...
2713
  			n->free_slabs--;
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2714
  	}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2715
  	if (sk_memalloc_socks())
bf00bd345   David Rientjes   mm, slab: maintai...
2716
  		page = get_valid_first_slab(n, page, pfmemalloc);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2717

7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2718
2719
  	return page;
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
  static noinline void *cache_alloc_pfmemalloc(struct kmem_cache *cachep,
  				struct kmem_cache_node *n, gfp_t flags)
  {
  	struct page *page;
  	void *obj;
  	void *list = NULL;
  
  	if (!gfp_pfmemalloc_allowed(flags))
  		return NULL;
  
  	spin_lock(&n->list_lock);
  	page = get_first_slab(n, true);
  	if (!page) {
  		spin_unlock(&n->list_lock);
  		return NULL;
  	}
  
  	obj = slab_get_obj(cachep, page);
  	n->free_objects--;
  
  	fixup_slab_list(cachep, n, page, &list);
  
  	spin_unlock(&n->list_lock);
  	fixup_objfreelist_debug(cachep, &list);
  
  	return obj;
  }
213b46958   Joonsoo Kim   mm/slab: refill c...
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
  /*
   * Slab list should be fixed up by fixup_slab_list() for existing slab
   * or cache_grow_end() for new slab
   */
  static __always_inline int alloc_block(struct kmem_cache *cachep,
  		struct array_cache *ac, struct page *page, int batchcount)
  {
  	/*
  	 * There must be at least one object available for
  	 * allocation.
  	 */
  	BUG_ON(page->active >= cachep->num);
  
  	while (page->active < cachep->num && batchcount--) {
  		STATS_INC_ALLOCED(cachep);
  		STATS_INC_ACTIVE(cachep);
  		STATS_SET_HIGH(cachep);
  
  		ac->entry[ac->avail++] = slab_get_obj(cachep, page);
  	}
  
  	return batchcount;
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2770
  static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2771
2772
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2773
  	struct kmem_cache_node *n;
801faf0db   Joonsoo Kim   mm/slab: lockless...
2774
  	struct array_cache *ac, *shared;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2775
  	int node;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2776
  	void *list = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2777
  	struct page *page;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2778

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2779
  	check_irq_off();
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2780
  	node = numa_mem_id();
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2781

9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2782
  	ac = cpu_cache_get(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2783
2784
  	batchcount = ac->batchcount;
  	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2785
2786
2787
2788
  		/*
  		 * If there was little recent activity on this cache, then
  		 * perform only a partial refill.  Otherwise we could generate
  		 * refill bouncing.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2789
2790
2791
  		 */
  		batchcount = BATCHREFILL_LIMIT;
  	}
18bf85411   Christoph Lameter   slab: use get_nod...
2792
  	n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2793

ce8eb6c42   Christoph Lameter   slab: Rename list...
2794
  	BUG_ON(ac->avail > 0 || !n);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2795
2796
2797
  	shared = READ_ONCE(n->shared);
  	if (!n->free_objects && (!shared || !shared->avail))
  		goto direct_grow;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2798
  	spin_lock(&n->list_lock);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2799
  	shared = READ_ONCE(n->shared);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2800

3ded175a4   Christoph Lameter   [PATCH] slab: add...
2801
  	/* See if we can refill from the shared array */
801faf0db   Joonsoo Kim   mm/slab: lockless...
2802
2803
  	if (shared && transfer_objects(ac, shared, batchcount)) {
  		shared->touched = 1;
3ded175a4   Christoph Lameter   [PATCH] slab: add...
2804
  		goto alloc_done;
44b57f1cc   Nick Piggin   slab: fix regress...
2805
  	}
3ded175a4   Christoph Lameter   [PATCH] slab: add...
2806

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2807
  	while (batchcount > 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808
  		/* Get slab alloc is to come from. */
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2809
  		page = get_first_slab(n, false);
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2810
2811
  		if (!page)
  			goto must_grow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2812

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2813
  		check_spinlock_acquired(cachep);
714b8171a   Pekka Enberg   slab: ensure cach...
2814

213b46958   Joonsoo Kim   mm/slab: refill c...
2815
  		batchcount = alloc_block(cachep, ac, page, batchcount);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2816
  		fixup_slab_list(cachep, n, page, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2817
  	}
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2818
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2819
  	n->free_objects -= ac->avail;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2820
  alloc_done:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2821
  	spin_unlock(&n->list_lock);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2822
  	fixup_objfreelist_debug(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2823

801faf0db   Joonsoo Kim   mm/slab: lockless...
2824
  direct_grow:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2825
  	if (unlikely(!ac->avail)) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2826
2827
2828
2829
2830
2831
2832
  		/* Check if we can use obj in pfmemalloc slab */
  		if (sk_memalloc_socks()) {
  			void *obj = cache_alloc_pfmemalloc(cachep, n, flags);
  
  			if (obj)
  				return obj;
  		}
76b342bdc   Joonsoo Kim   mm/slab: separate...
2833
  		page = cache_grow_begin(cachep, gfp_exact_node(flags), node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2834

76b342bdc   Joonsoo Kim   mm/slab: separate...
2835
2836
2837
2838
  		/*
  		 * cache_grow_begin() can reenable interrupts,
  		 * then ac could change.
  		 */
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2839
  		ac = cpu_cache_get(cachep);
213b46958   Joonsoo Kim   mm/slab: refill c...
2840
2841
2842
  		if (!ac->avail && page)
  			alloc_block(cachep, ac, page, batchcount);
  		cache_grow_end(cachep, page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2843

213b46958   Joonsoo Kim   mm/slab: refill c...
2844
  		if (!ac->avail)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2845
  			return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2846
2847
  	}
  	ac->touched = 1;
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2848

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2849
  	return ac->entry[--ac->avail];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2850
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2851
2852
  static inline void cache_alloc_debugcheck_before(struct kmem_cache *cachep,
  						gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2853
  {
d0164adc8   Mel Gorman   mm, page_alloc: d...
2854
  	might_sleep_if(gfpflags_allow_blocking(flags));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2855
2856
2857
  }
  
  #if DEBUG
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2858
  static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2859
  				gfp_t flags, void *objp, unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2860
  {
128227e7f   Matthew Wilcox   slab: __GFP_ZERO ...
2861
  	WARN_ON_ONCE(cachep->ctor && (flags & __GFP_ZERO));
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2862
  	if (!objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2863
  		return objp;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2864
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2865
  		check_poison_obj(cachep, objp);
80552f0f7   Qian Cai   mm/slab: Remove s...
2866
  		slab_kernel_map(cachep, objp, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2867
2868
2869
  		poison_obj(cachep, objp, POISON_INUSE);
  	}
  	if (cachep->flags & SLAB_STORE_USER)
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2870
  		*dbg_userword(cachep, objp) = (void *)caller;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2871
2872
  
  	if (cachep->flags & SLAB_RED_ZONE) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2873
2874
  		if (*dbg_redzone1(cachep, objp) != RED_INACTIVE ||
  				*dbg_redzone2(cachep, objp) != RED_INACTIVE) {
756a025f0   Joe Perches   mm: coalesce spli...
2875
  			slab_error(cachep, "double free, or memory outside object was overwritten");
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
2876
2877
  			pr_err("%px: redzone 1:0x%llx, redzone 2:0x%llx
  ",
1170532bb   Joe Perches   mm: convert print...
2878
2879
  			       objp, *dbg_redzone1(cachep, objp),
  			       *dbg_redzone2(cachep, objp));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2880
2881
2882
2883
  		}
  		*dbg_redzone1(cachep, objp) = RED_ACTIVE;
  		*dbg_redzone2(cachep, objp) = RED_ACTIVE;
  	}
037873014   Joonsoo Kim   slab: fix oops wh...
2884

3dafccf22   Manfred Spraul   [PATCH] slab: dis...
2885
  	objp += obj_offset(cachep);
4f1049345   Christoph Lameter   slab allocators: ...
2886
  	if (cachep->ctor && cachep->flags & SLAB_POISON)
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
2887
  		cachep->ctor(objp);
7ea466f22   Tetsuo Handa   slab: fix DEBUG_S...
2888
2889
  	if (ARCH_SLAB_MINALIGN &&
  	    ((unsigned long)objp & (ARCH_SLAB_MINALIGN-1))) {
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
2890
2891
  		pr_err("0x%px: not aligned to ARCH_SLAB_MINALIGN=%d
  ",
c225150b8   Hugh Dickins   slab: fix DEBUG_S...
2892
  		       objp, (int)ARCH_SLAB_MINALIGN);
a44b56d35   Kevin Hilman   [PATCH] slab debu...
2893
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2894
2895
2896
2897
2898
  	return objp;
  }
  #else
  #define cache_alloc_debugcheck_after(a,b,objp,d) (objp)
  #endif
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2899
  static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2900
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2901
  	void *objp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2902
  	struct array_cache *ac;
5c3823008   Alok N Kataria   [PATCH] kmalloc_n...
2903
  	check_irq_off();
8a8b6502f   Akinobu Mita   [PATCH] fault-inj...
2904

9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2905
  	ac = cpu_cache_get(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2906
  	if (likely(ac->avail)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2907
  		ac->touched = 1;
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2908
  		objp = ac->entry[--ac->avail];
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2909

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2910
2911
  		STATS_INC_ALLOCHIT(cachep);
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2912
  	}
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2913
2914
  
  	STATS_INC_ALLOCMISS(cachep);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2915
  	objp = cache_alloc_refill(cachep, flags);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2916
2917
2918
2919
2920
2921
2922
  	/*
  	 * the 'ac' may be updated by cache_alloc_refill(),
  	 * and kmemleak_erase() requires its correct value.
  	 */
  	ac = cpu_cache_get(cachep);
  
  out:
d5cff6352   Catalin Marinas   kmemleak: Add the...
2923
2924
2925
2926
2927
  	/*
  	 * To avoid a false negative, if an object that is in one of the
  	 * per-CPU caches is leaked, we need to make sure kmemleak doesn't
  	 * treat the array pointers as a reference to the object.
  	 */
f3d8b53a3   J. R. Okajima   slab, kmemleak: s...
2928
2929
  	if (objp)
  		kmemleak_erase(&ac->entry[ac->avail]);
5c3823008   Alok N Kataria   [PATCH] kmalloc_n...
2930
2931
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2932
2933
  #ifdef CONFIG_NUMA
  /*
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
2934
   * Try allocating on another node if PFA_SPREAD_SLAB is a mempolicy is set.
c61afb181   Paul Jackson   [PATCH] cpuset me...
2935
2936
2937
2938
2939
2940
2941
   *
   * If we are in_interrupt, then process context, including cpusets and
   * mempolicy, may not apply and should not be used for allocation policy.
   */
  static void *alternate_node_alloc(struct kmem_cache *cachep, gfp_t flags)
  {
  	int nid_alloc, nid_here;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2942
  	if (in_interrupt() || (flags & __GFP_THISNODE))
c61afb181   Paul Jackson   [PATCH] cpuset me...
2943
  		return NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2944
  	nid_alloc = nid_here = numa_mem_id();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2945
  	if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD))
6adef3ebe   Jack Steiner   cpusets: new roun...
2946
  		nid_alloc = cpuset_slab_spread_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2947
  	else if (current->mempolicy)
2a389610a   David Rientjes   mm, mempolicy: re...
2948
  		nid_alloc = mempolicy_slab_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2949
  	if (nid_alloc != nid_here)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
2950
  		return ____cache_alloc_node(cachep, flags, nid_alloc);
c61afb181   Paul Jackson   [PATCH] cpuset me...
2951
2952
2953
2954
  	return NULL;
  }
  
  /*
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2955
   * Fallback function if there was no memory available and no objects on a
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2956
   * certain node and fall back is permitted. First we scan all the
6a67368c3   Christoph Lameter   slab: Rename node...
2957
   * available node for available objects. If that fails then we
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2958
2959
2960
   * perform an allocation without specifying a node. This allows the page
   * allocator to do its reclaim / fallback magic. We then insert the
   * slab into the proper nodelist and then allocate from it.
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2961
   */
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2962
  static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2963
  {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2964
  	struct zonelist *zonelist;
dd1a239f6   Mel Gorman   mm: have zonelist...
2965
  	struct zoneref *z;
54a6eb5c4   Mel Gorman   mm: use two zonel...
2966
  	struct zone *zone;
97a225e69   Joonsoo Kim   mm/page_alloc: in...
2967
  	enum zone_type highest_zoneidx = gfp_zone(flags);
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2968
  	void *obj = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2969
  	struct page *page;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2970
  	int nid;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2971
  	unsigned int cpuset_mems_cookie;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2972
2973
2974
  
  	if (flags & __GFP_THISNODE)
  		return NULL;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2975
  retry_cpuset:
d26914d11   Mel Gorman   mm: optimize put_...
2976
  	cpuset_mems_cookie = read_mems_allowed_begin();
2a389610a   David Rientjes   mm, mempolicy: re...
2977
  	zonelist = node_zonelist(mempolicy_slab_node(), flags);
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2978

3c517a613   Christoph Lameter   [PATCH] slab: bet...
2979
2980
2981
2982
2983
  retry:
  	/*
  	 * Look through allowed nodes for objects available
  	 * from existing per node queues.
  	 */
97a225e69   Joonsoo Kim   mm/page_alloc: in...
2984
  	for_each_zone_zonelist(zone, z, zonelist, highest_zoneidx) {
54a6eb5c4   Mel Gorman   mm: use two zonel...
2985
  		nid = zone_to_nid(zone);
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
2986

061d7074e   Vladimir Davydov   slab: fix cpuset ...
2987
  		if (cpuset_zone_allowed(zone, flags) &&
18bf85411   Christoph Lameter   slab: use get_nod...
2988
2989
  			get_node(cache, nid) &&
  			get_node(cache, nid)->free_objects) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2990
  				obj = ____cache_alloc_node(cache,
4167e9b2c   David Rientjes   mm: remove GFP_TH...
2991
  					gfp_exact_node(flags), nid);
481c5346d   Christoph Lameter   Slab: Fix memory ...
2992
2993
2994
  				if (obj)
  					break;
  		}
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2995
  	}
cfce66047   Christoph Lameter   Slab allocators: ...
2996
  	if (!obj) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2997
2998
2999
3000
3001
3002
  		/*
  		 * This allocation will be performed within the constraints
  		 * of the current cpuset / memory policy requirements.
  		 * We may trigger various forms of reclaim on the allowed
  		 * set and go into memory reserves if necessary.
  		 */
76b342bdc   Joonsoo Kim   mm/slab: separate...
3003
3004
3005
3006
  		page = cache_grow_begin(cache, flags, numa_mem_id());
  		cache_grow_end(cache, page);
  		if (page) {
  			nid = page_to_nid(page);
511e3a058   Joonsoo Kim   mm/slab: make cac...
3007
3008
  			obj = ____cache_alloc_node(cache,
  				gfp_exact_node(flags), nid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
3009

3c517a613   Christoph Lameter   [PATCH] slab: bet...
3010
  			/*
511e3a058   Joonsoo Kim   mm/slab: make cac...
3011
3012
  			 * Another processor may allocate the objects in
  			 * the slab since we are not holding any locks.
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3013
  			 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
3014
3015
  			if (!obj)
  				goto retry;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3016
  		}
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
3017
  	}
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3018

d26914d11   Mel Gorman   mm: optimize put_...
3019
  	if (unlikely(!obj && read_mems_allowed_retry(cpuset_mems_cookie)))
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3020
  		goto retry_cpuset;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
3021
3022
3023
3024
  	return obj;
  }
  
  /*
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3025
   * A interface to enable slab creation on nodeid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3026
   */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3027
  static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags,
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3028
  				int nodeid)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3029
  {
8456a648c   Joonsoo Kim   slab: use struct ...
3030
  	struct page *page;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3031
  	struct kmem_cache_node *n;
213b46958   Joonsoo Kim   mm/slab: refill c...
3032
  	void *obj = NULL;
b03a017be   Joonsoo Kim   mm/slab: introduc...
3033
  	void *list = NULL;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3034

7c3fbbdd0   Paul Mackerras   slab: fix nodeid ...
3035
  	VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES);
18bf85411   Christoph Lameter   slab: use get_nod...
3036
  	n = get_node(cachep, nodeid);
ce8eb6c42   Christoph Lameter   slab: Rename list...
3037
  	BUG_ON(!n);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3038

ca3b9b917   Ravikiran G Thirumalai   [PATCH] NUMA slab...
3039
  	check_irq_off();
ce8eb6c42   Christoph Lameter   slab: Rename list...
3040
  	spin_lock(&n->list_lock);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
3041
  	page = get_first_slab(n, false);
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
3042
3043
  	if (!page)
  		goto must_grow;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3044

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3045
  	check_spinlock_acquired_node(cachep, nodeid);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3046
3047
3048
3049
  
  	STATS_INC_NODEALLOCS(cachep);
  	STATS_INC_ACTIVE(cachep);
  	STATS_SET_HIGH(cachep);
8456a648c   Joonsoo Kim   slab: use struct ...
3050
  	BUG_ON(page->active == cachep->num);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3051

260b61dd4   Joonsoo Kim   mm/slab: remove t...
3052
  	obj = slab_get_obj(cachep, page);
ce8eb6c42   Christoph Lameter   slab: Rename list...
3053
  	n->free_objects--;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3054

b03a017be   Joonsoo Kim   mm/slab: introduc...
3055
  	fixup_slab_list(cachep, n, page, &list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3056

ce8eb6c42   Christoph Lameter   slab: Rename list...
3057
  	spin_unlock(&n->list_lock);
b03a017be   Joonsoo Kim   mm/slab: introduc...
3058
  	fixup_objfreelist_debug(cachep, &list);
213b46958   Joonsoo Kim   mm/slab: refill c...
3059
  	return obj;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3060

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3061
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
3062
  	spin_unlock(&n->list_lock);
76b342bdc   Joonsoo Kim   mm/slab: separate...
3063
  	page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid);
213b46958   Joonsoo Kim   mm/slab: refill c...
3064
3065
3066
3067
  	if (page) {
  		/* This slab isn't counted yet so don't update free_objects */
  		obj = slab_get_obj(cachep, page);
  	}
76b342bdc   Joonsoo Kim   mm/slab: separate...
3068
  	cache_grow_end(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3069

213b46958   Joonsoo Kim   mm/slab: refill c...
3070
  	return obj ? obj : fallback_alloc(cachep, flags);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3071
  }
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3072

8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3073
  static __always_inline void *
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3074
  slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3075
  		   unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3076
3077
3078
  {
  	unsigned long save_flags;
  	void *ptr;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3079
  	int slab_node = numa_mem_id();
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3080
  	struct obj_cgroup *objcg = NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3081

dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3082
  	flags &= gfp_allowed_mask;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3083
  	cachep = slab_pre_alloc_hook(cachep, &objcg, 1, flags);
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3084
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3085
  		return NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3086
3087
  	cache_alloc_debugcheck_before(cachep, flags);
  	local_irq_save(save_flags);
eacbbae38   Andrew Morton   slab: use NUMA_NO...
3088
  	if (nodeid == NUMA_NO_NODE)
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3089
  		nodeid = slab_node;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3090

18bf85411   Christoph Lameter   slab: use get_nod...
3091
  	if (unlikely(!get_node(cachep, nodeid))) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3092
3093
3094
3095
  		/* Node not bootstrapped yet */
  		ptr = fallback_alloc(cachep, flags);
  		goto out;
  	}
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3096
  	if (nodeid == slab_node) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
  		/*
  		 * Use the locally cached objects if possible.
  		 * However ____cache_alloc does not allow fallback
  		 * to other nodes. It may fail while we still have
  		 * objects on other nodes available.
  		 */
  		ptr = ____cache_alloc(cachep, flags);
  		if (ptr)
  			goto out;
  	}
  	/* ___cache_alloc_node can fall back to other nodes */
  	ptr = ____cache_alloc_node(cachep, flags, nodeid);
    out:
  	local_irq_restore(save_flags);
  	ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, caller);
6471384af   Alexander Potapenko   mm: security: int...
3112
  	if (unlikely(slab_want_init_on_alloc(flags, cachep)) && ptr)
d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3113
  		memset(ptr, 0, cachep->object_size);
d07dbea46   Christoph Lameter   Slab allocators: ...
3114

964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3115
  	slab_post_alloc_hook(cachep, objcg, flags, 1, &ptr);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3116
3117
3118
3119
3120
3121
3122
  	return ptr;
  }
  
  static __always_inline void *
  __do_cache_alloc(struct kmem_cache *cache, gfp_t flags)
  {
  	void *objp;
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
3123
  	if (current->mempolicy || cpuset_do_slab_mem_spread()) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
  		objp = alternate_node_alloc(cache, flags);
  		if (objp)
  			goto out;
  	}
  	objp = ____cache_alloc(cache, flags);
  
  	/*
  	 * We may just have run out of memory on the local node.
  	 * ____cache_alloc_node() knows how to locate memory on other nodes
  	 */
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3134
3135
  	if (!objp)
  		objp = ____cache_alloc_node(cache, flags, numa_mem_id());
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
  
    out:
  	return objp;
  }
  #else
  
  static __always_inline void *
  __do_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
  {
  	return ____cache_alloc(cachep, flags);
  }
  
  #endif /* CONFIG_NUMA */
  
  static __always_inline void *
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3151
  slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3152
3153
3154
  {
  	unsigned long save_flags;
  	void *objp;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3155
  	struct obj_cgroup *objcg = NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3156

dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3157
  	flags &= gfp_allowed_mask;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3158
  	cachep = slab_pre_alloc_hook(cachep, &objcg, 1, flags);
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3159
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3160
  		return NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3161
3162
3163
3164
3165
3166
  	cache_alloc_debugcheck_before(cachep, flags);
  	local_irq_save(save_flags);
  	objp = __do_cache_alloc(cachep, flags);
  	local_irq_restore(save_flags);
  	objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
  	prefetchw(objp);
6471384af   Alexander Potapenko   mm: security: int...
3167
  	if (unlikely(slab_want_init_on_alloc(flags, cachep)) && objp)
d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3168
  		memset(objp, 0, cachep->object_size);
d07dbea46   Christoph Lameter   Slab allocators: ...
3169

964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3170
  	slab_post_alloc_hook(cachep, objcg, flags, 1, &objp);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3171
3172
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3173
3174
  
  /*
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3175
   * Caller needs to acquire correct kmem_cache_node's list_lock
97654dfa2   Joonsoo Kim   slab: defer slab_...
3176
   * @list: List of detached free slabs should be freed by caller
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3177
   */
97654dfa2   Joonsoo Kim   slab: defer slab_...
3178
3179
  static void free_block(struct kmem_cache *cachep, void **objpp,
  			int nr_objects, int node, struct list_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3180
3181
  {
  	int i;
25c063fbd   Joonsoo Kim   slab: move up cod...
3182
  	struct kmem_cache_node *n = get_node(cachep, node);
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3183
3184
3185
  	struct page *page;
  
  	n->free_objects += nr_objects;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3186
3187
  
  	for (i = 0; i < nr_objects; i++) {
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3188
  		void *objp;
8456a648c   Joonsoo Kim   slab: use struct ...
3189
  		struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3190

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3191
  		objp = objpp[i];
8456a648c   Joonsoo Kim   slab: use struct ...
3192
  		page = virt_to_head_page(objp);
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3193
  		list_del(&page->slab_list);
ff69416e6   Christoph Lameter   [PATCH] slab: fix...
3194
  		check_spinlock_acquired_node(cachep, node);
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3195
  		slab_put_obj(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3196
  		STATS_DEC_ACTIVE(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3197
3198
  
  		/* fixup slab chains */
f728b0a5d   Greg Thelen   mm, slab: faster ...
3199
  		if (page->active == 0) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3200
  			list_add(&page->slab_list, &n->slabs_free);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3201
  			n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3202
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3203
3204
3205
3206
  			/* Unconditionally move a slab to the end of the
  			 * partial list on free - maximum time for the
  			 * other objects to be freed, too.
  			 */
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3207
  			list_add_tail(&page->slab_list, &n->slabs_partial);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3208
3209
  		}
  	}
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3210
3211
3212
  
  	while (n->free_objects > n->free_limit && !list_empty(&n->slabs_free)) {
  		n->free_objects -= cachep->num;
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3213
3214
  		page = list_last_entry(&n->slabs_free, struct page, slab_list);
  		list_move(&page->slab_list, list);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3215
  		n->free_slabs--;
bf00bd345   David Rientjes   mm, slab: maintai...
3216
  		n->total_slabs--;
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3217
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3218
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3219
  static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3220
3221
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3222
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3223
  	int node = numa_mem_id();
97654dfa2   Joonsoo Kim   slab: defer slab_...
3224
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3225
3226
  
  	batchcount = ac->batchcount;
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3227

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3228
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
3229
  	n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
3230
3231
3232
  	spin_lock(&n->list_lock);
  	if (n->shared) {
  		struct array_cache *shared_array = n->shared;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3233
  		int max = shared_array->limit - shared_array->avail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3234
3235
3236
  		if (max) {
  			if (batchcount > max)
  				batchcount = max;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3237
  			memcpy(&(shared_array->entry[shared_array->avail]),
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3238
  			       ac->entry, sizeof(void *) * batchcount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3239
3240
3241
3242
  			shared_array->avail += batchcount;
  			goto free_done;
  		}
  	}
97654dfa2   Joonsoo Kim   slab: defer slab_...
3243
  	free_block(cachep, ac->entry, batchcount, node, &list);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3244
  free_done:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3245
3246
3247
  #if STATS
  	{
  		int i = 0;
73c0219d8   Geliang Tang   mm/slab.c: use li...
3248
  		struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3249

16cb0ec75   Tobin C. Harding   slab: use slab_li...
3250
  		list_for_each_entry(page, &n->slabs_free, slab_list) {
8456a648c   Joonsoo Kim   slab: use struct ...
3251
  			BUG_ON(page->active);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3252
3253
  
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3254
3255
3256
3257
  		}
  		STATS_SET_FREEABLE(cachep, i);
  	}
  #endif
ce8eb6c42   Christoph Lameter   slab: Rename list...
3258
  	spin_unlock(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3259
  	ac->avail -= batchcount;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3260
  	memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail);
678ff6a7a   Shakeel Butt   mm: slab: fix pot...
3261
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3262
3263
3264
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3265
3266
   * Release an obj back to its cache. If the obj has a constructed state, it must
   * be in this state _before_ it is released.  Called with disabled ints.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3267
   */
ee3ce779b   Dmitry Vyukov   kasan: don't use ...
3268
3269
  static __always_inline void __cache_free(struct kmem_cache *cachep, void *objp,
  					 unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3270
  {
55834c590   Alexander Potapenko   mm: kasan: initia...
3271
  	/* Put the object into the quarantine, don't touch it for now. */
ee3ce779b   Dmitry Vyukov   kasan: don't use ...
3272
  	if (kasan_slab_free(cachep, objp, _RET_IP_))
55834c590   Alexander Potapenko   mm: kasan: initia...
3273
  		return;
cfbe1636c   Marco Elver   mm, kcsan: instru...
3274
3275
3276
3277
  	/* Use KCSAN to help debug racy use-after-free. */
  	if (!(cachep->flags & SLAB_TYPESAFE_BY_RCU))
  		__kcsan_check_access(objp, cachep->object_size,
  				     KCSAN_ACCESS_WRITE | KCSAN_ACCESS_ASSERT);
55834c590   Alexander Potapenko   mm: kasan: initia...
3278
3279
  	___cache_free(cachep, objp, caller);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3280

55834c590   Alexander Potapenko   mm: kasan: initia...
3281
3282
3283
3284
  void ___cache_free(struct kmem_cache *cachep, void *objp,
  		unsigned long caller)
  {
  	struct array_cache *ac = cpu_cache_get(cachep);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3285

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3286
  	check_irq_off();
6471384af   Alexander Potapenko   mm: security: int...
3287
3288
  	if (unlikely(slab_want_init_on_free(cachep)))
  		memset(objp, 0, cachep->object_size);
d5cff6352   Catalin Marinas   kmemleak: Add the...
3289
  	kmemleak_free_recursive(objp, cachep->flags);
a947eb95e   Suleiman Souhlal   SLAB: Record actu...
3290
  	objp = cache_free_debugcheck(cachep, objp, caller);
d1b2cf6cb   Bharata B Rao   mm: memcg/slab: u...
3291
  	memcg_slab_free_hook(cachep, &objp, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3292

1807a1aaf   Siddha, Suresh B   slab: skip callin...
3293
3294
3295
3296
3297
3298
3299
  	/*
  	 * Skip calling cache_free_alien() when the platform is not numa.
  	 * This will avoid cache misses that happen while accessing slabp (which
  	 * is per page memory  reference) to get nodeid. Instead use a global
  	 * variable to skip the call, which is mostly likely to be present in
  	 * the cache.
  	 */
b6e68bc1b   Mel Gorman   page allocator: s...
3300
  	if (nr_online_nodes > 1 && cache_free_alien(cachep, objp))
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
3301
  		return;
3d8801940   Joonsoo Kim   mm/slab: move cac...
3302
  	if (ac->avail < ac->limit) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3303
  		STATS_INC_FREEHIT(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3304
3305
3306
  	} else {
  		STATS_INC_FREEMISS(cachep);
  		cache_flusharray(cachep, ac);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3307
  	}
42c8c99cd   Zhao Jin   slab, cleanup: re...
3308

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
3309
3310
3311
3312
3313
3314
3315
3316
  	if (sk_memalloc_socks()) {
  		struct page *page = virt_to_head_page(objp);
  
  		if (unlikely(PageSlabPfmemalloc(page))) {
  			cache_free_pfmemalloc(cachep, page, objp);
  			return;
  		}
  	}
dabc3e291   Kees Cook   mm/slab: add naiv...
3317
  	__free_one(ac, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3318
3319
3320
3321
3322
3323
3324
3325
3326
  }
  
  /**
   * kmem_cache_alloc - Allocate an object
   * @cachep: The cache to allocate from.
   * @flags: See kmalloc().
   *
   * Allocate an object from this cache.  The flags are only relevant
   * if the cache has no available objects.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
3327
3328
   *
   * Return: pointer to the new object or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3329
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3330
  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3331
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3332
  	void *ret = slab_alloc(cachep, flags, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3333

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3334
  	trace_kmem_cache_alloc(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3335
  			       cachep->object_size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3336
3337
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3338
3339
  }
  EXPORT_SYMBOL(kmem_cache_alloc);
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3340
3341
3342
3343
3344
3345
3346
3347
3348
  static __always_inline void
  cache_alloc_debugcheck_after_bulk(struct kmem_cache *s, gfp_t flags,
  				  size_t size, void **p, unsigned long caller)
  {
  	size_t i;
  
  	for (i = 0; i < size; i++)
  		p[i] = cache_alloc_debugcheck_after(s, flags, p[i], caller);
  }
865762a81   Jesper Dangaard Brouer   slab/slub: adjust...
3349
  int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3350
  			  void **p)
484748f0b   Christoph Lameter   slab: infrastruct...
3351
  {
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3352
  	size_t i;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3353
  	struct obj_cgroup *objcg = NULL;
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3354

964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3355
  	s = slab_pre_alloc_hook(s, &objcg, size, flags);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3356
3357
3358
3359
3360
3361
3362
3363
  	if (!s)
  		return 0;
  
  	cache_alloc_debugcheck_before(s, flags);
  
  	local_irq_disable();
  	for (i = 0; i < size; i++) {
  		void *objp = __do_cache_alloc(s, flags);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3364
3365
3366
3367
3368
  		if (unlikely(!objp))
  			goto error;
  		p[i] = objp;
  	}
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3369
  	cache_alloc_debugcheck_after_bulk(s, flags, size, p, _RET_IP_);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3370
  	/* Clear memory outside IRQ disabled section */
6471384af   Alexander Potapenko   mm: security: int...
3371
  	if (unlikely(slab_want_init_on_alloc(flags, s)))
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3372
3373
  		for (i = 0; i < size; i++)
  			memset(p[i], 0, s->object_size);
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3374
  	slab_post_alloc_hook(s, objcg, flags, size, p);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3375
3376
3377
3378
  	/* FIXME: Trace call missing. Christoph would like a bulk variant */
  	return size;
  error:
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3379
  	cache_alloc_debugcheck_after_bulk(s, flags, i, p, _RET_IP_);
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3380
  	slab_post_alloc_hook(s, objcg, flags, i, p);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3381
3382
  	__kmem_cache_free_bulk(s, i, p);
  	return 0;
484748f0b   Christoph Lameter   slab: infrastruct...
3383
3384
  }
  EXPORT_SYMBOL(kmem_cache_alloc_bulk);
0f24f1287   Li Zefan   tracing, slab: De...
3385
  #ifdef CONFIG_TRACING
85beb5869   Steven Rostedt   tracing/slab: Mov...
3386
  void *
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3387
  kmem_cache_alloc_trace(struct kmem_cache *cachep, gfp_t flags, size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3388
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3389
  	void *ret;
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3390
  	ret = slab_alloc(cachep, flags, _RET_IP_);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3391

0116523cf   Andrey Konovalov   kasan, mm: change...
3392
  	ret = kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3393
  	trace_kmalloc(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3394
  		      size, cachep->size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3395
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3396
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3397
  EXPORT_SYMBOL(kmem_cache_alloc_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3398
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3399
  #ifdef CONFIG_NUMA
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
  /**
   * kmem_cache_alloc_node - Allocate an object on the specified node
   * @cachep: The cache to allocate from.
   * @flags: See kmalloc().
   * @nodeid: node number of the target node.
   *
   * Identical to kmem_cache_alloc but it will allocate memory on the given
   * node, which can improve the performance for cpu bound structures.
   *
   * Fallback to other node is possible if __GFP_THISNODE is not set.
a862f68a8   Mike Rapoport   docs/core-api/mm:...
3410
3411
   *
   * Return: pointer to the new object or %NULL in case of error
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3412
   */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3413
3414
  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3415
  	void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3416

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3417
  	trace_kmem_cache_alloc_node(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3418
  				    cachep->object_size, cachep->size,
ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3419
  				    flags, nodeid);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3420
3421
  
  	return ret;
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3422
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3423
  EXPORT_SYMBOL(kmem_cache_alloc_node);
0f24f1287   Li Zefan   tracing, slab: De...
3424
  #ifdef CONFIG_TRACING
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3425
  void *kmem_cache_alloc_node_trace(struct kmem_cache *cachep,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3426
  				  gfp_t flags,
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3427
3428
  				  int nodeid,
  				  size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3429
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3430
  	void *ret;
592f41450   Ezequiel Garcia   mm/slab: Fix typo...
3431
  	ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3432

0116523cf   Andrey Konovalov   kasan, mm: change...
3433
  	ret = kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3434
  	trace_kmalloc_node(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3435
  			   size, cachep->size,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3436
3437
  			   flags, nodeid);
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3438
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3439
  EXPORT_SYMBOL(kmem_cache_alloc_node_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3440
  #endif
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3441
  static __always_inline void *
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3442
  __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3443
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3444
  	struct kmem_cache *cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3445
  	void *ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3446

61448479a   Dmitry Vyukov   mm: don't warn ab...
3447
3448
  	if (unlikely(size > KMALLOC_MAX_CACHE_SIZE))
  		return NULL;
2c59dd654   Christoph Lameter   slab: Common Kmal...
3449
  	cachep = kmalloc_slab(size, flags);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3450
3451
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3452
  	ret = kmem_cache_alloc_node_trace(cachep, flags, node, size);
0116523cf   Andrey Konovalov   kasan, mm: change...
3453
  	ret = kasan_kmalloc(cachep, ret, size, flags);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3454
3455
  
  	return ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3456
  }
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3457

8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3458
3459
  void *__kmalloc_node(size_t size, gfp_t flags, int node)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3460
  	return __do_kmalloc_node(size, flags, node, _RET_IP_);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3461
  }
dbe5e69d2   Christoph Hellwig   [PATCH] slab: opt...
3462
  EXPORT_SYMBOL(__kmalloc_node);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3463
3464
  
  void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3465
  		int node, unsigned long caller)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3466
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3467
  	return __do_kmalloc_node(size, flags, node, caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3468
3469
  }
  EXPORT_SYMBOL(__kmalloc_node_track_caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3470
  #endif /* CONFIG_NUMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3471
3472
  
  /**
800590f52   Paul Drynoff   [PATCH] slab: kma...
3473
   * __do_kmalloc - allocate memory
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3474
   * @size: how many bytes of memory are required.
800590f52   Paul Drynoff   [PATCH] slab: kma...
3475
   * @flags: the type of memory to allocate (see kmalloc).
911851e6e   Randy Dunlap   [PATCH] slab: fix...
3476
   * @caller: function caller for debug tracking of the caller
a862f68a8   Mike Rapoport   docs/core-api/mm:...
3477
3478
   *
   * Return: pointer to the allocated memory or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3479
   */
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3480
  static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3481
  					  unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3482
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3483
  	struct kmem_cache *cachep;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3484
  	void *ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3485

61448479a   Dmitry Vyukov   mm: don't warn ab...
3486
3487
  	if (unlikely(size > KMALLOC_MAX_CACHE_SIZE))
  		return NULL;
2c59dd654   Christoph Lameter   slab: Common Kmal...
3488
  	cachep = kmalloc_slab(size, flags);
a5c96d8a1   Linus Torvalds   Fix up non-NUMA S...
3489
3490
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3491
  	ret = slab_alloc(cachep, flags, caller);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3492

0116523cf   Andrey Konovalov   kasan, mm: change...
3493
  	ret = kasan_kmalloc(cachep, ret, size, flags);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3494
  	trace_kmalloc(caller, ret,
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3495
  		      size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3496
3497
  
  	return ret;
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3498
  }
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3499
3500
  void *__kmalloc(size_t size, gfp_t flags)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3501
  	return __do_kmalloc(size, flags, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3502
3503
  }
  EXPORT_SYMBOL(__kmalloc);
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3504
  void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller)
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3505
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3506
  	return __do_kmalloc(size, flags, caller);
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3507
3508
  }
  EXPORT_SYMBOL(__kmalloc_track_caller);
1d2c8eea6   Christoph Hellwig   [PATCH] slab: cle...
3509

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3510
3511
3512
3513
3514
3515
3516
3517
  /**
   * kmem_cache_free - Deallocate an object
   * @cachep: The cache the allocation was from.
   * @objp: The previously allocated object.
   *
   * Free an object which was previously allocated from this
   * cache.
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3518
  void kmem_cache_free(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3519
3520
  {
  	unsigned long flags;
b9ce5ef49   Glauber Costa   sl[au]b: always g...
3521
3522
3523
  	cachep = cache_from_obj(cachep, objp);
  	if (!cachep)
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3524
3525
  
  	local_irq_save(flags);
d97d476b1   Feng Tang   slab: Fix a typo ...
3526
  	debug_check_no_locks_freed(objp, cachep->object_size);
3ac7fe5a4   Thomas Gleixner   infrastructure to...
3527
  	if (!(cachep->flags & SLAB_DEBUG_OBJECTS))
8c138bc00   Christoph Lameter   slab: Get rid of ...
3528
  		debug_check_no_obj_freed(objp, cachep->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3529
  	__cache_free(cachep, objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3530
  	local_irq_restore(flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3531

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3532
  	trace_kmem_cache_free(_RET_IP_, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3533
3534
  }
  EXPORT_SYMBOL(kmem_cache_free);
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3535
3536
3537
3538
3539
3540
3541
3542
  void kmem_cache_free_bulk(struct kmem_cache *orig_s, size_t size, void **p)
  {
  	struct kmem_cache *s;
  	size_t i;
  
  	local_irq_disable();
  	for (i = 0; i < size; i++) {
  		void *objp = p[i];
ca2571955   Jesper Dangaard Brouer   mm: new API kfree...
3543
3544
3545
3546
  		if (!orig_s) /* called via kfree_bulk */
  			s = virt_to_cache(objp);
  		else
  			s = cache_from_obj(orig_s, objp);
a64b53780   Kees Cook   mm/slab: sanity-c...
3547
3548
  		if (!s)
  			continue;
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
  
  		debug_check_no_locks_freed(objp, s->object_size);
  		if (!(s->flags & SLAB_DEBUG_OBJECTS))
  			debug_check_no_obj_freed(objp, s->object_size);
  
  		__cache_free(s, objp, _RET_IP_);
  	}
  	local_irq_enable();
  
  	/* FIXME: add tracing */
  }
  EXPORT_SYMBOL(kmem_cache_free_bulk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3561
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3562
3563
3564
   * kfree - free previously allocated memory
   * @objp: pointer returned by kmalloc.
   *
80e93effc   Pekka Enberg   [PATCH] update kf...
3565
3566
   * If @objp is NULL, no operation is performed.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3567
3568
3569
3570
3571
   * Don't free memory not originally allocated by kmalloc()
   * or you will run into trouble.
   */
  void kfree(const void *objp)
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3572
  	struct kmem_cache *c;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3573
  	unsigned long flags;
2121db74b   Pekka Enberg   kmemtrace: trace ...
3574
  	trace_kfree(_RET_IP_, objp);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3575
  	if (unlikely(ZERO_OR_NULL_PTR(objp)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3576
3577
3578
  		return;
  	local_irq_save(flags);
  	kfree_debugcheck(objp);
6ed5eb221   Pekka Enberg   [PATCH] slab: ext...
3579
  	c = virt_to_cache(objp);
a64b53780   Kees Cook   mm/slab: sanity-c...
3580
3581
3582
3583
  	if (!c) {
  		local_irq_restore(flags);
  		return;
  	}
8c138bc00   Christoph Lameter   slab: Get rid of ...
3584
3585
3586
  	debug_check_no_locks_freed(objp, c->object_size);
  
  	debug_check_no_obj_freed(objp, c->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3587
  	__cache_free(c, (void *)objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3588
3589
3590
  	local_irq_restore(flags);
  }
  EXPORT_SYMBOL(kfree);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3591
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3592
   * This initializes kmem_cache_node or resizes various caches for all nodes.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3593
   */
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3594
  static int setup_kmem_cache_nodes(struct kmem_cache *cachep, gfp_t gfp)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3595
  {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3596
  	int ret;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3597
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3598
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3599

9c09a95cf   Mel Gorman   slab: partially r...
3600
  	for_each_online_node(node) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3601
3602
  		ret = setup_kmem_cache_node(cachep, node, gfp, true);
  		if (ret)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3603
  			goto fail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3604
  	}
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3605

cafeb02e0   Christoph Lameter   [PATCH] alloc_kme...
3606
  	return 0;
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3607

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3608
  fail:
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3609
  	if (!cachep->list.next) {
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3610
3611
3612
  		/* Cache is not active yet. Roll back what we did */
  		node--;
  		while (node >= 0) {
18bf85411   Christoph Lameter   slab: use get_nod...
3613
3614
  			n = get_node(cachep, node);
  			if (n) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
3615
3616
3617
  				kfree(n->shared);
  				free_alien_cache(n->alien);
  				kfree(n);
6a67368c3   Christoph Lameter   slab: Rename node...
3618
  				cachep->node[node] = NULL;
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3619
3620
3621
3622
  			}
  			node--;
  		}
  	}
cafeb02e0   Christoph Lameter   [PATCH] alloc_kme...
3623
  	return -ENOMEM;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3624
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3625
  /* Always called with the slab_mutex held */
10befea91   Roman Gushchin   mm: memcg/slab: u...
3626
3627
  static int do_tune_cpucache(struct kmem_cache *cachep, int limit,
  			    int batchcount, int shared, gfp_t gfp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3628
  {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3629
3630
  	struct array_cache __percpu *cpu_cache, *prev;
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3631

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3632
3633
  	cpu_cache = alloc_kmem_cache_cpus(cachep, limit, batchcount);
  	if (!cpu_cache)
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
3634
  		return -ENOMEM;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3635
3636
  	prev = cachep->cpu_cache;
  	cachep->cpu_cache = cpu_cache;
a87c75fbc   Greg Thelen   slab: avoid IPIs ...
3637
3638
3639
3640
3641
3642
  	/*
  	 * Without a previous cpu_cache there's no need to synchronize remote
  	 * cpus, so skip the IPIs.
  	 */
  	if (prev)
  		kick_all_cpus_sync();
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3643

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3644
  	check_irq_on();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3645
3646
  	cachep->batchcount = batchcount;
  	cachep->limit = limit;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3647
  	cachep->shared = shared;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3648

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3649
  	if (!prev)
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3650
  		goto setup_node;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3651
3652
  
  	for_each_online_cpu(cpu) {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3653
  		LIST_HEAD(list);
18bf85411   Christoph Lameter   slab: use get_nod...
3654
3655
  		int node;
  		struct kmem_cache_node *n;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3656
  		struct array_cache *ac = per_cpu_ptr(prev, cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3657

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3658
  		node = cpu_to_mem(cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3659
3660
  		n = get_node(cachep, node);
  		spin_lock_irq(&n->list_lock);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3661
  		free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
3662
  		spin_unlock_irq(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
3663
  		slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3664
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3665
  	free_percpu(prev);
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3666
3667
  setup_node:
  	return setup_kmem_cache_nodes(cachep, gfp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3668
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3669
  /* Called with slab_mutex held always */
83b519e8b   Pekka Enberg   slab: setup alloc...
3670
  static int enable_cpucache(struct kmem_cache *cachep, gfp_t gfp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3671
3672
  {
  	int err;
943a451a8   Glauber Costa   slab: propagate t...
3673
3674
3675
  	int limit = 0;
  	int shared = 0;
  	int batchcount = 0;
7c00fce98   Thomas Garnier   mm: reorganize SL...
3676
  	err = cache_random_seq_create(cachep, cachep->num, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3677
3678
  	if (err)
  		goto end;
943a451a8   Glauber Costa   slab: propagate t...
3679
3680
  	if (limit && shared && batchcount)
  		goto skip_setup;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3681
3682
  	/*
  	 * The head array serves three purposes:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3683
3684
  	 * - create a LIFO ordering, i.e. return objects that are cache-warm
  	 * - reduce the number of spinlock operations.
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3685
  	 * - reduce the number of linked list operations on the slab and
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3686
3687
3688
3689
  	 *   bufctl chains: array operations are cheaper.
  	 * The numbers are guessed, we should auto-tune as described by
  	 * Bonwick.
  	 */
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3690
  	if (cachep->size > 131072)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3691
  		limit = 1;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3692
  	else if (cachep->size > PAGE_SIZE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3693
  		limit = 8;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3694
  	else if (cachep->size > 1024)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3695
  		limit = 24;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3696
  	else if (cachep->size > 256)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3697
3698
3699
  		limit = 54;
  	else
  		limit = 120;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3700
3701
  	/*
  	 * CPU bound tasks (e.g. network routing) can exhibit cpu bound
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3702
3703
3704
3705
3706
3707
3708
3709
  	 * allocation behaviour: Most allocs on one cpu, most free operations
  	 * on another cpu. For these cases, an efficient object passing between
  	 * cpus is necessary. This is provided by a shared array. The array
  	 * replaces Bonwick's magazine layer.
  	 * On uniprocessor, it's functionally equivalent (but less efficient)
  	 * to a larger limit. Thus disabled by default.
  	 */
  	shared = 0;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3710
  	if (cachep->size <= PAGE_SIZE && num_possible_cpus() > 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3711
  		shared = 8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3712
3713
  
  #if DEBUG
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3714
3715
3716
  	/*
  	 * With debugging enabled, large batchcount lead to excessively long
  	 * periods with disabled local interrupts. Limit the batchcount
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3717
3718
3719
3720
  	 */
  	if (limit > 32)
  		limit = 32;
  #endif
943a451a8   Glauber Costa   slab: propagate t...
3721
3722
3723
  	batchcount = (limit + 1) / 2;
  skip_setup:
  	err = do_tune_cpucache(cachep, limit, batchcount, shared, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3724
  end:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3725
  	if (err)
1170532bb   Joe Perches   mm: convert print...
3726
3727
  		pr_err("enable_cpucache failed for %s, error %d
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3728
  		       cachep->name, -err);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
3729
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3730
  }
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3731
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3732
3733
   * Drain an array if it contains any elements taking the node lock only if
   * necessary. Note that the node listlock also protects the array_cache
b18e7e654   Christoph Lameter   [PATCH] slab: fix...
3734
   * if drain_array() is used on the shared array.
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3735
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3736
  static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n,
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3737
  			 struct array_cache *ac, int node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3738
  {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3739
  	LIST_HEAD(list);
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3740
3741
3742
  
  	/* ac from n->shared can be freed if we don't hold the slab_mutex. */
  	check_mutex_acquired();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3743

1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3744
3745
  	if (!ac || !ac->avail)
  		return;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3746
3747
  
  	if (ac->touched) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3748
  		ac->touched = 0;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3749
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3750
  	}
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3751
3752
3753
3754
3755
3756
  
  	spin_lock_irq(&n->list_lock);
  	drain_array_locked(cachep, ac, node, false, &list);
  	spin_unlock_irq(&n->list_lock);
  
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3757
3758
3759
3760
  }
  
  /**
   * cache_reap - Reclaim memory from caches.
05fb6bf0b   Randy Dunlap   [PATCH] kernel-do...
3761
   * @w: work descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3762
3763
3764
3765
3766
3767
   *
   * Called from workqueue/eventd every few seconds.
   * Purpose:
   * - clear the per-cpu caches for this CPU.
   * - return freeable pages to the main free memory pool.
   *
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3768
3769
   * If we cannot acquire the cache chain mutex then just give up - we'll try
   * again on the next iteration.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3770
   */
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3771
  static void cache_reap(struct work_struct *w)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3772
  {
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
3773
  	struct kmem_cache *searchp;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3774
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3775
  	int node = numa_mem_id();
bf6aede71   Jean Delvare   workqueue: add to...
3776
  	struct delayed_work *work = to_delayed_work(w);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3777

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3778
  	if (!mutex_trylock(&slab_mutex))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3779
  		/* Give up. Setup the next iteration. */
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3780
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3781

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3782
  	list_for_each_entry(searchp, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3783
  		check_irq_on();
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3784
  		/*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3785
  		 * We only take the node lock if absolutely necessary and we
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3786
3787
3788
  		 * have established with reasonable certainty that
  		 * we can do some work if the lock was obtained.
  		 */
18bf85411   Christoph Lameter   slab: use get_nod...
3789
  		n = get_node(searchp, node);
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3790

ce8eb6c42   Christoph Lameter   slab: Rename list...
3791
  		reap_alien(searchp, n);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3792

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3793
  		drain_array(searchp, n, cpu_cache_get(searchp), node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3794

35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3795
3796
3797
3798
  		/*
  		 * These are racy checks but it does not matter
  		 * if we skip one check or scan twice.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3799
  		if (time_after(n->next_reap, jiffies))
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3800
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3801

5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3802
  		n->next_reap = jiffies + REAPTIMEOUT_NODE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3803

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3804
  		drain_array(searchp, n, n->shared, node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3805

ce8eb6c42   Christoph Lameter   slab: Rename list...
3806
3807
  		if (n->free_touched)
  			n->free_touched = 0;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3808
3809
  		else {
  			int freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3810

ce8eb6c42   Christoph Lameter   slab: Rename list...
3811
  			freed = drain_freelist(searchp, n, (n->free_limit +
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3812
3813
3814
  				5 * searchp->num - 1) / (5 * searchp->num));
  			STATS_ADD_REAPED(searchp, freed);
  		}
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3815
  next:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3816
3817
3818
  		cond_resched();
  	}
  	check_irq_on();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3819
  	mutex_unlock(&slab_mutex);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
3820
  	next_reap_node();
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3821
  out:
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3822
  	/* Set up the next iteration */
a9f2a846f   Vlastimil Babka   mm, slab: resched...
3823
3824
  	schedule_delayed_work_on(smp_processor_id(), work,
  				round_jiffies_relative(REAPTIMEOUT_AC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3825
  }
0d7561c61   Glauber Costa   sl[au]b: Process ...
3826
  void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3827
  {
f728b0a5d   Greg Thelen   mm, slab: faster ...
3828
  	unsigned long active_objs, num_objs, active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3829
3830
  	unsigned long total_slabs = 0, free_objs = 0, shared_avail = 0;
  	unsigned long free_slabs = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3831
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3832
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3833

18bf85411   Christoph Lameter   slab: use get_nod...
3834
  	for_each_kmem_cache_node(cachep, node, n) {
ca3b9b917   Ravikiran G Thirumalai   [PATCH] NUMA slab...
3835
  		check_irq_on();
ce8eb6c42   Christoph Lameter   slab: Rename list...
3836
  		spin_lock_irq(&n->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3837

bf00bd345   David Rientjes   mm, slab: maintai...
3838
3839
  		total_slabs += n->total_slabs;
  		free_slabs += n->free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3840
  		free_objs += n->free_objects;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3841

ce8eb6c42   Christoph Lameter   slab: Rename list...
3842
3843
  		if (n->shared)
  			shared_avail += n->shared->avail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3844

ce8eb6c42   Christoph Lameter   slab: Rename list...
3845
  		spin_unlock_irq(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3846
  	}
bf00bd345   David Rientjes   mm, slab: maintai...
3847
3848
  	num_objs = total_slabs * cachep->num;
  	active_slabs = total_slabs - free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3849
  	active_objs = num_objs - free_objs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3850

0d7561c61   Glauber Costa   sl[au]b: Process ...
3851
3852
3853
  	sinfo->active_objs = active_objs;
  	sinfo->num_objs = num_objs;
  	sinfo->active_slabs = active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3854
  	sinfo->num_slabs = total_slabs;
0d7561c61   Glauber Costa   sl[au]b: Process ...
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
  	sinfo->shared_avail = shared_avail;
  	sinfo->limit = cachep->limit;
  	sinfo->batchcount = cachep->batchcount;
  	sinfo->shared = cachep->shared;
  	sinfo->objects_per_slab = cachep->num;
  	sinfo->cache_order = cachep->gfporder;
  }
  
  void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3865
  #if STATS
ce8eb6c42   Christoph Lameter   slab: Rename list...
3866
  	{			/* node stats */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3867
3868
3869
3870
3871
3872
  		unsigned long high = cachep->high_mark;
  		unsigned long allocs = cachep->num_allocations;
  		unsigned long grown = cachep->grown;
  		unsigned long reaped = cachep->reaped;
  		unsigned long errors = cachep->errors;
  		unsigned long max_freeable = cachep->max_freeable;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3873
  		unsigned long node_allocs = cachep->node_allocs;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3874
  		unsigned long node_frees = cachep->node_frees;
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
3875
  		unsigned long overflows = cachep->node_overflow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3876

756a025f0   Joe Perches   mm: coalesce spli...
3877
  		seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu %4lu %4lu %4lu %4lu %4lu",
e92dd4fd1   Joe Perches   slab: Fix continu...
3878
3879
3880
  			   allocs, high, grown,
  			   reaped, errors, max_freeable, node_allocs,
  			   node_frees, overflows);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3881
3882
3883
3884
3885
3886
3887
3888
3889
  	}
  	/* cpu stats */
  	{
  		unsigned long allochit = atomic_read(&cachep->allochit);
  		unsigned long allocmiss = atomic_read(&cachep->allocmiss);
  		unsigned long freehit = atomic_read(&cachep->freehit);
  		unsigned long freemiss = atomic_read(&cachep->freemiss);
  
  		seq_printf(m, " : cpustat %6lu %6lu %6lu %6lu",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3890
  			   allochit, allocmiss, freehit, freemiss);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3891
3892
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3893
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3894
3895
3896
3897
3898
3899
3900
  #define MAX_SLABINFO_WRITE 128
  /**
   * slabinfo_write - Tuning for the slab allocator
   * @file: unused
   * @buffer: user buffer
   * @count: data length
   * @ppos: unused
a862f68a8   Mike Rapoport   docs/core-api/mm:...
3901
3902
   *
   * Return: %0 on success, negative error code otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3903
   */
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
3904
  ssize_t slabinfo_write(struct file *file, const char __user *buffer,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3905
  		       size_t count, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3906
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3907
  	char kbuf[MAX_SLABINFO_WRITE + 1], *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3908
  	int limit, batchcount, shared, res;
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
3909
  	struct kmem_cache *cachep;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3910

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3911
3912
3913
3914
  	if (count > MAX_SLABINFO_WRITE)
  		return -EINVAL;
  	if (copy_from_user(&kbuf, buffer, count))
  		return -EFAULT;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3915
  	kbuf[MAX_SLABINFO_WRITE] = '\0';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
  
  	tmp = strchr(kbuf, ' ');
  	if (!tmp)
  		return -EINVAL;
  	*tmp = '\0';
  	tmp++;
  	if (sscanf(tmp, " %d %d %d", &limit, &batchcount, &shared) != 3)
  		return -EINVAL;
  
  	/* Find the cache in the chain of caches. */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3926
  	mutex_lock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3927
  	res = -EINVAL;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3928
  	list_for_each_entry(cachep, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3929
  		if (!strcmp(cachep->name, kbuf)) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3930
3931
  			if (limit < 1 || batchcount < 1 ||
  					batchcount > limit || shared < 0) {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3932
  				res = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3933
  			} else {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3934
  				res = do_tune_cpucache(cachep, limit,
83b519e8b   Pekka Enberg   slab: setup alloc...
3935
3936
  						       batchcount, shared,
  						       GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3937
3938
3939
3940
  			}
  			break;
  		}
  	}
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3941
  	mutex_unlock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3942
3943
3944
3945
  	if (res >= 0)
  		res = count;
  	return res;
  }
871751e25   Al Viro   [PATCH] slab: imp...
3946

04385fc5e   Kees Cook   mm: SLAB hardened...
3947
3948
  #ifdef CONFIG_HARDENED_USERCOPY
  /*
afcc90f86   Kees Cook   usercopy: WARN() ...
3949
3950
3951
   * Rejects incorrectly sized objects and objects that are to be copied
   * to/from userspace but do not fall entirely within the containing slab
   * cache's usercopy region.
04385fc5e   Kees Cook   mm: SLAB hardened...
3952
3953
3954
3955
   *
   * Returns NULL if check passes, otherwise const char * to name of cache
   * to indicate an error.
   */
f4e6e289c   Kees Cook   usercopy: Include...
3956
3957
  void __check_heap_object(const void *ptr, unsigned long n, struct page *page,
  			 bool to_user)
04385fc5e   Kees Cook   mm: SLAB hardened...
3958
3959
3960
3961
  {
  	struct kmem_cache *cachep;
  	unsigned int objnr;
  	unsigned long offset;
219667c23   Andrey Konovalov   kasan, slab: fix ...
3962
  	ptr = kasan_reset_tag(ptr);
04385fc5e   Kees Cook   mm: SLAB hardened...
3963
3964
3965
3966
3967
3968
3969
  	/* Find and validate object. */
  	cachep = page->slab_cache;
  	objnr = obj_to_index(cachep, page, (void *)ptr);
  	BUG_ON(objnr >= cachep->num);
  
  	/* Find offset within object. */
  	offset = ptr - index_to_obj(cachep, page, objnr) - obj_offset(cachep);
afcc90f86   Kees Cook   usercopy: WARN() ...
3970
3971
3972
3973
  	/* Allow address range falling entirely within usercopy region. */
  	if (offset >= cachep->useroffset &&
  	    offset - cachep->useroffset <= cachep->usersize &&
  	    n <= cachep->useroffset - offset + cachep->usersize)
f4e6e289c   Kees Cook   usercopy: Include...
3974
  		return;
04385fc5e   Kees Cook   mm: SLAB hardened...
3975

afcc90f86   Kees Cook   usercopy: WARN() ...
3976
3977
3978
3979
3980
3981
  	/*
  	 * If the copy is still within the allocated object, produce
  	 * a warning instead of rejecting the copy. This is intended
  	 * to be a temporary method to find any missing usercopy
  	 * whitelists.
  	 */
2d891fbc3   Kees Cook   usercopy: Allow s...
3982
3983
  	if (usercopy_fallback &&
  	    offset <= cachep->object_size &&
afcc90f86   Kees Cook   usercopy: WARN() ...
3984
3985
3986
3987
  	    n <= cachep->object_size - offset) {
  		usercopy_warn("SLAB object", cachep->name, to_user, offset, n);
  		return;
  	}
04385fc5e   Kees Cook   mm: SLAB hardened...
3988

f4e6e289c   Kees Cook   usercopy: Include...
3989
  	usercopy_abort("SLAB object", cachep->name, to_user, offset, n);
04385fc5e   Kees Cook   mm: SLAB hardened...
3990
3991
  }
  #endif /* CONFIG_HARDENED_USERCOPY */
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
3992
  /**
10d1f8cb3   Marco Elver   mm/slab: refactor...
3993
   * __ksize -- Uninstrumented ksize.
87bf4f71a   Randy Dunlap   mm/slab.c: fix ke...
3994
   * @objp: pointer to the object
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
3995
   *
10d1f8cb3   Marco Elver   mm/slab: refactor...
3996
3997
   * Unlike ksize(), __ksize() is uninstrumented, and does not provide the same
   * safety checks as ksize() with KASAN instrumentation enabled.
87bf4f71a   Randy Dunlap   mm/slab.c: fix ke...
3998
3999
   *
   * Return: size of the actual memory used by @objp in bytes
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4000
   */
10d1f8cb3   Marco Elver   mm/slab: refactor...
4001
  size_t __ksize(const void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4002
  {
a64b53780   Kees Cook   mm/slab: sanity-c...
4003
  	struct kmem_cache *c;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4004
  	size_t size;
ef8b4520b   Christoph Lameter   Slab allocators: ...
4005
4006
  	BUG_ON(!objp);
  	if (unlikely(objp == ZERO_SIZE_PTR))
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4007
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4008

a64b53780   Kees Cook   mm/slab: sanity-c...
4009
4010
  	c = virt_to_cache(objp);
  	size = c ? c->object_size : 0;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4011
4012
  
  	return size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4013
  }
10d1f8cb3   Marco Elver   mm/slab: refactor...
4014
  EXPORT_SYMBOL(__ksize);