Blame view

mm/slab.c 107 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
  #include	<linux/seq_file.h>
  #include	<linux/notifier.h>
  #include	<linux/kallsyms.h>
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
102
  #include	<linux/kfence.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
105
106
  #include	<linux/cpu.h>
  #include	<linux/sysctl.h>
  #include	<linux/module.h>
  #include	<linux/rcupdate.h>
543537bd9   Paulo Marques   [PATCH] create a ...
107
  #include	<linux/string.h>
138ae6631   Andrew Morton   [PATCH] slab: use...
108
  #include	<linux/uaccess.h>
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
109
  #include	<linux/nodemask.h>
d5cff6352   Catalin Marinas   kmemleak: Add the...
110
  #include	<linux/kmemleak.h>
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
111
  #include	<linux/mempolicy.h>
fc0abb145   Ingo Molnar   [PATCH] sem2mutex...
112
  #include	<linux/mutex.h>
8a8b6502f   Akinobu Mita   [PATCH] fault-inj...
113
  #include	<linux/fault-inject.h>
e7eebaf6a   Ingo Molnar   [PATCH] pi-futex:...
114
  #include	<linux/rtmutex.h>
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
115
  #include	<linux/reciprocal_div.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
116
  #include	<linux/debugobjects.h>
8f9f8d9e8   David Rientjes   slab: add memory ...
117
  #include	<linux/memory.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
118
  #include	<linux/prefetch.h>
3f8c24529   Ingo Molnar   sched/headers: Pr...
119
  #include	<linux/sched/task_stack.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
153
  #ifndef ARCH_KMALLOC_FLAGS
  #define ARCH_KMALLOC_FLAGS SLAB_HWCACHE_ALIGN
  #endif
f315e3fa1   Joonsoo Kim   slab: restrict th...
154
155
156
157
158
159
160
161
  #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 ...
162
  #define SLAB_OBJ_MAX_NUM ((1 << sizeof(freelist_idx_t) * BITS_PER_BYTE) - 1)
f315e3fa1   Joonsoo Kim   slab: restrict th...
163

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
164
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
166
   * struct array_cache
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
171
172
173
174
175
176
177
178
179
180
   * 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...
181
  	void *entry[];	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
182
183
184
  			 * Must have this definition in here for the proper
  			 * alignment of array_cache. Also simplifies accessing
  			 * the entries.
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
185
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
  };
c8522a3a5   Joonsoo Kim   slab: introduce a...
187
188
189
190
  struct alien_cache {
  	spinlock_t lock;
  	struct array_cache ac;
  };
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
191
  /*
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
192
193
   * Need this for bootstrapping a per node allocator.
   */
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
194
  #define NUM_INIT_LISTS (2 * MAX_NUMNODES)
ce8eb6c42   Christoph Lameter   slab: Rename list...
195
  static struct kmem_cache_node __initdata init_kmem_cache_node[NUM_INIT_LISTS];
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
196
  #define	CACHE_CACHE 0
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
197
  #define	SIZE_NODE (MAX_NUMNODES)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
198

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

76b342bdc   Joonsoo Kim   mm/slab: separate...
207
208
209
210
211
  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...
212
  static int slab_early_init = 1;
ce8eb6c42   Christoph Lameter   slab: Rename list...
213
  #define INDEX_NODE kmalloc_index(sizeof(struct kmem_cache_node))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214

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

4fd0b46e8   Alexey Dobriyan   slab, slub, slob:...
241
242
  #define CFLGS_OBJFREELIST_SLAB	((slab_flags_t __force)0x40000000U)
  #define CFLGS_OFF_SLAB		((slab_flags_t __force)0x80000000U)
b03a017be   Joonsoo Kim   mm/slab: introduc...
243
  #define	OBJFREELIST_SLAB(x)	((x)->flags & CFLGS_OBJFREELIST_SLAB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
  #define	OFF_SLAB(x)	((x)->flags & CFLGS_OFF_SLAB)
  
  #define BATCHREFILL_LIMIT	16
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
247
  /*
f0953a1bb   Ingo Molnar   mm: fix typos in ...
248
   * Optimization question: fewer reaps means less probability for unnecessary
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
249
   * cpucache drain/refill cycles.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
   *
dc6f3f276   Adrian Bunk   mm/slab.c: fix a ...
251
   * OTOH the cpuarrays can contain lots of objects,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
253
   * which could lock up otherwise freeable slabs.
   */
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
254
255
  #define REAPTIMEOUT_AC		(2*HZ)
  #define REAPTIMEOUT_NODE	(4*HZ)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
257
258
259
260
261
  
  #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++)
0b4116340   Zhiyuan Dai   mm/slab: minor co...
262
  #define	STATS_ADD_REAPED(x, y)	((x)->reaped += (y))
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
263
264
265
266
267
  #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
268
269
  #define	STATS_INC_ERR(x)	((x)->errors++)
  #define	STATS_INC_NODEALLOCS(x)	((x)->node_allocs++)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
270
  #define	STATS_INC_NODEFREES(x)	((x)->node_frees++)
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
271
  #define STATS_INC_ACOVERFLOW(x)   ((x)->node_overflow++)
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
272
273
274
275
276
  #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
277
278
279
280
281
282
283
284
285
  #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)
0b4116340   Zhiyuan Dai   mm/slab: minor co...
286
  #define	STATS_ADD_REAPED(x, y)	do { (void)(y); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
288
289
  #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...
290
  #define	STATS_INC_NODEFREES(x)	do { } while (0)
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
291
  #define STATS_INC_ACOVERFLOW(x)   do { } while (0)
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
292
  #define	STATS_SET_FREEABLE(x, i) do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
299
  #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
300

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
301
302
  /*
   * memory layout of objects:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
   * 0		: objp
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
304
   * 0 .. cachep->obj_offset - BYTES_PER_WORD - 1: padding. This ensures that
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
   * 		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...
307
   * cachep->obj_offset - BYTES_PER_WORD .. cachep->obj_offset - 1:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
   * 		redzone word.
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
309
   * cachep->obj_offset: The real object.
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
310
311
   * 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
312
   *					[BYTES_PER_WORD long]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
314
  static int obj_offset(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
  {
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
316
  	return cachep->obj_offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
317
  }
b46b8f19c   David Woodhouse   Increase slab red...
318
  static unsigned long long *dbg_redzone1(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
320
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
0b4116340   Zhiyuan Dai   mm/slab: minor co...
321
  	return (unsigned long long *) (objp + obj_offset(cachep) -
b46b8f19c   David Woodhouse   Increase slab red...
322
  				      sizeof(unsigned long long));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
  }
b46b8f19c   David Woodhouse   Increase slab red...
324
  static unsigned long long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
327
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
  	if (cachep->flags & SLAB_STORE_USER)
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
328
  		return (unsigned long long *)(objp + cachep->size -
b46b8f19c   David Woodhouse   Increase slab red...
329
  					      sizeof(unsigned long long) -
87a927c71   David Woodhouse   Fix slab redzone ...
330
  					      REDZONE_ALIGN);
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
331
  	return (unsigned long long *) (objp + cachep->size -
b46b8f19c   David Woodhouse   Increase slab red...
332
  				       sizeof(unsigned long long));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
334
  static void **dbg_userword(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
336
  {
  	BUG_ON(!(cachep->flags & SLAB_STORE_USER));
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
337
  	return (void **)(objp + cachep->size - BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
340
  }
  
  #else
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
341
  #define obj_offset(x)			0
b46b8f19c   David Woodhouse   Increase slab red...
342
343
  #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
344
345
346
347
348
  #define dbg_userword(cachep, objp)	({BUG(); (void **)NULL;})
  
  #endif
  
  /*
3df1cccdf   David Rientjes   slab: introduce s...
349
350
   * 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
351
   */
543585cc5   David Rientjes   slab: rename slab...
352
353
354
  #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...
355
  static bool slab_max_order_set __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356

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

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

fbaccacff   Steven Rostedt   [PATCH] slab: cac...
386
387
388
389
390
  	/*
  	 * 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...
391
  	 * - @buffer_size bytes for each object
2e6b36021   Joonsoo Kim   mm/slab: put the ...
392
393
394
395
396
  	 * - 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...
397
398
399
400
401
402
  	 *
  	 * 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...
403
  	if (flags & (CFLGS_OBJFREELIST_SLAB | CFLGS_OFF_SLAB)) {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
404
  		num = slab_size / buffer_size;
2e6b36021   Joonsoo Kim   mm/slab: put the ...
405
  		*left_over = slab_size % buffer_size;
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
406
  	} else {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
407
  		num = slab_size / (buffer_size + sizeof(freelist_idx_t));
2e6b36021   Joonsoo Kim   mm/slab: put the ...
408
409
  		*left_over = slab_size %
  			(buffer_size + sizeof(freelist_idx_t));
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
410
  	}
70f75067b   Joonsoo Kim   mm/slab: avoid re...
411
412
  
  	return num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
  }
f28510d30   Christoph Lameter   slab: Only define...
414
  #if DEBUG
d40cee245   Harvey Harrison   mm: remove remain...
415
  #define slab_error(cachep, msg) __slab_error(__func__, cachep, msg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416

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

3395ee058   Paul Menage   [PATCH] mm: add n...
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
  /*
   * 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...
443
444
445
446
447
448
449
450
451
452
  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...
453
454
455
456
457
458
459
  #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...
460
  static DEFINE_PER_CPU(unsigned long, slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
461
462
463
  
  static void init_reap_node(int cpu)
  {
0edaf86cf   Andrew Morton   include/linux/nod...
464
465
  	per_cpu(slab_reap_node, cpu) = next_node_in(cpu_to_mem(cpu),
  						    node_online_map);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
466
467
468
469
  }
  
  static void next_reap_node(void)
  {
909ea9646   Christoph Lameter   core: Replace __g...
470
  	int node = __this_cpu_read(slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
471

0edaf86cf   Andrew Morton   include/linux/nod...
472
  	node = next_node_in(node, node_online_map);
909ea9646   Christoph Lameter   core: Replace __g...
473
  	__this_cpu_write(slab_reap_node, node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
474
475
476
477
478
479
  }
  
  #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
480
481
482
483
484
485
486
  /*
   * 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 __...
487
  static void start_cpu_timer(int cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
  {
1871e52c7   Tejun Heo   percpu: make perc...
489
  	struct delayed_work *reap_work = &per_cpu(slab_reap_work, cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490

eac0337af   Tejun Heo   slab, workqueue: ...
491
  	if (reap_work->work.func == NULL) {
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
492
  		init_reap_node(cpu);
203b42f73   Tejun Heo   workqueue: make d...
493
  		INIT_DEFERRABLE_WORK(reap_work, cache_reap);
2b2842146   Arjan van de Ven   [PATCH] user of t...
494
495
  		schedule_delayed_work_on(cpu, reap_work,
  					__round_jiffies_relative(HZ, cpu));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
497
  	}
  }
1fe00d50a   Joonsoo Kim   slab: factor out ...
498
  static void init_arraycache(struct array_cache *ac, int limit, int batch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499
  {
1fe00d50a   Joonsoo Kim   slab: factor out ...
500
501
502
503
504
  	if (ac) {
  		ac->avail = 0;
  		ac->limit = limit;
  		ac->batchcount = batch;
  		ac->touched = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
  	}
1fe00d50a   Joonsoo Kim   slab: factor out ...
506
507
508
509
510
  }
  
  static struct array_cache *alloc_arraycache(int node, int entries,
  					    int batchcount, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
511
  	size_t memsize = sizeof(void *) * entries + sizeof(struct array_cache);
1fe00d50a   Joonsoo Kim   slab: factor out ...
512
513
514
  	struct array_cache *ac = NULL;
  
  	ac = kmalloc_node(memsize, gfp, node);
92d1d07da   Qian Cai   mm/slab.c: kmemle...
515
516
517
518
519
520
521
522
  	/*
  	 * 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 ...
523
524
  	init_arraycache(ac, entries, batchcount);
  	return ac;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
526
527
  static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep,
  					struct page *page, void *objp)
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
528
  {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
529
530
531
  	struct kmem_cache_node *n;
  	int page_node;
  	LIST_HEAD(list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
532

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

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
540
  	slabs_destroy(cachep, &list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
541
  }
3ded175a4   Christoph Lameter   [PATCH] slab: add...
542
543
544
545
546
547
548
549
550
551
  /*
   * 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...
552
  	int nr = min3(from->avail, max, to->limit - to->avail);
3ded175a4   Christoph Lameter   [PATCH] slab: add...
553
554
555
  
  	if (!nr)
  		return 0;
0b4116340   Zhiyuan Dai   mm/slab: minor co...
556
  	memcpy(to->entry + to->avail, from->entry + from->avail - nr,
3ded175a4   Christoph Lameter   [PATCH] slab: add...
557
558
559
560
  			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

76af6a054   Dave Hansen   mm/migrate: add C...
1047
  #if defined(CONFIG_NUMA)
8f9f8d9e8   David Rientjes   slab: add memory ...
1048
1049
1050
1051
1052
  /*
   * 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
  }
76af6a054   Dave Hansen   mm/migrate: add C...
1107
  #endif /* CONFIG_NUMA */
8f9f8d9e8   David Rientjes   slab: add memory ...
1108

e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1109
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
1110
   * swap the static kmem_cache_node with kmalloced memory
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1111
   */
6744f087b   Christoph Lameter   slab: Common name...
1112
  static void __init init_list(struct kmem_cache *cachep, struct kmem_cache_node *list,
8f9f8d9e8   David Rientjes   slab: add memory ...
1113
  				int nodeid)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1114
  {
6744f087b   Christoph Lameter   slab: Common name...
1115
  	struct kmem_cache_node *ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1116

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1156
1157
  	/*
  	 * Fragmentation resistance on low memory - only use bigger
3df1cccdf   David Rientjes   slab: introduce s...
1158
1159
  	 * 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
1160
  	 */
ca79b0c21   Arun KS   mm: convert total...
1161
  	if (!slab_max_order_set && totalram_pages() > (32 << 20) >> PAGE_SHIFT)
543585cc5   David Rientjes   slab: rename slab...
1162
  		slab_max_order = SLAB_MAX_ORDER_HI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1164
1165
  	/* Bootstrap is tricky, because several objects are allocated
  	 * from caches that do not exist yet:
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1166
1167
1168
  	 * 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...
1169
  	 *    Initially an __init data area is used for the head array and the
ce8eb6c42   Christoph Lameter   slab: Rename list...
1170
  	 *    kmem_cache_node structures, it's replaced with a kmalloc allocated
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1171
  	 *    array at the end of the bootstrap.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172
  	 * 2) Create the first kmalloc cache.
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1173
  	 *    The struct kmem_cache for the new cache is allocated normally.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1174
1175
1176
  	 *    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 ...
1177
  	 * 4) Replace the __init data head arrays for kmem_cache and the first
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1178
  	 *    kmalloc cache with kmalloc allocated arrays.
ce8eb6c42   Christoph Lameter   slab: Rename list...
1179
  	 * 5) Replace the __init data for kmem_cache_node for kmem_cache and
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1180
1181
  	 *    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
1182
  	 */
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1183
  	/* 1) create the kmem_cache */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1184

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1195
  	/*
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1196
1197
  	 * 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...
1198
  	 */
cc252eae8   Vlastimil Babka   mm, slab: combine...
1199
  	kmalloc_caches[KMALLOC_NORMAL][INDEX_NODE] = create_kmalloc_cache(
cb5d9fb38   Pengfei Li   mm, slab: make km...
1200
  				kmalloc_info[INDEX_NODE].name[KMALLOC_NORMAL],
dc0a7f755   Pengfei Li   mm, slab: remove ...
1201
1202
1203
  				kmalloc_info[INDEX_NODE].size,
  				ARCH_KMALLOC_FLAGS, 0,
  				kmalloc_info[INDEX_NODE].size);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1204
  	slab_state = PARTIAL_NODE;
34cc6990d   Daniel Sanders   slab: correct siz...
1205
  	setup_kmalloc_cache_index_table();
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1206

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

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

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

97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1232
1233
  	/* Done! */
  	slab_state = FULL;
8f9f8d9e8   David Rientjes   slab: add memory ...
1234
1235
1236
  #ifdef CONFIG_NUMA
  	/*
  	 * Register a memory hotplug callback that initializes and frees
6a67368c3   Christoph Lameter   slab: Rename node...
1237
  	 * node.
8f9f8d9e8   David Rientjes   slab: add memory ...
1238
1239
1240
  	 */
  	hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI);
  #endif
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1241
1242
1243
  	/*
  	 * 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
1244
1245
1246
1247
1248
  	 */
  }
  
  static int __init cpucache_init(void)
  {
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1249
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1251
1252
  	/*
  	 * Register the timers that return unneeded pages to the page allocator
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1253
  	 */
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1254
1255
1256
  	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...
1257

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

5b3810e5c   Vlastimil Babka   mm, sl[au]b: prin...
1274
1275
1276
1277
1278
  	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...
1279
  		cachep->name, cachep->size, cachep->gfporder);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1280

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

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

bf00bd345   David Rientjes   mm, slab: maintai...
1290
1291
1292
1293
1294
  		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...
1295
  	}
9a02d6999   David Rientjes   mm, slab: suppres...
1296
  #endif
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1297
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
  /*
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1299
1300
   * Interface to system's page allocator. No need to hold the
   * kmem_cache_node ->list_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1301
1302
1303
1304
1305
   *
   * 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...
1306
1307
  static struct page *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
  								int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308
1309
  {
  	struct page *page;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
1310

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

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

2e9bd4831   Roman Gushchin   mm: memcg/slab: p...
1319
  	account_slab_page(page, cachep->gfporder, cachep, flags);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1320
  	__SetPageSlab(page);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1321
1322
  	/* 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...
1323
  		SetPageSlabPfmemalloc(page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
1324

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

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1335
  	BUG_ON(!PageSlab(page));
73293c2f9   Joonsoo Kim   slab: correct pfm...
1336
  	__ClearPageSlabPfmemalloc(page);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1337
  	__ClearPageSlab(page);
8456a648c   Joonsoo Kim   slab: use struct ...
1338
  	page_mapcount_reset(page);
0c06dd755   Vlastimil Babka   mm, slab, slub: c...
1339
1340
  	/* In union with page->mapping where page allocator expects NULL */
  	page->slab_cache = NULL;
1f458cbf1   Glauber Costa   memcg: destroy me...
1341

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

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

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

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

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

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

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

f315e3fa1   Joonsoo Kim   slab: restrict th...
1608
1609
1610
  		/* 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...
1611
  		if (flags & CFLGS_OFF_SLAB) {
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1612
1613
1614
1615
1616
1617
1618
  			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...
1619
  			/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1620
  			 * Needed to avoid possible looping condition
76b342bdc   Joonsoo Kim   mm/slab: separate...
1621
  			 * in cache_grow_begin()
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1622
  			 */
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1623
1624
  			if (OFF_SLAB(freelist_cache))
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1625

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

9888e6fa7   Linus Torvalds   slab: clarify and...
1631
  		/* Found something acceptable - save it away */
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1632
  		cachep->num = num;
9888e6fa7   Linus Torvalds   slab: clarify and...
1633
  		cachep->gfporder = gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1634
1635
1636
  		left_over = remainder;
  
  		/*
f78bb8ad4   Linus Torvalds   slab: fix calcula...
1637
1638
1639
1640
1641
1642
1643
1644
  		 * 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...
1645
1646
1647
  		 * Large number of objects is good, but very large slabs are
  		 * currently bad for the gfp()s.
  		 */
543585cc5   David Rientjes   slab: rename slab...
1648
  		if (gfporder >= slab_max_order)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1649
  			break;
9888e6fa7   Linus Torvalds   slab: clarify and...
1650
1651
1652
  		/*
  		 * Acceptable internal fragmentation?
  		 */
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1653
  		if (left_over * 8 <= (PAGE_SIZE << gfporder))
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1654
1655
1656
1657
  			break;
  	}
  	return left_over;
  }
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1658
1659
1660
1661
1662
1663
1664
1665
  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...
1666
  	cpu_cache = __alloc_percpu(size, sizeof(void *));
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
  
  	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...
1678
  static int __ref setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp)
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1679
  {
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1680
  	if (slab_state >= FULL)
83b519e8b   Pekka Enberg   slab: setup alloc...
1681
  		return enable_cpucache(cachep, gfp);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
1682

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

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1695
1696
1697
1698
1699
  		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...
1700
1701
  		}
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1702

6a67368c3   Christoph Lameter   slab: Rename node...
1703
  	cachep->node[numa_mem_id()]->next_reap =
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
1704
1705
  			jiffies + REAPTIMEOUT_NODE +
  			((unsigned long)cachep) % REAPTIMEOUT_NODE;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1706
1707
1708
1709
1710
1711
1712
  
  	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 ...
1713
  	return 0;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1714
  }
0293d1fdd   Alexey Dobriyan   slab: make kmem_c...
1715
  slab_flags_t kmem_cache_flags(unsigned int object_size,
375400087   Nikolay Borisov   mm/sl?b.c: remove...
1716
  	slab_flags_t flags, const char *name)
12220dea0   Joonsoo Kim   mm/slab: support ...
1717
1718
1719
1720
1721
  {
  	return flags;
  }
  
  struct kmem_cache *
f4957d5bd   Alexey Dobriyan   slab: make kmem_c...
1722
  __kmem_cache_alias(const char *name, unsigned int size, unsigned int align,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1723
  		   slab_flags_t flags, void (*ctor)(void *))
12220dea0   Joonsoo Kim   mm/slab: support ...
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
  {
  	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...
1739
  static bool set_objfreelist_slab_cache(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1740
  			size_t size, slab_flags_t flags)
b03a017be   Joonsoo Kim   mm/slab: introduc...
1741
1742
1743
1744
  {
  	size_t left;
  
  	cachep->num = 0;
6471384af   Alexander Potapenko   mm: security: int...
1745
1746
1747
1748
1749
1750
1751
  	/*
  	 * 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...
1752
  	if (cachep->ctor || flags & SLAB_TYPESAFE_BY_RCU)
b03a017be   Joonsoo Kim   mm/slab: introduc...
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
  		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...
1767
  static bool set_off_slab_cache(struct kmem_cache *cachep,
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1768
  			size_t size, slab_flags_t flags)
158e319bb   Joonsoo Kim   mm/slab: clean up...
1769
1770
1771
1772
1773
1774
  {
  	size_t left;
  
  	cachep->num = 0;
  
  	/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1775
1776
  	 * Always use on-slab management when SLAB_NOLEAKTRACE
  	 * to avoid recursive calls into kmemleak.
158e319bb   Joonsoo Kim   mm/slab: clean up...
1777
  	 */
158e319bb   Joonsoo Kim   mm/slab: clean up...
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
  	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:...
1802
  			size_t size, slab_flags_t flags)
158e319bb   Joonsoo Kim   mm/slab: clean up...
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
  {
  	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...
1816
  /**
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
1817
   * __kmem_cache_create - Create a cache.
a755b76ab   Randy Dunlap   mm: fix slab.c ke...
1818
   * @cachep: cache management descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1819
   * @flags: SLAB flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1820
1821
1822
   *
   * 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...
1823
   * The @ctor is run when new pages are allocated by the cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1824
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1825
1826
1827
1828
1829
1830
1831
1832
   * 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
1833
1834
1835
   * %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:...
1836
1837
   *
   * Return: a pointer to the created cache or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1838
   */
d50112edd   Alexey Dobriyan   slab, slub, slob:...
1839
  int __kmem_cache_create(struct kmem_cache *cachep, slab_flags_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1840
  {
d4a5fca59   David Rientjes   mm, slab: initial...
1841
  	size_t ralign = BYTES_PER_WORD;
83b519e8b   Pekka Enberg   slab: setup alloc...
1842
  	gfp_t gfp;
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1843
  	int err;
be4a7988b   Alexey Dobriyan   kasan: make kasan...
1844
  	unsigned int size = cachep->size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1845

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1846
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1847
1848
1849
1850
1851
1852
1853
  #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 ...
1854
1855
  	if (size < 4096 || fls(size - 1) == fls(size-1 + REDZONE_ALIGN +
  						2 * sizeof(unsigned long long)))
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1856
  		flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1857
  	if (!(flags & SLAB_TYPESAFE_BY_RCU))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1858
1859
  		flags |= SLAB_POISON;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1860
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1861

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1862
1863
  	/*
  	 * Check that size is in terms of words.  This is needed to avoid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1864
1865
1866
  	 * 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...
1867
  	size = ALIGN(size, BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868

87a927c71   David Woodhouse   Fix slab redzone ...
1869
1870
1871
1872
  	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...
1873
  		size = ALIGN(size, REDZONE_ALIGN);
87a927c71   David Woodhouse   Fix slab redzone ...
1874
  	}
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1875

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

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

ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1898
1899
1900
1901
  	/*
  	 * Both debugging options require word-alignment which is calculated
  	 * into align above.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1902
  	if (flags & SLAB_RED_ZONE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1903
  		/* add space for red zone words */
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1904
1905
  		cachep->obj_offset += sizeof(unsigned long long);
  		size += 2 * sizeof(unsigned long long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1906
1907
  	}
  	if (flags & SLAB_STORE_USER) {
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1908
  		/* user store requires one word storage behind the end of
87a927c71   David Woodhouse   Fix slab redzone ...
1909
1910
  		 * 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
1911
  		 */
87a927c71   David Woodhouse   Fix slab redzone ...
1912
1913
1914
1915
  		if (flags & SLAB_RED_ZONE)
  			size += REDZONE_ALIGN;
  		else
  			size += BYTES_PER_WORD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1916
  	}
832a15d20   Joonsoo Kim   mm/slab: align ca...
1917
  #endif
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
1918
  	kasan_cache_create(cachep, &size, &flags);
832a15d20   Joonsoo Kim   mm/slab: align ca...
1919
1920
1921
1922
1923
1924
1925
1926
1927
  	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...
1928
1929
1930
1931
1932
1933
1934
  	/*
  	 * 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...
1935
  	if (debug_pagealloc_enabled_static() && (flags & SLAB_POISON) &&
f3a3c320d   Joonsoo Kim   mm/slab: do not c...
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
  		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
1947
1948
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1949

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

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

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

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

40b441379   Joonsoo Kim   mm/slab: clean up...
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
  #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...
1990
1991
  		cachep->freelist_cache =
  			kmalloc_slab(cachep->freelist_size, 0u);
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
1992
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1993

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

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

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2025
  static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2026
2027
2028
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2029
  	assert_spin_locked(&get_node(cachep, node)->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2030
2031
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2032
2033
2034
  #else
  #define check_irq_off()	do { } while(0)
  #define check_irq_on()	do { } while(0)
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2035
  #define check_mutex_acquired()	do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2036
  #define check_spinlock_acquired(x) do { } while(0)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2037
  #define check_spinlock_acquired_node(x, y) do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2038
  #endif
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
  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...
2055

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

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

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2085
2086
2087
2088
2089
2090
2091
  	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
2092
  }
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2093
2094
2095
2096
2097
2098
2099
  /*
   * 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...
2100
  			struct kmem_cache_node *n, int tofree)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2101
  {
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2102
2103
  	struct list_head *p;
  	int nr_freed;
8456a648c   Joonsoo Kim   slab: use struct ...
2104
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2109
2110
2111
2112
  		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...
2113
2114
  			goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2115

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

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2173
  	/* NUMA: free the node structures */
18bf85411   Christoph Lameter   slab: use get_nod...
2174
2175
2176
2177
2178
  	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 ...
2179
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2180
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2181

e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2182
2183
  /*
   * Get the memory for a slab management obj.
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
2184
2185
2186
2187
2188
2189
   *
   * 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
80d015587   Colin Ian King   mm/slab.c: fix sp...
2190
   * in turn looks up in the kmalloc_{dma,}_caches for the desired-size one.
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
2191
2192
2193
2194
   * 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 ...
2195
   */
7e0073552   Joonsoo Kim   slab: replace non...
2196
  static void *alloc_slabmgmt(struct kmem_cache *cachep,
0c3aa83e0   Joonsoo Kim   slab: change retu...
2197
2198
  				   struct page *page, int colour_off,
  				   gfp_t local_flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2199
  {
7e0073552   Joonsoo Kim   slab: replace non...
2200
  	void *freelist;
0c3aa83e0   Joonsoo Kim   slab: change retu...
2201
  	void *addr = page_address(page);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2202

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2237
2238
2239
2240
2241
2242
2243
2244
  		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
2245
2246
2247
  		 * 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
2248
  		 */
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2249
2250
2251
  		if (cachep->ctor && !(cachep->flags & SLAB_POISON)) {
  			kasan_unpoison_object_data(cachep,
  						   objp + obj_offset(cachep));
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
2252
  			cachep->ctor(objp + obj_offset(cachep));
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2253
2254
2255
  			kasan_poison_object_data(
  				cachep, objp + obj_offset(cachep));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2256
2257
2258
  
  		if (cachep->flags & SLAB_RED_ZONE) {
  			if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2259
  				slab_error(cachep, "constructor overwrote the end of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2260
  			if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2261
  				slab_error(cachep, "constructor overwrote the start of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2262
  		}
40b441379   Joonsoo Kim   mm/slab: clean up...
2263
2264
2265
  		/* need to poison the objs? */
  		if (cachep->flags & SLAB_POISON) {
  			poison_obj(cachep, objp, POISON_FREE);
80552f0f7   Qian Cai   mm/slab: Remove s...
2266
  			slab_kernel_map(cachep, objp, 0);
40b441379   Joonsoo Kim   mm/slab: clean up...
2267
  		}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2268
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2269
  #endif
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2270
  }
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2271
2272
2273
2274
2275
  #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...
2276
  		unsigned int *list;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2277
  		unsigned int count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2278
2279
2280
2281
2282
  	};
  	struct rnd_state rnd_state;
  };
  
  /*
f0953a1bb   Ingo Molnar   mm: fix typos in ...
2283
2284
   * Initialize the state based on the randomization method available.
   * return true if the pre-computed list is available, false otherwise.
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2285
2286
2287
2288
2289
2290
2291
2292
2293
   */
  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...
2294
  	rand = get_random_int();
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2295
2296
2297
2298
2299
2300
2301
2302
  
  	/* 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...
2303
  		state->pos = rand % count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2304
2305
2306
2307
2308
2309
2310
2311
  		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...
2312
2313
2314
  	if (state->pos >= state->count)
  		state->pos = 0;
  	return state->list[state->pos++];
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2315
  }
7c00fce98   Thomas Garnier   mm: reorganize SL...
2316
2317
2318
2319
2320
2321
  /* 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...
2322
2323
2324
2325
2326
2327
  /*
   * 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...
2328
  	unsigned int objfreelist = 0, i, rand, count = cachep->num;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
  	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...
2353
2354
2355
2356
2357
2358
2359
2360
2361
  		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...
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
  	} 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...
2379
2380
2381
2382
  static void cache_init_objs(struct kmem_cache *cachep,
  			    struct page *page)
  {
  	int i;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2383
  	void *objp;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2384
  	bool shuffled;
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2385
2386
  
  	cache_init_objs_debug(cachep, page);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2387
2388
2389
2390
  	/* Try to randomize the freelist if enabled */
  	shuffled = shuffle_freelist(cachep, page);
  
  	if (!shuffled && OBJFREELIST_SLAB(cachep)) {
b03a017be   Joonsoo Kim   mm/slab: introduc...
2391
2392
2393
  		page->freelist = index_to_obj(cachep, page, cachep->num - 1) +
  						obj_offset(cachep);
  	}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2394
  	for (i = 0; i < cachep->num; i++) {
b3cbd9bf7   Andrey Ryabinin   mm/kasan: get rid...
2395
  		objp = index_to_obj(cachep, page, i);
4d176711e   Andrey Konovalov   kasan: preassign ...
2396
  		objp = kasan_init_slab_obj(cachep, objp);
b3cbd9bf7   Andrey Ryabinin   mm/kasan: get rid...
2397

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

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

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

b1cb0982b   Joonsoo Kim   slab: change the ...
2425
  	/* Verify double free bug */
8456a648c   Joonsoo Kim   slab: use struct ...
2426
  	for (i = page->active; i < cachep->num; i++) {
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2427
  		if (get_free_obj(page, i) == objnr) {
85c3e4a5a   Geert Uytterhoeven   mm/slab.c: do not...
2428
2429
  			pr_err("slab: double free detected in cache '%s', objp %px
  ",
756a025f0   Joe Perches   mm: coalesce spli...
2430
  			       cachep->name, objp);
b1cb0982b   Joonsoo Kim   slab: change the ...
2431
2432
  			BUG();
  		}
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2433
2434
  	}
  #endif
8456a648c   Joonsoo Kim   slab: use struct ...
2435
  	page->active--;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2436
2437
  	if (!page->freelist)
  		page->freelist = objp + obj_offset(cachep);
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2438
  	set_free_obj(page, page->active, objnr);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2439
  }
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2440
2441
2442
  /*
   * 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_...
2443
   * virtual address for kfree, ksize, and slab debugging.
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2444
   */
8456a648c   Joonsoo Kim   slab: use struct ...
2445
  static void slab_map_pages(struct kmem_cache *cache, struct page *page,
7e0073552   Joonsoo Kim   slab: replace non...
2446
  			   void *freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2447
  {
a57a49887   Joonsoo Kim   slab: use __GFP_C...
2448
  	page->slab_cache = cache;
8456a648c   Joonsoo Kim   slab: use struct ...
2449
  	page->freelist = freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2450
2451
2452
2453
2454
2455
  }
  
  /*
   * 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...
2456
2457
  static struct page *cache_grow_begin(struct kmem_cache *cachep,
  				gfp_t flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2458
  {
7e0073552   Joonsoo Kim   slab: replace non...
2459
  	void *freelist;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2460
2461
  	size_t offset;
  	gfp_t local_flags;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2462
  	int page_node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2463
  	struct kmem_cache_node *n;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2464
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2465

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2466
2467
2468
  	/*
  	 * 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
2469
  	 */
444050990   Long Li   mm, slab: check G...
2470
2471
  	if (unlikely(flags & GFP_SLAB_BUG_MASK))
  		flags = kmalloc_fix_flags(flags);
128227e7f   Matthew Wilcox   slab: __GFP_ZERO ...
2472
  	WARN_ON_ONCE(cachep->ctor && (flags & __GFP_ZERO));
6cb062296   Christoph Lameter   Categorize GFP flags
2473
  	local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2474

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2475
  	check_irq_off();
d0164adc8   Mel Gorman   mm, page_alloc: d...
2476
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2477
2478
2479
  		local_irq_enable();
  
  	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2480
2481
  	 * Get mem for the objs.  Attempt to allocate a physical page from
  	 * 'nodeid'.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2482
  	 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
2483
  	page = kmem_getpages(cachep, local_flags, nodeid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
2484
  	if (!page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2485
  		goto failed;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2486
2487
  	page_node = page_to_nid(page);
  	n = get_node(cachep, page_node);
03d1d43a1   Joonsoo Kim   mm/slab: racy acc...
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
  
  	/* 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...
2499
2500
2501
2502
2503
2504
  	/*
  	 * 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
2505
  	/* Get slab management. */
8456a648c   Joonsoo Kim   slab: use struct ...
2506
  	freelist = alloc_slabmgmt(cachep, page, offset,
511e3a058   Joonsoo Kim   mm/slab: make cac...
2507
  			local_flags & ~GFP_CONSTRAINT_MASK, page_node);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2508
  	if (OFF_SLAB(cachep) && !freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2509
  		goto opps1;
8456a648c   Joonsoo Kim   slab: use struct ...
2510
  	slab_map_pages(cachep, page, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2511

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

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

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

76b342bdc   Joonsoo Kim   mm/slab: separate...
2546
2547
2548
2549
2550
  	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
2551
2552
2553
2554
2555
2556
2557
2558
  }
  
  #if DEBUG
  
  /*
   * Perform extra freeing checks:
   * - detect bad pointers.
   * - POISON/RED_ZONE checking
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2559
2560
2561
   */
  static void kfree_debugcheck(const void *objp)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2562
  	if (!virt_addr_valid(objp)) {
1170532bb   Joe Perches   mm: convert print...
2563
2564
  		pr_err("kfree_debugcheck: out of range ptr %lxh
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2565
2566
  		       (unsigned long)objp);
  		BUG();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2567
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2568
  }
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2569
2570
  static inline void verify_redzone_free(struct kmem_cache *cache, void *obj)
  {
b46b8f19c   David Woodhouse   Increase slab red...
2571
  	unsigned long long redzone1, redzone2;
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
  
  	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...
2586
2587
  	pr_err("%px: redzone 1:0x%llx, redzone 2:0x%llx
  ",
1170532bb   Joe Perches   mm: convert print...
2588
  	       obj, redzone1, redzone2);
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2589
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2590
  static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2591
  				   unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2592
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2593
  	unsigned int objnr;
8456a648c   Joonsoo Kim   slab: use struct ...
2594
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2595

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2614
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2615
  		poison_obj(cachep, objp, POISON_FREE);
80552f0f7   Qian Cai   mm/slab: Remove s...
2616
  		slab_kernel_map(cachep, objp, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2617
2618
2619
  	}
  	return objp;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2620
2621
  #else
  #define kfree_debugcheck(x) do { } while(0)
0b4116340   Zhiyuan Dai   mm/slab: minor co...
2622
  #define cache_free_debugcheck(x, objp, z) (objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2623
  #endif
b03a017be   Joonsoo Kim   mm/slab: introduc...
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
  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...
2638
  static inline void fixup_slab_list(struct kmem_cache *cachep,
b03a017be   Joonsoo Kim   mm/slab: introduc...
2639
2640
  				struct kmem_cache_node *n, struct page *page,
  				void **list)
d8410234d   Joonsoo Kim   mm/slab: factor o...
2641
2642
  {
  	/* move slabp to correct slabp list: */
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2643
  	list_del(&page->slab_list);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2644
  	if (page->active == cachep->num) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2645
  		list_add(&page->slab_list, &n->slabs_full);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
  		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...
2659
  		list_add(&page->slab_list, &n->slabs_partial);
d8410234d   Joonsoo Kim   mm/slab: factor o...
2660
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2661
2662
  /* 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...
2663
  					struct page *page, bool pfmemalloc)
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
  {
  	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...
2681
  	list_del(&page->slab_list);
bf00bd345   David Rientjes   mm, slab: maintai...
2682
  	if (!page->active) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2683
  		list_add_tail(&page->slab_list, &n->slabs_free);
bf00bd345   David Rientjes   mm, slab: maintai...
2684
  		n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2685
  	} else
16cb0ec75   Tobin C. Harding   slab: use slab_li...
2686
  		list_add_tail(&page->slab_list, &n->slabs_partial);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2687

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

7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2719
2720
  	return page;
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
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
2747
  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...
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
  /*
   * 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...
2771
  static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2772
2773
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2774
  	struct kmem_cache_node *n;
801faf0db   Joonsoo Kim   mm/slab: lockless...
2775
  	struct array_cache *ac, *shared;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2776
  	int node;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2777
  	void *list = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2778
  	struct page *page;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2779

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

9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2783
  	ac = cpu_cache_get(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2784
2785
  	batchcount = ac->batchcount;
  	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2786
2787
2788
2789
  		/*
  		 * 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
2790
2791
2792
  		 */
  		batchcount = BATCHREFILL_LIMIT;
  	}
18bf85411   Christoph Lameter   slab: use get_nod...
2793
  	n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2794

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

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

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

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

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

801faf0db   Joonsoo Kim   mm/slab: lockless...
2825
  direct_grow:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2826
  	if (unlikely(!ac->avail)) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2827
2828
2829
2830
2831
2832
2833
  		/* 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...
2834
  		page = cache_grow_begin(cachep, gfp_exact_node(flags), node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2835

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

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

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

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

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2911
2912
  		STATS_INC_ALLOCHIT(cachep);
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2913
  	}
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2914
2915
  
  	STATS_INC_ALLOCMISS(cachep);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2916
  	objp = cache_alloc_refill(cachep, flags);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2917
2918
2919
2920
2921
2922
2923
  	/*
  	 * 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...
2924
2925
2926
2927
2928
  	/*
  	 * 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...
2929
2930
  	if (objp)
  		kmemleak_erase(&ac->entry[ac->avail]);
5c3823008   Alok N Kataria   [PATCH] kmalloc_n...
2931
2932
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2933
2934
  #ifdef CONFIG_NUMA
  /*
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
2935
   * Try allocating on another node if PFA_SPREAD_SLAB is a mempolicy is set.
c61afb181   Paul Jackson   [PATCH] cpuset me...
2936
2937
2938
2939
2940
2941
2942
   *
   * 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...
2943
  	if (in_interrupt() || (flags & __GFP_THISNODE))
c61afb181   Paul Jackson   [PATCH] cpuset me...
2944
  		return NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2945
  	nid_alloc = nid_here = numa_mem_id();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2946
  	if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD))
6adef3ebe   Jack Steiner   cpusets: new roun...
2947
  		nid_alloc = cpuset_slab_spread_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2948
  	else if (current->mempolicy)
2a389610a   David Rientjes   mm, mempolicy: re...
2949
  		nid_alloc = mempolicy_slab_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
2950
  	if (nid_alloc != nid_here)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
2951
  		return ____cache_alloc_node(cachep, flags, nid_alloc);
c61afb181   Paul Jackson   [PATCH] cpuset me...
2952
2953
2954
2955
  	return NULL;
  }
  
  /*
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2956
   * Fallback function if there was no memory available and no objects on a
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2957
   * certain node and fall back is permitted. First we scan all the
6a67368c3   Christoph Lameter   slab: Rename node...
2958
   * available node for available objects. If that fails then we
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2959
2960
2961
   * 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...
2962
   */
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2963
  static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2964
  {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2965
  	struct zonelist *zonelist;
dd1a239f6   Mel Gorman   mm: have zonelist...
2966
  	struct zoneref *z;
54a6eb5c4   Mel Gorman   mm: use two zonel...
2967
  	struct zone *zone;
97a225e69   Joonsoo Kim   mm/page_alloc: in...
2968
  	enum zone_type highest_zoneidx = gfp_zone(flags);
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
2969
  	void *obj = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2970
  	struct page *page;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2971
  	int nid;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2972
  	unsigned int cpuset_mems_cookie;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
2973
2974
2975
  
  	if (flags & __GFP_THISNODE)
  		return NULL;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2976
  retry_cpuset:
d26914d11   Mel Gorman   mm: optimize put_...
2977
  	cpuset_mems_cookie = read_mems_allowed_begin();
2a389610a   David Rientjes   mm, mempolicy: re...
2978
  	zonelist = node_zonelist(mempolicy_slab_node(), flags);
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
2979

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

061d7074e   Vladimir Davydov   slab: fix cpuset ...
2988
  		if (cpuset_zone_allowed(zone, flags) &&
18bf85411   Christoph Lameter   slab: use get_nod...
2989
2990
  			get_node(cache, nid) &&
  			get_node(cache, nid)->free_objects) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2991
  				obj = ____cache_alloc_node(cache,
4167e9b2c   David Rientjes   mm: remove GFP_TH...
2992
  					gfp_exact_node(flags), nid);
481c5346d   Christoph Lameter   Slab: Fix memory ...
2993
2994
2995
  				if (obj)
  					break;
  		}
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2996
  	}
cfce66047   Christoph Lameter   Slab allocators: ...
2997
  	if (!obj) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
2998
2999
3000
3001
3002
3003
  		/*
  		 * 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...
3004
3005
3006
3007
  		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...
3008
3009
  			obj = ____cache_alloc_node(cache,
  				gfp_exact_node(flags), nid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
3010

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

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

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

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

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

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

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

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3062
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
3063
  	spin_unlock(&n->list_lock);
76b342bdc   Joonsoo Kim   mm/slab: separate...
3064
  	page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid);
213b46958   Joonsoo Kim   mm/slab: refill c...
3065
3066
3067
3068
  	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...
3069
  	cache_grow_end(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3070

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

8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3074
  static __always_inline void *
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3075
  slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid, size_t orig_size,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3076
  		   unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3077
3078
3079
  {
  	unsigned long save_flags;
  	void *ptr;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3080
  	int slab_node = numa_mem_id();
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3081
  	struct obj_cgroup *objcg = NULL;
da844b787   Andrey Konovalov   kasan, mm: integr...
3082
  	bool init = false;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3083

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

18bf85411   Christoph Lameter   slab: use get_nod...
3096
  	if (unlikely(!get_node(cachep, nodeid))) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3097
3098
3099
3100
  		/* Node not bootstrapped yet */
  		ptr = fallback_alloc(cachep, flags);
  		goto out;
  	}
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3101
  	if (nodeid == slab_node) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
  		/*
  		 * 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);
da844b787   Andrey Konovalov   kasan, mm: integr...
3117
  	init = slab_want_init_on_alloc(flags, cachep);
d07dbea46   Christoph Lameter   Slab allocators: ...
3118

d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3119
  out_hooks:
da844b787   Andrey Konovalov   kasan, mm: integr...
3120
  	slab_post_alloc_hook(cachep, objcg, flags, 1, &ptr, init);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3121
3122
3123
3124
3125
3126
3127
  	return ptr;
  }
  
  static __always_inline void *
  __do_cache_alloc(struct kmem_cache *cache, gfp_t flags)
  {
  	void *objp;
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
3128
  	if (current->mempolicy || cpuset_do_slab_mem_spread()) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
  		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...
3139
3140
  	if (!objp)
  		objp = ____cache_alloc_node(cache, flags, numa_mem_id());
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
  
    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 *
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3156
  slab_alloc(struct kmem_cache *cachep, gfp_t flags, size_t orig_size, unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3157
3158
3159
  {
  	unsigned long save_flags;
  	void *objp;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3160
  	struct obj_cgroup *objcg = NULL;
da844b787   Andrey Konovalov   kasan, mm: integr...
3161
  	bool init = false;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3162

dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3163
  	flags &= gfp_allowed_mask;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3164
  	cachep = slab_pre_alloc_hook(cachep, &objcg, 1, flags);
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3165
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3166
  		return NULL;
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3167
3168
3169
  	objp = kfence_alloc(cachep, orig_size, flags);
  	if (unlikely(objp))
  		goto out;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3170
3171
3172
3173
3174
3175
  	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);
da844b787   Andrey Konovalov   kasan, mm: integr...
3176
  	init = slab_want_init_on_alloc(flags, cachep);
d07dbea46   Christoph Lameter   Slab allocators: ...
3177

d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3178
  out:
da844b787   Andrey Konovalov   kasan, mm: integr...
3179
  	slab_post_alloc_hook(cachep, objcg, flags, 1, &objp, init);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3180
3181
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3182
3183
  
  /*
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3184
   * Caller needs to acquire correct kmem_cache_node's list_lock
97654dfa2   Joonsoo Kim   slab: defer slab_...
3185
   * @list: List of detached free slabs should be freed by caller
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3186
   */
97654dfa2   Joonsoo Kim   slab: defer slab_...
3187
3188
  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
3189
3190
  {
  	int i;
25c063fbd   Joonsoo Kim   slab: move up cod...
3191
  	struct kmem_cache_node *n = get_node(cachep, node);
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3192
3193
3194
  	struct page *page;
  
  	n->free_objects += nr_objects;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3195
3196
  
  	for (i = 0; i < nr_objects; i++) {
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3197
  		void *objp;
8456a648c   Joonsoo Kim   slab: use struct ...
3198
  		struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3199

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3200
  		objp = objpp[i];
8456a648c   Joonsoo Kim   slab: use struct ...
3201
  		page = virt_to_head_page(objp);
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3202
  		list_del(&page->slab_list);
ff69416e6   Christoph Lameter   [PATCH] slab: fix...
3203
  		check_spinlock_acquired_node(cachep, node);
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3204
  		slab_put_obj(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3205
  		STATS_DEC_ACTIVE(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3206
3207
  
  		/* fixup slab chains */
f728b0a5d   Greg Thelen   mm, slab: faster ...
3208
  		if (page->active == 0) {
16cb0ec75   Tobin C. Harding   slab: use slab_li...
3209
  			list_add(&page->slab_list, &n->slabs_free);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3210
  			n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3211
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3212
3213
3214
3215
  			/* 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...
3216
  			list_add_tail(&page->slab_list, &n->slabs_partial);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3217
3218
  		}
  	}
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3219
3220
3221
  
  	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...
3222
3223
  		page = list_last_entry(&n->slabs_free, struct page, slab_list);
  		list_move(&page->slab_list, list);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3224
  		n->free_slabs--;
bf00bd345   David Rientjes   mm, slab: maintai...
3225
  		n->total_slabs--;
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3226
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3227
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3228
  static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3229
3230
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3231
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3232
  	int node = numa_mem_id();
97654dfa2   Joonsoo Kim   slab: defer slab_...
3233
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3234
3235
  
  	batchcount = ac->batchcount;
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3236

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

16cb0ec75   Tobin C. Harding   slab: use slab_li...
3259
  		list_for_each_entry(page, &n->slabs_free, slab_list) {
8456a648c   Joonsoo Kim   slab: use struct ...
3260
  			BUG_ON(page->active);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3261
3262
  
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3263
3264
3265
3266
  		}
  		STATS_SET_FREEABLE(cachep, i);
  	}
  #endif
ce8eb6c42   Christoph Lameter   slab: Rename list...
3267
  	spin_unlock(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3268
  	ac->avail -= batchcount;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3269
  	memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail);
678ff6a7a   Shakeel Butt   mm: slab: fix pot...
3270
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3271
3272
3273
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3274
3275
   * 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
3276
   */
ee3ce779b   Dmitry Vyukov   kasan: don't use ...
3277
3278
  static __always_inline void __cache_free(struct kmem_cache *cachep, void *objp,
  					 unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3279
  {
d57a964e0   Andrey Konovalov   kasan, mm: integr...
3280
  	bool init;
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3281
3282
  	if (is_kfence_address(objp)) {
  		kmemleak_free_recursive(objp, cachep->flags);
dd84d71bc   Muchun Song   mm: kfence: fix m...
3283
  		memcg_slab_free_hook(cachep, &objp, 1);
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3284
3285
3286
  		__kfence_free(objp);
  		return;
  	}
d57a964e0   Andrey Konovalov   kasan, mm: integr...
3287
3288
3289
3290
3291
3292
3293
  	/*
  	 * As memory initialization might be integrated into KASAN,
  	 * kasan_slab_free and initialization memset must be
  	 * kept together to avoid discrepancies in behavior.
  	 */
  	init = slab_want_init_on_free(cachep);
  	if (init && !kasan_has_integrated_init())
a32d654db   Alexander Popov   mm/slab: rerform ...
3294
  		memset(objp, 0, cachep->object_size);
d57a964e0   Andrey Konovalov   kasan, mm: integr...
3295
3296
  	/* KASAN might put objp into memory quarantine, delaying its reuse. */
  	if (kasan_slab_free(cachep, objp, init))
55834c590   Alexander Potapenko   mm: kasan: initia...
3297
  		return;
cfbe1636c   Marco Elver   mm, kcsan: instru...
3298
3299
3300
3301
  	/* 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...
3302
3303
  	___cache_free(cachep, objp, caller);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3304

55834c590   Alexander Potapenko   mm: kasan: initia...
3305
3306
3307
3308
  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...
3309

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3310
  	check_irq_off();
d5cff6352   Catalin Marinas   kmemleak: Add the...
3311
  	kmemleak_free_recursive(objp, cachep->flags);
a947eb95e   Suleiman Souhlal   SLAB: Record actu...
3312
  	objp = cache_free_debugcheck(cachep, objp, caller);
d1b2cf6cb   Bharata B Rao   mm: memcg/slab: u...
3313
  	memcg_slab_free_hook(cachep, &objp, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3314

1807a1aaf   Siddha, Suresh B   slab: skip callin...
3315
3316
3317
3318
3319
3320
3321
  	/*
  	 * 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...
3322
  	if (nr_online_nodes > 1 && cache_free_alien(cachep, objp))
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
3323
  		return;
3d8801940   Joonsoo Kim   mm/slab: move cac...
3324
  	if (ac->avail < ac->limit) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3325
  		STATS_INC_FREEHIT(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3326
3327
3328
  	} else {
  		STATS_INC_FREEMISS(cachep);
  		cache_flusharray(cachep, ac);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3329
  	}
42c8c99cd   Zhao Jin   slab, cleanup: re...
3330

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
3331
3332
3333
3334
3335
3336
3337
3338
  	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...
3339
  	__free_one(ac, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3340
3341
3342
3343
3344
3345
3346
3347
3348
  }
  
  /**
   * 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:...
3349
3350
   *
   * Return: pointer to the new object or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3351
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3352
  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3353
  {
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3354
  	void *ret = slab_alloc(cachep, flags, cachep->object_size, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3355

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3356
  	trace_kmem_cache_alloc(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3357
  			       cachep->object_size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3358
3359
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3360
3361
  }
  EXPORT_SYMBOL(kmem_cache_alloc);
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3362
3363
3364
3365
3366
3367
3368
3369
3370
  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...
3371
  int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3372
  			  void **p)
484748f0b   Christoph Lameter   slab: infrastruct...
3373
  {
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3374
  	size_t i;
964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3375
  	struct obj_cgroup *objcg = NULL;
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3376

964d4bd37   Roman Gushchin   mm: memcg/slab: s...
3377
  	s = slab_pre_alloc_hook(s, &objcg, size, flags);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3378
3379
3380
3381
3382
3383
3384
  	if (!s)
  		return 0;
  
  	cache_alloc_debugcheck_before(s, flags);
  
  	local_irq_disable();
  	for (i = 0; i < size; i++) {
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3385
  		void *objp = kfence_alloc(s, s->object_size, flags) ?: __do_cache_alloc(s, flags);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3386

2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3387
3388
3389
3390
3391
  		if (unlikely(!objp))
  			goto error;
  		p[i] = objp;
  	}
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3392
  	cache_alloc_debugcheck_after_bulk(s, flags, size, p, _RET_IP_);
da844b787   Andrey Konovalov   kasan, mm: integr...
3393
3394
3395
3396
3397
3398
  	/*
  	 * memcg and kmem_cache debug support and memory initialization.
  	 * Done outside of the IRQ disabled section.
  	 */
  	slab_post_alloc_hook(s, objcg, flags, size, p,
  				slab_want_init_on_alloc(flags, s));
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3399
3400
3401
3402
  	/* FIXME: Trace call missing. Christoph would like a bulk variant */
  	return size;
  error:
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3403
  	cache_alloc_debugcheck_after_bulk(s, flags, i, p, _RET_IP_);
da844b787   Andrey Konovalov   kasan, mm: integr...
3404
  	slab_post_alloc_hook(s, objcg, flags, i, p, false);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3405
3406
  	__kmem_cache_free_bulk(s, i, p);
  	return 0;
484748f0b   Christoph Lameter   slab: infrastruct...
3407
3408
  }
  EXPORT_SYMBOL(kmem_cache_alloc_bulk);
0f24f1287   Li Zefan   tracing, slab: De...
3409
  #ifdef CONFIG_TRACING
85beb5869   Steven Rostedt   tracing/slab: Mov...
3410
  void *
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3411
  kmem_cache_alloc_trace(struct kmem_cache *cachep, gfp_t flags, size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3412
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3413
  	void *ret;
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3414
  	ret = slab_alloc(cachep, flags, size, _RET_IP_);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3415

0116523cf   Andrey Konovalov   kasan, mm: change...
3416
  	ret = kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3417
  	trace_kmalloc(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3418
  		      size, cachep->size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3419
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3420
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3421
  EXPORT_SYMBOL(kmem_cache_alloc_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3422
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3423
  #ifdef CONFIG_NUMA
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
  /**
   * 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:...
3434
3435
   *
   * Return: pointer to the new object or %NULL in case of error
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3436
   */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3437
3438
  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
  {
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3439
  	void *ret = slab_alloc_node(cachep, flags, nodeid, cachep->object_size, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3440

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3441
  	trace_kmem_cache_alloc_node(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3442
  				    cachep->object_size, cachep->size,
ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3443
  				    flags, nodeid);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3444
3445
  
  	return ret;
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3446
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3447
  EXPORT_SYMBOL(kmem_cache_alloc_node);
0f24f1287   Li Zefan   tracing, slab: De...
3448
  #ifdef CONFIG_TRACING
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3449
  void *kmem_cache_alloc_node_trace(struct kmem_cache *cachep,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3450
  				  gfp_t flags,
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3451
3452
  				  int nodeid,
  				  size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3453
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3454
  	void *ret;
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3455
  	ret = slab_alloc_node(cachep, flags, nodeid, size, _RET_IP_);
505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3456

0116523cf   Andrey Konovalov   kasan, mm: change...
3457
  	ret = kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3458
  	trace_kmalloc_node(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3459
  			   size, cachep->size,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3460
3461
  			   flags, nodeid);
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3462
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3463
  EXPORT_SYMBOL(kmem_cache_alloc_node_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3464
  #endif
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3465
  static __always_inline void *
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3466
  __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3467
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3468
  	struct kmem_cache *cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3469
  	void *ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3470

61448479a   Dmitry Vyukov   mm: don't warn ab...
3471
3472
  	if (unlikely(size > KMALLOC_MAX_CACHE_SIZE))
  		return NULL;
2c59dd654   Christoph Lameter   slab: Common Kmal...
3473
  	cachep = kmalloc_slab(size, flags);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3474
3475
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3476
  	ret = kmem_cache_alloc_node_trace(cachep, flags, node, size);
0116523cf   Andrey Konovalov   kasan, mm: change...
3477
  	ret = kasan_kmalloc(cachep, ret, size, flags);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3478
3479
  
  	return ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3480
  }
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3481

8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3482
3483
  void *__kmalloc_node(size_t size, gfp_t flags, int node)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3484
  	return __do_kmalloc_node(size, flags, node, _RET_IP_);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3485
  }
dbe5e69d2   Christoph Hellwig   [PATCH] slab: opt...
3486
  EXPORT_SYMBOL(__kmalloc_node);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3487
3488
  
  void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3489
  		int node, unsigned long caller)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3490
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3491
  	return __do_kmalloc_node(size, flags, node, caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3492
3493
  }
  EXPORT_SYMBOL(__kmalloc_node_track_caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3494
  #endif /* CONFIG_NUMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3495

5bb1bb353   Paul E. McKenney   mm: Don't build m...
3496
  #ifdef CONFIG_PRINTK
a52e73bef   Marco Elver   mm, kfence: suppo...
3497
  void __kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
8e7f37f2a   Paul E. McKenney   mm: Add mem_dump_...
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
  {
  	struct kmem_cache *cachep;
  	unsigned int objnr;
  	void *objp;
  
  	kpp->kp_ptr = object;
  	kpp->kp_page = page;
  	cachep = page->slab_cache;
  	kpp->kp_slab_cache = cachep;
  	objp = object - obj_offset(cachep);
  	kpp->kp_data_offset = obj_offset(cachep);
  	page = virt_to_head_page(objp);
  	objnr = obj_to_index(cachep, page, objp);
  	objp = index_to_obj(cachep, page, objnr);
  	kpp->kp_objp = objp;
  	if (DEBUG && cachep->flags & SLAB_STORE_USER)
  		kpp->kp_ret = *dbg_userword(cachep, objp);
  }
5bb1bb353   Paul E. McKenney   mm: Don't build m...
3516
  #endif
8e7f37f2a   Paul E. McKenney   mm: Add mem_dump_...
3517

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3518
  /**
800590f52   Paul Drynoff   [PATCH] slab: kma...
3519
   * __do_kmalloc - allocate memory
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3520
   * @size: how many bytes of memory are required.
800590f52   Paul Drynoff   [PATCH] slab: kma...
3521
   * @flags: the type of memory to allocate (see kmalloc).
911851e6e   Randy Dunlap   [PATCH] slab: fix...
3522
   * @caller: function caller for debug tracking of the caller
a862f68a8   Mike Rapoport   docs/core-api/mm:...
3523
3524
   *
   * Return: pointer to the allocated memory or %NULL in case of error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3525
   */
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3526
  static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3527
  					  unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3528
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3529
  	struct kmem_cache *cachep;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3530
  	void *ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3531

61448479a   Dmitry Vyukov   mm: don't warn ab...
3532
3533
  	if (unlikely(size > KMALLOC_MAX_CACHE_SIZE))
  		return NULL;
2c59dd654   Christoph Lameter   slab: Common Kmal...
3534
  	cachep = kmalloc_slab(size, flags);
a5c96d8a1   Linus Torvalds   Fix up non-NUMA S...
3535
3536
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
3537
  	ret = slab_alloc(cachep, flags, size, caller);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3538

0116523cf   Andrey Konovalov   kasan, mm: change...
3539
  	ret = kasan_kmalloc(cachep, ret, size, flags);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3540
  	trace_kmalloc(caller, ret,
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3541
  		      size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3542
3543
  
  	return ret;
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3544
  }
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3545
3546
  void *__kmalloc(size_t size, gfp_t flags)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3547
  	return __do_kmalloc(size, flags, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3548
3549
  }
  EXPORT_SYMBOL(__kmalloc);
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3550
  void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller)
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3551
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3552
  	return __do_kmalloc(size, flags, caller);
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3553
3554
  }
  EXPORT_SYMBOL(__kmalloc_track_caller);
1d2c8eea6   Christoph Hellwig   [PATCH] slab: cle...
3555

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3556
3557
3558
3559
3560
3561
3562
3563
  /**
   * 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...
3564
  void kmem_cache_free(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3565
3566
  {
  	unsigned long flags;
b9ce5ef49   Glauber Costa   sl[au]b: always g...
3567
3568
3569
  	cachep = cache_from_obj(cachep, objp);
  	if (!cachep)
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3570
3571
  
  	local_irq_save(flags);
d97d476b1   Feng Tang   slab: Fix a typo ...
3572
  	debug_check_no_locks_freed(objp, cachep->object_size);
3ac7fe5a4   Thomas Gleixner   infrastructure to...
3573
  	if (!(cachep->flags & SLAB_DEBUG_OBJECTS))
8c138bc00   Christoph Lameter   slab: Get rid of ...
3574
  		debug_check_no_obj_freed(objp, cachep->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3575
  	__cache_free(cachep, objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3576
  	local_irq_restore(flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3577

3544de8ee   Jacob Wen   mm, tracing: reco...
3578
  	trace_kmem_cache_free(_RET_IP_, objp, cachep->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3579
3580
  }
  EXPORT_SYMBOL(kmem_cache_free);
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3581
3582
3583
3584
3585
3586
3587
3588
  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...
3589
3590
3591
3592
  		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...
3593
3594
  		if (!s)
  			continue;
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
  
  		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
3607
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3608
3609
3610
   * kfree - free previously allocated memory
   * @objp: pointer returned by kmalloc.
   *
80e93effc   Pekka Enberg   [PATCH] update kf...
3611
3612
   * If @objp is NULL, no operation is performed.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3613
3614
3615
3616
3617
   * 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...
3618
  	struct kmem_cache *c;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3619
  	unsigned long flags;
2121db74b   Pekka Enberg   kmemtrace: trace ...
3620
  	trace_kfree(_RET_IP_, objp);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3621
  	if (unlikely(ZERO_OR_NULL_PTR(objp)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3622
3623
3624
  		return;
  	local_irq_save(flags);
  	kfree_debugcheck(objp);
6ed5eb221   Pekka Enberg   [PATCH] slab: ext...
3625
  	c = virt_to_cache(objp);
a64b53780   Kees Cook   mm/slab: sanity-c...
3626
3627
3628
3629
  	if (!c) {
  		local_irq_restore(flags);
  		return;
  	}
8c138bc00   Christoph Lameter   slab: Get rid of ...
3630
3631
3632
  	debug_check_no_locks_freed(objp, c->object_size);
  
  	debug_check_no_obj_freed(objp, c->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3633
  	__cache_free(c, (void *)objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3634
3635
3636
  	local_irq_restore(flags);
  }
  EXPORT_SYMBOL(kfree);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3637
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3638
   * This initializes kmem_cache_node or resizes various caches for all nodes.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3639
   */
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3640
  static int setup_kmem_cache_nodes(struct kmem_cache *cachep, gfp_t gfp)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3641
  {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3642
  	int ret;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3643
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3644
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3645

9c09a95cf   Mel Gorman   slab: partially r...
3646
  	for_each_online_node(node) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3647
3648
  		ret = setup_kmem_cache_node(cachep, node, gfp, true);
  		if (ret)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3649
  			goto fail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3650
  	}
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3651

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3654
  fail:
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3655
  	if (!cachep->list.next) {
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3656
3657
3658
  		/* Cache is not active yet. Roll back what we did */
  		node--;
  		while (node >= 0) {
18bf85411   Christoph Lameter   slab: use get_nod...
3659
3660
  			n = get_node(cachep, node);
  			if (n) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
3661
3662
3663
  				kfree(n->shared);
  				free_alien_cache(n->alien);
  				kfree(n);
6a67368c3   Christoph Lameter   slab: Rename node...
3664
  				cachep->node[node] = NULL;
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3665
3666
3667
3668
  			}
  			node--;
  		}
  	}
cafeb02e0   Christoph Lameter   [PATCH] alloc_kme...
3669
  	return -ENOMEM;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3670
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3671
  /* Always called with the slab_mutex held */
10befea91   Roman Gushchin   mm: memcg/slab: u...
3672
3673
  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
3674
  {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3675
3676
  	struct array_cache __percpu *cpu_cache, *prev;
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3677

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3678
3679
  	cpu_cache = alloc_kmem_cache_cpus(cachep, limit, batchcount);
  	if (!cpu_cache)
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
3680
  		return -ENOMEM;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3681
3682
  	prev = cachep->cpu_cache;
  	cachep->cpu_cache = cpu_cache;
a87c75fbc   Greg Thelen   slab: avoid IPIs ...
3683
3684
3685
3686
3687
3688
  	/*
  	 * 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...
3689

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3690
  	check_irq_on();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3691
3692
  	cachep->batchcount = batchcount;
  	cachep->limit = limit;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3693
  	cachep->shared = shared;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3694

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3695
  	if (!prev)
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3696
  		goto setup_node;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3697
3698
  
  	for_each_online_cpu(cpu) {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3699
  		LIST_HEAD(list);
18bf85411   Christoph Lameter   slab: use get_nod...
3700
3701
  		int node;
  		struct kmem_cache_node *n;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3702
  		struct array_cache *ac = per_cpu_ptr(prev, cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3703

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3704
  		node = cpu_to_mem(cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3705
3706
  		n = get_node(cachep, node);
  		spin_lock_irq(&n->list_lock);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3707
  		free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
3708
  		spin_unlock_irq(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
3709
  		slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3710
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3711
  	free_percpu(prev);
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3712
3713
  setup_node:
  	return setup_kmem_cache_nodes(cachep, gfp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3714
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3715
  /* Called with slab_mutex held always */
83b519e8b   Pekka Enberg   slab: setup alloc...
3716
  static int enable_cpucache(struct kmem_cache *cachep, gfp_t gfp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3717
3718
  {
  	int err;
943a451a8   Glauber Costa   slab: propagate t...
3719
3720
3721
  	int limit = 0;
  	int shared = 0;
  	int batchcount = 0;
7c00fce98   Thomas Garnier   mm: reorganize SL...
3722
  	err = cache_random_seq_create(cachep, cachep->num, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3723
3724
  	if (err)
  		goto end;
943a451a8   Glauber Costa   slab: propagate t...
3725
3726
  	if (limit && shared && batchcount)
  		goto skip_setup;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3727
3728
  	/*
  	 * The head array serves three purposes:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3729
3730
  	 * - create a LIFO ordering, i.e. return objects that are cache-warm
  	 * - reduce the number of spinlock operations.
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3731
  	 * - reduce the number of linked list operations on the slab and
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3732
3733
3734
3735
  	 *   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...
3736
  	if (cachep->size > 131072)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3737
  		limit = 1;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3738
  	else if (cachep->size > PAGE_SIZE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3739
  		limit = 8;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3740
  	else if (cachep->size > 1024)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3741
  		limit = 24;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3742
  	else if (cachep->size > 256)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3743
3744
3745
  		limit = 54;
  	else
  		limit = 120;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3746
3747
  	/*
  	 * CPU bound tasks (e.g. network routing) can exhibit cpu bound
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3748
3749
3750
3751
3752
3753
3754
3755
  	 * 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...
3756
  	if (cachep->size <= PAGE_SIZE && num_possible_cpus() > 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3757
  		shared = 8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3758
3759
  
  #if DEBUG
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3760
3761
3762
  	/*
  	 * 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
3763
3764
3765
3766
  	 */
  	if (limit > 32)
  		limit = 32;
  #endif
943a451a8   Glauber Costa   slab: propagate t...
3767
3768
3769
  	batchcount = (limit + 1) / 2;
  skip_setup:
  	err = do_tune_cpucache(cachep, limit, batchcount, shared, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3770
  end:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3771
  	if (err)
1170532bb   Joe Perches   mm: convert print...
3772
3773
  		pr_err("enable_cpucache failed for %s, error %d
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3774
  		       cachep->name, -err);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
3775
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3776
  }
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3777
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3778
3779
   * 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...
3780
   * if drain_array() is used on the shared array.
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3781
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3782
  static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n,
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3783
  			 struct array_cache *ac, int node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3784
  {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3785
  	LIST_HEAD(list);
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3786
3787
3788
  
  	/* 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
3789

1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3790
3791
  	if (!ac || !ac->avail)
  		return;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3792
3793
  
  	if (ac->touched) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3794
  		ac->touched = 0;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3795
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3796
  	}
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3797
3798
3799
3800
3801
3802
  
  	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
3803
3804
3805
3806
  }
  
  /**
   * cache_reap - Reclaim memory from caches.
05fb6bf0b   Randy Dunlap   [PATCH] kernel-do...
3807
   * @w: work descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3808
3809
3810
3811
3812
3813
   *
   * 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
3814
3815
   * 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
3816
   */
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3817
  static void cache_reap(struct work_struct *w)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3818
  {
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
3819
  	struct kmem_cache *searchp;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3820
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3821
  	int node = numa_mem_id();
bf6aede71   Jean Delvare   workqueue: add to...
3822
  	struct delayed_work *work = to_delayed_work(w);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3823

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

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3828
  	list_for_each_entry(searchp, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3829
  		check_irq_on();
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3830
  		/*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3831
  		 * We only take the node lock if absolutely necessary and we
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3832
3833
3834
  		 * have established with reasonable certainty that
  		 * we can do some work if the lock was obtained.
  		 */
18bf85411   Christoph Lameter   slab: use get_nod...
3835
  		n = get_node(searchp, node);
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3836

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

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

35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3841
3842
3843
3844
  		/*
  		 * These are racy checks but it does not matter
  		 * if we skip one check or scan twice.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3845
  		if (time_after(n->next_reap, jiffies))
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3846
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3847

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
3852
3853
  		if (n->free_touched)
  			n->free_touched = 0;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3854
3855
  		else {
  			int freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3856

ce8eb6c42   Christoph Lameter   slab: Rename list...
3857
  			freed = drain_freelist(searchp, n, (n->free_limit +
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3858
3859
3860
  				5 * searchp->num - 1) / (5 * searchp->num));
  			STATS_ADD_REAPED(searchp, freed);
  		}
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3861
  next:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3862
3863
3864
  		cond_resched();
  	}
  	check_irq_on();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3865
  	mutex_unlock(&slab_mutex);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
3866
  	next_reap_node();
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3867
  out:
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3868
  	/* Set up the next iteration */
a9f2a846f   Vlastimil Babka   mm, slab: resched...
3869
3870
  	schedule_delayed_work_on(smp_processor_id(), work,
  				round_jiffies_relative(REAPTIMEOUT_AC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3871
  }
0d7561c61   Glauber Costa   sl[au]b: Process ...
3872
  void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3873
  {
f728b0a5d   Greg Thelen   mm, slab: faster ...
3874
  	unsigned long active_objs, num_objs, active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3875
3876
  	unsigned long total_slabs = 0, free_objs = 0, shared_avail = 0;
  	unsigned long free_slabs = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3877
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3878
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3879

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

bf00bd345   David Rientjes   mm, slab: maintai...
3884
3885
  		total_slabs += n->total_slabs;
  		free_slabs += n->free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3886
  		free_objs += n->free_objects;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3887

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
3891
  		spin_unlock_irq(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3892
  	}
bf00bd345   David Rientjes   mm, slab: maintai...
3893
3894
  	num_objs = total_slabs * cachep->num;
  	active_slabs = total_slabs - free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3895
  	active_objs = num_objs - free_objs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3896

0d7561c61   Glauber Costa   sl[au]b: Process ...
3897
3898
3899
  	sinfo->active_objs = active_objs;
  	sinfo->num_objs = num_objs;
  	sinfo->active_slabs = active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3900
  	sinfo->num_slabs = total_slabs;
0d7561c61   Glauber Costa   sl[au]b: Process ...
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
  	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
3911
  #if STATS
ce8eb6c42   Christoph Lameter   slab: Rename list...
3912
  	{			/* node stats */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3913
3914
3915
3916
3917
3918
  		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
3919
  		unsigned long node_allocs = cachep->node_allocs;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3920
  		unsigned long node_frees = cachep->node_frees;
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
3921
  		unsigned long overflows = cachep->node_overflow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3922

756a025f0   Joe Perches   mm: coalesce spli...
3923
  		seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu %4lu %4lu %4lu %4lu %4lu",
e92dd4fd1   Joe Perches   slab: Fix continu...
3924
3925
3926
  			   allocs, high, grown,
  			   reaped, errors, max_freeable, node_allocs,
  			   node_frees, overflows);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3927
3928
3929
3930
3931
3932
3933
3934
3935
  	}
  	/* 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...
3936
  			   allochit, allocmiss, freehit, freemiss);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3937
3938
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3939
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3940
3941
3942
3943
3944
3945
3946
  #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:...
3947
3948
   *
   * Return: %0 on success, negative error code otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3949
   */
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
3950
  ssize_t slabinfo_write(struct file *file, const char __user *buffer,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3951
  		       size_t count, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3952
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3953
  	char kbuf[MAX_SLABINFO_WRITE + 1], *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3954
  	int limit, batchcount, shared, res;
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
3955
  	struct kmem_cache *cachep;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3956

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3957
3958
3959
3960
  	if (count > MAX_SLABINFO_WRITE)
  		return -EINVAL;
  	if (copy_from_user(&kbuf, buffer, count))
  		return -EFAULT;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3961
  	kbuf[MAX_SLABINFO_WRITE] = '\0';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
  
  	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...
3972
  	mutex_lock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3973
  	res = -EINVAL;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3974
  	list_for_each_entry(cachep, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3975
  		if (!strcmp(cachep->name, kbuf)) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3976
3977
  			if (limit < 1 || batchcount < 1 ||
  					batchcount > limit || shared < 0) {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3978
  				res = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3979
  			} else {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3980
  				res = do_tune_cpucache(cachep, limit,
83b519e8b   Pekka Enberg   slab: setup alloc...
3981
3982
  						       batchcount, shared,
  						       GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3983
3984
3985
3986
  			}
  			break;
  		}
  	}
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3987
  	mutex_unlock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3988
3989
3990
3991
  	if (res >= 0)
  		res = count;
  	return res;
  }
871751e25   Al Viro   [PATCH] slab: imp...
3992

04385fc5e   Kees Cook   mm: SLAB hardened...
3993
3994
  #ifdef CONFIG_HARDENED_USERCOPY
  /*
afcc90f86   Kees Cook   usercopy: WARN() ...
3995
3996
3997
   * 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...
3998
3999
4000
4001
   *
   * Returns NULL if check passes, otherwise const char * to name of cache
   * to indicate an error.
   */
f4e6e289c   Kees Cook   usercopy: Include...
4002
4003
  void __check_heap_object(const void *ptr, unsigned long n, struct page *page,
  			 bool to_user)
04385fc5e   Kees Cook   mm: SLAB hardened...
4004
4005
4006
4007
  {
  	struct kmem_cache *cachep;
  	unsigned int objnr;
  	unsigned long offset;
219667c23   Andrey Konovalov   kasan, slab: fix ...
4008
  	ptr = kasan_reset_tag(ptr);
04385fc5e   Kees Cook   mm: SLAB hardened...
4009
4010
4011
4012
4013
4014
  	/* 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. */
d3fb45f37   Alexander Potapenko   mm, kfence: inser...
4015
4016
4017
4018
  	if (is_kfence_address(ptr))
  		offset = ptr - kfence_object_start(ptr);
  	else
  		offset = ptr - index_to_obj(cachep, page, objnr) - obj_offset(cachep);
04385fc5e   Kees Cook   mm: SLAB hardened...
4019

afcc90f86   Kees Cook   usercopy: WARN() ...
4020
4021
4022
4023
  	/* 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...
4024
  		return;
04385fc5e   Kees Cook   mm: SLAB hardened...
4025

afcc90f86   Kees Cook   usercopy: WARN() ...
4026
4027
4028
4029
4030
4031
  	/*
  	 * 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...
4032
4033
  	if (usercopy_fallback &&
  	    offset <= cachep->object_size &&
afcc90f86   Kees Cook   usercopy: WARN() ...
4034
4035
4036
4037
  	    n <= cachep->object_size - offset) {
  		usercopy_warn("SLAB object", cachep->name, to_user, offset, n);
  		return;
  	}
04385fc5e   Kees Cook   mm: SLAB hardened...
4038

f4e6e289c   Kees Cook   usercopy: Include...
4039
  	usercopy_abort("SLAB object", cachep->name, to_user, offset, n);
04385fc5e   Kees Cook   mm: SLAB hardened...
4040
4041
  }
  #endif /* CONFIG_HARDENED_USERCOPY */
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4042
  /**
10d1f8cb3   Marco Elver   mm/slab: refactor...
4043
   * __ksize -- Uninstrumented ksize.
87bf4f71a   Randy Dunlap   mm/slab.c: fix ke...
4044
   * @objp: pointer to the object
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4045
   *
10d1f8cb3   Marco Elver   mm/slab: refactor...
4046
4047
   * 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...
4048
4049
   *
   * Return: size of the actual memory used by @objp in bytes
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4050
   */
10d1f8cb3   Marco Elver   mm/slab: refactor...
4051
  size_t __ksize(const void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4052
  {
a64b53780   Kees Cook   mm/slab: sanity-c...
4053
  	struct kmem_cache *c;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4054
  	size_t size;
ef8b4520b   Christoph Lameter   Slab allocators: ...
4055
4056
  	BUG_ON(!objp);
  	if (unlikely(objp == ZERO_SIZE_PTR))
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4057
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4058

a64b53780   Kees Cook   mm/slab: sanity-c...
4059
4060
  	c = virt_to_cache(objp);
  	size = c ? c->object_size : 0;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4061
4062
  
  	return size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4063
  }
10d1f8cb3   Marco Elver   mm/slab: refactor...
4064
  EXPORT_SYMBOL(__ksize);