Blame view

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

b03a017be   Joonsoo Kim   mm/slab: introduc...
241
  #define CFLGS_OBJFREELIST_SLAB	(0x40000000UL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
  #define CFLGS_OFF_SLAB		(0x80000000UL)
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
248
249
  /*
   * Optimization question: fewer reaps means less probability for unnessary
   * 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++)
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
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)
4e60c86bd   Andi Kleen   gcc-4.6: mm: fix ...
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));
b46b8f19c   David Woodhouse   Increase slab red...
321
322
  	return (unsigned long long*) (objp + obj_offset(cachep) -
  				      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
  #define dbg_userword(cachep, objp)	({BUG(); (void **)NULL;})
  
  #endif
037873014   Joonsoo Kim   slab: fix oops wh...
347
  #ifdef CONFIG_DEBUG_SLAB_LEAK
d31676dfd   Joonsoo Kim   mm/slab: alternat...
348
  static inline bool is_store_user_clean(struct kmem_cache *cachep)
037873014   Joonsoo Kim   slab: fix oops wh...
349
  {
d31676dfd   Joonsoo Kim   mm/slab: alternat...
350
351
  	return atomic_read(&cachep->store_user_clean) == 1;
  }
037873014   Joonsoo Kim   slab: fix oops wh...
352

d31676dfd   Joonsoo Kim   mm/slab: alternat...
353
354
355
356
  static inline void set_store_user_clean(struct kmem_cache *cachep)
  {
  	atomic_set(&cachep->store_user_clean, 1);
  }
037873014   Joonsoo Kim   slab: fix oops wh...
357

d31676dfd   Joonsoo Kim   mm/slab: alternat...
358
359
360
361
  static inline void set_store_user_dirty(struct kmem_cache *cachep)
  {
  	if (is_store_user_clean(cachep))
  		atomic_set(&cachep->store_user_clean, 0);
037873014   Joonsoo Kim   slab: fix oops wh...
362
363
364
  }
  
  #else
d31676dfd   Joonsoo Kim   mm/slab: alternat...
365
  static inline void set_store_user_dirty(struct kmem_cache *cachep) {}
037873014   Joonsoo Kim   slab: fix oops wh...
366
367
  
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  /*
3df1cccdf   David Rientjes   slab: introduce s...
369
370
   * 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
371
   */
543585cc5   David Rientjes   slab: rename slab...
372
373
374
  #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...
375
  static bool slab_max_order_set __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376

6ed5eb221   Pekka Enberg   [PATCH] slab: ext...
377
378
  static inline struct kmem_cache *virt_to_cache(const void *obj)
  {
b49af68ff   Christoph Lameter   Add virt_to_head_...
379
  	struct page *page = virt_to_head_page(obj);
350260889   Christoph Lameter   slab: Remove some...
380
  	return page->slab_cache;
6ed5eb221   Pekka Enberg   [PATCH] slab: ext...
381
  }
8456a648c   Joonsoo Kim   slab: use struct ...
382
  static inline void *index_to_obj(struct kmem_cache *cache, struct page *page,
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
383
384
  				 unsigned int idx)
  {
8456a648c   Joonsoo Kim   slab: use struct ...
385
  	return page->s_mem + cache->size * idx;
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
386
  }
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
387
  /*
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
388
389
390
   * We want to avoid an expensive divide : (offset / cache->size)
   *   Using the fact that size is a constant for a particular cache,
   *   we can replace (offset / cache->size) by
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
391
392
393
   *   reciprocal_divide(offset, cache->reciprocal_buffer_size)
   */
  static inline unsigned int obj_to_index(const struct kmem_cache *cache,
8456a648c   Joonsoo Kim   slab: use struct ...
394
  					const struct page *page, void *obj)
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
395
  {
8456a648c   Joonsoo Kim   slab: use struct ...
396
  	u32 offset = (obj - page->s_mem);
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
397
  	return reciprocal_divide(offset, cache->reciprocal_buffer_size);
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
398
  }
6fb924304   Joonsoo Kim   mm/slab: remove u...
399
  #define BOOT_CPUCACHE_ENTRIES	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400
  /* internal cache of cache description objs */
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
401
  static struct kmem_cache kmem_cache_boot = {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
402
403
404
  	.batchcount = 1,
  	.limit = BOOT_CPUCACHE_ENTRIES,
  	.shared = 1,
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
405
  	.size = sizeof(struct kmem_cache),
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
406
  	.name = "kmem_cache",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
  };
1871e52c7   Tejun Heo   percpu: make perc...
408
  static DEFINE_PER_CPU(struct delayed_work, slab_reap_work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
410
  static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
  {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
412
  	return this_cpu_ptr(cachep->cpu_cache);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
414
415
416
  /*
   * Calculate the number of objects and left-over bytes for a given buffer size.
   */
70f75067b   Joonsoo Kim   mm/slab: avoid re...
417
418
  static unsigned int cache_estimate(unsigned long gfporder, size_t buffer_size,
  		unsigned long flags, size_t *left_over)
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
419
  {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
420
  	unsigned int num;
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
421
  	size_t slab_size = PAGE_SIZE << gfporder;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422

fbaccacff   Steven Rostedt   [PATCH] slab: cac...
423
424
425
426
427
  	/*
  	 * 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...
428
  	 * - @buffer_size bytes for each object
2e6b36021   Joonsoo Kim   mm/slab: put the ...
429
430
431
432
433
  	 * - 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...
434
435
436
437
438
439
  	 *
  	 * 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...
440
  	if (flags & (CFLGS_OBJFREELIST_SLAB | CFLGS_OFF_SLAB)) {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
441
  		num = slab_size / buffer_size;
2e6b36021   Joonsoo Kim   mm/slab: put the ...
442
  		*left_over = slab_size % buffer_size;
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
443
  	} else {
70f75067b   Joonsoo Kim   mm/slab: avoid re...
444
  		num = slab_size / (buffer_size + sizeof(freelist_idx_t));
2e6b36021   Joonsoo Kim   mm/slab: put the ...
445
446
  		*left_over = slab_size %
  			(buffer_size + sizeof(freelist_idx_t));
fbaccacff   Steven Rostedt   [PATCH] slab: cac...
447
  	}
70f75067b   Joonsoo Kim   mm/slab: avoid re...
448
449
  
  	return num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  }
f28510d30   Christoph Lameter   slab: Only define...
451
  #if DEBUG
d40cee245   Harvey Harrison   mm: remove remain...
452
  #define slab_error(cachep, msg) __slab_error(__func__, cachep, msg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
454
455
  static void __slab_error(const char *function, struct kmem_cache *cachep,
  			char *msg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456
  {
1170532bb   Joe Perches   mm: convert print...
457
458
  	pr_err("slab error in %s(): cache `%s': %s
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
459
  	       function, cachep->name, msg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460
  	dump_stack();
373d4d099   Rusty Russell   taint: add explic...
461
  	add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
  }
f28510d30   Christoph Lameter   slab: Only define...
463
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464

3395ee058   Paul Menage   [PATCH] mm: add n...
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  /*
   * 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...
480
481
482
483
484
485
486
487
488
489
  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...
490
491
492
493
494
495
496
  #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...
497
  static DEFINE_PER_CPU(unsigned long, slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
498
499
500
  
  static void init_reap_node(int cpu)
  {
0edaf86cf   Andrew Morton   include/linux/nod...
501
502
  	per_cpu(slab_reap_node, cpu) = next_node_in(cpu_to_mem(cpu),
  						    node_online_map);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
503
504
505
506
  }
  
  static void next_reap_node(void)
  {
909ea9646   Christoph Lameter   core: Replace __g...
507
  	int node = __this_cpu_read(slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
508

0edaf86cf   Andrew Morton   include/linux/nod...
509
  	node = next_node_in(node, node_online_map);
909ea9646   Christoph Lameter   core: Replace __g...
510
  	__this_cpu_write(slab_reap_node, node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
511
512
513
514
515
516
  }
  
  #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
517
518
519
520
521
522
523
  /*
   * 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 __...
524
  static void start_cpu_timer(int cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
  {
1871e52c7   Tejun Heo   percpu: make perc...
526
  	struct delayed_work *reap_work = &per_cpu(slab_reap_work, cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527

eac0337af   Tejun Heo   slab, workqueue: ...
528
  	if (reap_work->work.func == NULL) {
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
529
  		init_reap_node(cpu);
203b42f73   Tejun Heo   workqueue: make d...
530
  		INIT_DEFERRABLE_WORK(reap_work, cache_reap);
2b2842146   Arjan van de Ven   [PATCH] user of t...
531
532
  		schedule_delayed_work_on(cpu, reap_work,
  					__round_jiffies_relative(HZ, cpu));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
  	}
  }
1fe00d50a   Joonsoo Kim   slab: factor out ...
535
  static void init_arraycache(struct array_cache *ac, int limit, int batch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
536
  {
d5cff6352   Catalin Marinas   kmemleak: Add the...
537
538
  	/*
  	 * The array_cache structures contain pointers to free object.
25985edce   Lucas De Marchi   Fix common misspe...
539
  	 * However, when such objects are allocated or transferred to another
d5cff6352   Catalin Marinas   kmemleak: Add the...
540
541
542
543
  	 * 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.
  	 */
1fe00d50a   Joonsoo Kim   slab: factor out ...
544
545
546
547
548
549
  	kmemleak_no_scan(ac);
  	if (ac) {
  		ac->avail = 0;
  		ac->limit = limit;
  		ac->batchcount = batch;
  		ac->touched = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
  	}
1fe00d50a   Joonsoo Kim   slab: factor out ...
551
552
553
554
555
  }
  
  static struct array_cache *alloc_arraycache(int node, int entries,
  					    int batchcount, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
556
  	size_t memsize = sizeof(void *) * entries + sizeof(struct array_cache);
1fe00d50a   Joonsoo Kim   slab: factor out ...
557
558
559
560
561
  	struct array_cache *ac = NULL;
  
  	ac = kmalloc_node(memsize, gfp, node);
  	init_arraycache(ac, entries, batchcount);
  	return ac;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
562
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
563
564
  static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep,
  					struct page *page, void *objp)
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
565
  {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
566
567
568
  	struct kmem_cache_node *n;
  	int page_node;
  	LIST_HEAD(list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
569

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

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
577
  	slabs_destroy(cachep, &list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
578
  }
3ded175a4   Christoph Lameter   [PATCH] slab: add...
579
580
581
582
583
584
585
586
587
588
  /*
   * 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...
589
  	int nr = min3(from->avail, max, to->limit - to->avail);
3ded175a4   Christoph Lameter   [PATCH] slab: add...
590
591
592
593
594
595
596
597
598
  
  	if (!nr)
  		return 0;
  
  	memcpy(to->entry + to->avail, from->entry + from->avail -nr,
  			sizeof(void *) *nr);
  
  	from->avail -= nr;
  	to->avail += nr;
3ded175a4   Christoph Lameter   [PATCH] slab: add...
599
600
  	return nr;
  }
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
601
602
603
  #ifndef CONFIG_NUMA
  
  #define drain_alien_cache(cachep, alien) do { } while (0)
ce8eb6c42   Christoph Lameter   slab: Rename list...
604
  #define reap_alien(cachep, n) do { } while (0)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
605

c8522a3a5   Joonsoo Kim   slab: introduce a...
606
607
  static inline struct alien_cache **alloc_alien_cache(int node,
  						int limit, gfp_t gfp)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
608
  {
8888177ea   Joonsoo Kim   mm/slab: remove B...
609
  	return NULL;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
610
  }
c8522a3a5   Joonsoo Kim   slab: introduce a...
611
  static inline void free_alien_cache(struct alien_cache **ac_ptr)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
612
613
614
615
616
617
618
619
620
621
622
623
624
  {
  }
  
  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...
625
  static inline void *____cache_alloc_node(struct kmem_cache *cachep,
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
626
627
628
629
  		 gfp_t flags, int nodeid)
  {
  	return NULL;
  }
4167e9b2c   David Rientjes   mm: remove GFP_TH...
630
631
  static inline gfp_t gfp_exact_node(gfp_t flags)
  {
444eb2a44   Mel Gorman   mm: thp: set THP ...
632
  	return flags & ~__GFP_NOFAIL;
4167e9b2c   David Rientjes   mm: remove GFP_TH...
633
  }
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
634
  #else	/* CONFIG_NUMA */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
635
  static void *____cache_alloc_node(struct kmem_cache *, gfp_t, int);
c61afb181   Paul Jackson   [PATCH] cpuset me...
636
  static void *alternate_node_alloc(struct kmem_cache *, gfp_t);
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
637

c8522a3a5   Joonsoo Kim   slab: introduce a...
638
639
640
  static struct alien_cache *__alloc_alien_cache(int node, int entries,
  						int batch, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
641
  	size_t memsize = sizeof(void *) * entries + sizeof(struct alien_cache);
c8522a3a5   Joonsoo Kim   slab: introduce a...
642
643
644
645
  	struct alien_cache *alc = NULL;
  
  	alc = kmalloc_node(memsize, gfp, node);
  	init_arraycache(&alc->ac, entries, batch);
49dfc304b   Joonsoo Kim   slab: use the loc...
646
  	spin_lock_init(&alc->lock);
c8522a3a5   Joonsoo Kim   slab: introduce a...
647
648
649
650
  	return alc;
  }
  
  static struct alien_cache **alloc_alien_cache(int node, int limit, gfp_t gfp)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
651
  {
c8522a3a5   Joonsoo Kim   slab: introduce a...
652
  	struct alien_cache **alc_ptr;
5e8047896   Joonsoo Kim   slab: change int ...
653
  	size_t memsize = sizeof(void *) * nr_node_ids;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
654
655
656
657
  	int i;
  
  	if (limit > 1)
  		limit = 12;
c8522a3a5   Joonsoo Kim   slab: introduce a...
658
659
660
661
662
663
664
665
666
667
668
669
670
  	alc_ptr = kzalloc_node(memsize, gfp, node);
  	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...
671
672
  		}
  	}
c8522a3a5   Joonsoo Kim   slab: introduce a...
673
  	return alc_ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
674
  }
c8522a3a5   Joonsoo Kim   slab: introduce a...
675
  static void free_alien_cache(struct alien_cache **alc_ptr)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
676
677
  {
  	int i;
c8522a3a5   Joonsoo Kim   slab: introduce a...
678
  	if (!alc_ptr)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
679
  		return;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
680
  	for_each_node(i)
c8522a3a5   Joonsoo Kim   slab: introduce a...
681
682
  	    kfree(alc_ptr[i]);
  	kfree(alc_ptr);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
683
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
684
  static void __drain_alien_cache(struct kmem_cache *cachep,
833b706cc   Joonsoo Kim   slab: destroy a s...
685
686
  				struct array_cache *ac, int node,
  				struct list_head *list)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
687
  {
18bf85411   Christoph Lameter   slab: use get_nod...
688
  	struct kmem_cache_node *n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
689
690
  
  	if (ac->avail) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
691
  		spin_lock(&n->list_lock);
e00946fe2   Christoph Lameter   [PATCH] slab: Byp...
692
693
694
695
696
  		/*
  		 * 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...
697
698
  		if (n->shared)
  			transfer_objects(n->shared, ac, ac->limit);
e00946fe2   Christoph Lameter   [PATCH] slab: Byp...
699

833b706cc   Joonsoo Kim   slab: destroy a s...
700
  		free_block(cachep, ac->entry, ac->avail, node, list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
701
  		ac->avail = 0;
ce8eb6c42   Christoph Lameter   slab: Rename list...
702
  		spin_unlock(&n->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
703
704
  	}
  }
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
705
706
707
  /*
   * Called from cache_reap() to regularly drain alien caches round robin.
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
708
  static void reap_alien(struct kmem_cache *cachep, struct kmem_cache_node *n)
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
709
  {
909ea9646   Christoph Lameter   core: Replace __g...
710
  	int node = __this_cpu_read(slab_reap_node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
711

ce8eb6c42   Christoph Lameter   slab: Rename list...
712
  	if (n->alien) {
c8522a3a5   Joonsoo Kim   slab: introduce a...
713
714
715
716
717
  		struct alien_cache *alc = n->alien[node];
  		struct array_cache *ac;
  
  		if (alc) {
  			ac = &alc->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
718
  			if (ac->avail && spin_trylock_irq(&alc->lock)) {
833b706cc   Joonsoo Kim   slab: destroy a s...
719
720
721
  				LIST_HEAD(list);
  
  				__drain_alien_cache(cachep, ac, node, &list);
49dfc304b   Joonsoo Kim   slab: use the loc...
722
  				spin_unlock_irq(&alc->lock);
833b706cc   Joonsoo Kim   slab: destroy a s...
723
  				slabs_destroy(cachep, &list);
c8522a3a5   Joonsoo Kim   slab: introduce a...
724
  			}
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
725
726
727
  		}
  	}
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
728
  static void drain_alien_cache(struct kmem_cache *cachep,
c8522a3a5   Joonsoo Kim   slab: introduce a...
729
  				struct alien_cache **alien)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
730
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
731
  	int i = 0;
c8522a3a5   Joonsoo Kim   slab: introduce a...
732
  	struct alien_cache *alc;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
733
734
735
736
  	struct array_cache *ac;
  	unsigned long flags;
  
  	for_each_online_node(i) {
c8522a3a5   Joonsoo Kim   slab: introduce a...
737
738
  		alc = alien[i];
  		if (alc) {
833b706cc   Joonsoo Kim   slab: destroy a s...
739
  			LIST_HEAD(list);
c8522a3a5   Joonsoo Kim   slab: introduce a...
740
  			ac = &alc->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
741
  			spin_lock_irqsave(&alc->lock, flags);
833b706cc   Joonsoo Kim   slab: destroy a s...
742
  			__drain_alien_cache(cachep, ac, i, &list);
49dfc304b   Joonsoo Kim   slab: use the loc...
743
  			spin_unlock_irqrestore(&alc->lock, flags);
833b706cc   Joonsoo Kim   slab: destroy a s...
744
  			slabs_destroy(cachep, &list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
745
746
747
  		}
  	}
  }
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
748

25c4f304b   Joonsoo Kim   mm/slab: factor o...
749
750
  static int __cache_free_alien(struct kmem_cache *cachep, void *objp,
  				int node, int page_node)
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
751
  {
ce8eb6c42   Christoph Lameter   slab: Rename list...
752
  	struct kmem_cache_node *n;
c8522a3a5   Joonsoo Kim   slab: introduce a...
753
754
  	struct alien_cache *alien = NULL;
  	struct array_cache *ac;
97654dfa2   Joonsoo Kim   slab: defer slab_...
755
  	LIST_HEAD(list);
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
756

18bf85411   Christoph Lameter   slab: use get_nod...
757
  	n = get_node(cachep, node);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
758
  	STATS_INC_NODEFREES(cachep);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
759
760
  	if (n->alien && n->alien[page_node]) {
  		alien = n->alien[page_node];
c8522a3a5   Joonsoo Kim   slab: introduce a...
761
  		ac = &alien->ac;
49dfc304b   Joonsoo Kim   slab: use the loc...
762
  		spin_lock(&alien->lock);
c8522a3a5   Joonsoo Kim   slab: introduce a...
763
  		if (unlikely(ac->avail == ac->limit)) {
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
764
  			STATS_INC_ACOVERFLOW(cachep);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
765
  			__drain_alien_cache(cachep, ac, page_node, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
766
  		}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
767
  		ac->entry[ac->avail++] = objp;
49dfc304b   Joonsoo Kim   slab: use the loc...
768
  		spin_unlock(&alien->lock);
833b706cc   Joonsoo Kim   slab: destroy a s...
769
  		slabs_destroy(cachep, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
770
  	} else {
25c4f304b   Joonsoo Kim   mm/slab: factor o...
771
  		n = get_node(cachep, page_node);
18bf85411   Christoph Lameter   slab: use get_nod...
772
  		spin_lock(&n->list_lock);
25c4f304b   Joonsoo Kim   mm/slab: factor o...
773
  		free_block(cachep, &objp, 1, page_node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
774
  		spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
775
  		slabs_destroy(cachep, &list);
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
776
777
778
  	}
  	return 1;
  }
25c4f304b   Joonsoo Kim   mm/slab: factor o...
779
780
781
782
783
784
785
786
787
788
789
790
791
792
  
  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...
793
794
  
  /*
444eb2a44   Mel Gorman   mm: thp: set THP ...
795
796
   * Construct gfp mask to allocate from a specific node but do not reclaim or
   * warn about failures.
4167e9b2c   David Rientjes   mm: remove GFP_TH...
797
798
799
   */
  static inline gfp_t gfp_exact_node(gfp_t flags)
  {
444eb2a44   Mel Gorman   mm: thp: set THP ...
800
  	return (flags | __GFP_THISNODE | __GFP_NOWARN) & ~(__GFP_RECLAIM|__GFP_NOFAIL);
4167e9b2c   David Rientjes   mm: remove GFP_TH...
801
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
802
  #endif
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
  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 ...
842
  #if (defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG)) || defined(CONFIG_SMP)
8f9f8d9e8   David Rientjes   slab: add memory ...
843
  /*
6a67368c3   Christoph Lameter   slab: Rename node...
844
   * Allocates and initializes node for a node on each slab cache, used for
ce8eb6c42   Christoph Lameter   slab: Rename list...
845
   * either memory or cpu hotplug.  If memory is being hot-added, the kmem_cache_node
8f9f8d9e8   David Rientjes   slab: add memory ...
846
   * will be allocated off-node since memory is not yet online for the new node.
6a67368c3   Christoph Lameter   slab: Rename node...
847
   * When hotplugging memory or a cpu, existing node are not replaced if
8f9f8d9e8   David Rientjes   slab: add memory ...
848
849
   * already in use.
   *
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
850
   * Must hold slab_mutex.
8f9f8d9e8   David Rientjes   slab: add memory ...
851
   */
6a67368c3   Christoph Lameter   slab: Rename node...
852
  static int init_cache_node_node(int node)
8f9f8d9e8   David Rientjes   slab: add memory ...
853
  {
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
854
  	int ret;
8f9f8d9e8   David Rientjes   slab: add memory ...
855
  	struct kmem_cache *cachep;
8f9f8d9e8   David Rientjes   slab: add memory ...
856

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
857
  	list_for_each_entry(cachep, &slab_caches, list) {
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
858
859
860
  		ret = init_cache_node(cachep, node, GFP_KERNEL);
  		if (ret)
  			return ret;
8f9f8d9e8   David Rientjes   slab: add memory ...
861
  	}
ded0ecf61   Joonsoo Kim   mm/slab: factor o...
862

8f9f8d9e8   David Rientjes   slab: add memory ...
863
864
  	return 0;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
865
  #endif
8f9f8d9e8   David Rientjes   slab: add memory ...
866

c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
  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...
915
916
917
918
919
920
  	/*
  	 * 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
  	 * freed after synchronize_sched().
  	 */
86d9f4853   Joonsoo Kim   mm/slab: fix kmem...
921
  	if (old_shared && force_change)
801faf0db   Joonsoo Kim   mm/slab: lockless...
922
  		synchronize_sched();
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
923
924
925
926
927
928
929
  fail:
  	kfree(old_shared);
  	kfree(new_shared);
  	free_alien_cache(new_alien);
  
  	return ret;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
930
  #ifdef CONFIG_SMP
0db0628d9   Paul Gortmaker   kernel: delete __...
931
  static void cpuup_canceled(long cpu)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
932
933
  {
  	struct kmem_cache *cachep;
ce8eb6c42   Christoph Lameter   slab: Rename list...
934
  	struct kmem_cache_node *n = NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
935
  	int node = cpu_to_mem(cpu);
a70f73028   Rusty Russell   cpumask: replace ...
936
  	const struct cpumask *mask = cpumask_of_node(node);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
937

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
938
  	list_for_each_entry(cachep, &slab_caches, list) {
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
939
940
  		struct array_cache *nc;
  		struct array_cache *shared;
c8522a3a5   Joonsoo Kim   slab: introduce a...
941
  		struct alien_cache **alien;
97654dfa2   Joonsoo Kim   slab: defer slab_...
942
  		LIST_HEAD(list);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
943

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
950
951
  		/* Free limit for this kmem_cache_node */
  		n->free_limit -= cachep->batchcount;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
952
953
954
955
  
  		/* cpu is dead; no one can alloc from it. */
  		nc = per_cpu_ptr(cachep->cpu_cache, cpu);
  		if (nc) {
97654dfa2   Joonsoo Kim   slab: defer slab_...
956
  			free_block(cachep, nc->entry, nc->avail, node, &list);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
957
958
  			nc->avail = 0;
  		}
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
959

58463c1fe   Rusty Russell   cpumask: avoid de...
960
  		if (!cpumask_empty(mask)) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
961
  			spin_unlock_irq(&n->list_lock);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
962
  			goto free_slab;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
963
  		}
ce8eb6c42   Christoph Lameter   slab: Rename list...
964
  		shared = n->shared;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
965
966
  		if (shared) {
  			free_block(cachep, shared->entry,
97654dfa2   Joonsoo Kim   slab: defer slab_...
967
  				   shared->avail, node, &list);
ce8eb6c42   Christoph Lameter   slab: Rename list...
968
  			n->shared = NULL;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
969
  		}
ce8eb6c42   Christoph Lameter   slab: Rename list...
970
971
  		alien = n->alien;
  		n->alien = NULL;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
972

ce8eb6c42   Christoph Lameter   slab: Rename list...
973
  		spin_unlock_irq(&n->list_lock);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
974
975
976
977
978
979
  
  		kfree(shared);
  		if (alien) {
  			drain_alien_cache(cachep, alien);
  			free_alien_cache(alien);
  		}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
980
981
  
  free_slab:
97654dfa2   Joonsoo Kim   slab: defer slab_...
982
  		slabs_destroy(cachep, &list);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
983
984
985
986
987
988
  	}
  	/*
  	 * 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...
989
  	list_for_each_entry(cachep, &slab_caches, list) {
18bf85411   Christoph Lameter   slab: use get_nod...
990
  		n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
991
  		if (!n)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
992
  			continue;
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
993
  		drain_freelist(cachep, n, INT_MAX);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
994
995
  	}
  }
0db0628d9   Paul Gortmaker   kernel: delete __...
996
  static int cpuup_prepare(long cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
998
  	struct kmem_cache *cachep;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
999
  	int node = cpu_to_mem(cpu);
8f9f8d9e8   David Rientjes   slab: add memory ...
1000
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001

fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1002
1003
1004
1005
  	/*
  	 * 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...
1006
  	 * kmem_cache_node and not this cpu's kmem_cache_node
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1007
  	 */
6a67368c3   Christoph Lameter   slab: Rename node...
1008
  	err = init_cache_node_node(node);
8f9f8d9e8   David Rientjes   slab: add memory ...
1009
1010
  	if (err < 0)
  		goto bad;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1011
1012
1013
1014
1015
  
  	/*
  	 * Now we can go ahead with allocating the shared arrays and
  	 * array caches
  	 */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1016
  	list_for_each_entry(cachep, &slab_caches, list) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
1017
1018
1019
  		err = setup_kmem_cache_node(cachep, node, GFP_KERNEL, false);
  		if (err)
  			goto bad;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1020
  	}
ce79ddc8e   Pekka Enberg   SLAB: Fix lockdep...
1021

fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1022
1023
  	return 0;
  bad:
12d00f6a1   Akinobu Mita   cpu hotplug: slab...
1024
  	cpuup_canceled(cpu);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1025
1026
  	return -ENOMEM;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1027
  int slab_prepare_cpu(unsigned int cpu)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1028
  {
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1029
  	int err;
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
1030

6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
  	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
   * kmem_list3 of any cache. This to avoid a race between cpu_down, and
   * a kmalloc allocation from another cpu for memory from the node of
   * the cpu going down.  The list3 structure is usually allocated from
   * 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:...
1054
  #endif
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1055
1056
1057
1058
1059
  
  static int slab_online_cpu(unsigned int cpu)
  {
  	start_cpu_timer(cpu);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
  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
1074

8f9f8d9e8   David Rientjes   slab: add memory ...
1075
1076
1077
1078
1079
1080
  #if defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG)
  /*
   * Drains freelist for a node on each slab cache, used for memory hot-remove.
   * Returns -EBUSY if all objects cannot be drained so that the node is not
   * removed.
   *
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1081
   * Must hold slab_mutex.
8f9f8d9e8   David Rientjes   slab: add memory ...
1082
   */
6a67368c3   Christoph Lameter   slab: Rename node...
1083
  static int __meminit drain_cache_node_node(int node)
8f9f8d9e8   David Rientjes   slab: add memory ...
1084
1085
1086
  {
  	struct kmem_cache *cachep;
  	int ret = 0;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1087
  	list_for_each_entry(cachep, &slab_caches, list) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1088
  		struct kmem_cache_node *n;
8f9f8d9e8   David Rientjes   slab: add memory ...
1089

18bf85411   Christoph Lameter   slab: use get_nod...
1090
  		n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
1091
  		if (!n)
8f9f8d9e8   David Rientjes   slab: add memory ...
1092
  			continue;
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
1093
  		drain_freelist(cachep, n, INT_MAX);
8f9f8d9e8   David Rientjes   slab: add memory ...
1094

ce8eb6c42   Christoph Lameter   slab: Rename list...
1095
1096
  		if (!list_empty(&n->slabs_full) ||
  		    !list_empty(&n->slabs_partial)) {
8f9f8d9e8   David Rientjes   slab: add memory ...
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  			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...
1117
  		mutex_lock(&slab_mutex);
6a67368c3   Christoph Lameter   slab: Rename node...
1118
  		ret = init_cache_node_node(nid);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1119
  		mutex_unlock(&slab_mutex);
8f9f8d9e8   David Rientjes   slab: add memory ...
1120
1121
  		break;
  	case MEM_GOING_OFFLINE:
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1122
  		mutex_lock(&slab_mutex);
6a67368c3   Christoph Lameter   slab: Rename node...
1123
  		ret = drain_cache_node_node(nid);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1124
  		mutex_unlock(&slab_mutex);
8f9f8d9e8   David Rientjes   slab: add memory ...
1125
1126
1127
1128
1129
1130
1131
1132
  		break;
  	case MEM_ONLINE:
  	case MEM_OFFLINE:
  	case MEM_CANCEL_ONLINE:
  	case MEM_CANCEL_OFFLINE:
  		break;
  	}
  out:
5fda1bd5b   Prarit Bhargava   mm: notifier_from...
1133
  	return notifier_from_errno(ret);
8f9f8d9e8   David Rientjes   slab: add memory ...
1134
1135
  }
  #endif /* CONFIG_NUMA && CONFIG_MEMORY_HOTPLUG */
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1136
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
1137
   * swap the static kmem_cache_node with kmalloced memory
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1138
   */
6744f087b   Christoph Lameter   slab: Common name...
1139
  static void __init init_list(struct kmem_cache *cachep, struct kmem_cache_node *list,
8f9f8d9e8   David Rientjes   slab: add memory ...
1140
  				int nodeid)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1141
  {
6744f087b   Christoph Lameter   slab: Common name...
1142
  	struct kmem_cache_node *ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1143

6744f087b   Christoph Lameter   slab: Common name...
1144
  	ptr = kmalloc_node(sizeof(struct kmem_cache_node), GFP_NOWAIT, nodeid);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1145
  	BUG_ON(!ptr);
6744f087b   Christoph Lameter   slab: Common name...
1146
  	memcpy(ptr, list, sizeof(struct kmem_cache_node));
2b2d5493e   Ingo Molnar   [PATCH] lockdep: ...
1147
1148
1149
1150
  	/*
  	 * Do not assume that spinlocks can be initialized via memcpy:
  	 */
  	spin_lock_init(&ptr->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1151
  	MAKE_ALL_LISTS(cachep, ptr, nodeid);
6a67368c3   Christoph Lameter   slab: Rename node...
1152
  	cachep->node[nodeid] = ptr;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1153
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1154
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
1155
1156
   * 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...
1157
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
1158
  static void __init set_up_node(struct kmem_cache *cachep, int index)
556a169da   Pekka Enberg   slab: fix bootstr...
1159
1160
1161
1162
  {
  	int node;
  
  	for_each_online_node(node) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1163
  		cachep->node[node] = &init_kmem_cache_node[index + node];
6a67368c3   Christoph Lameter   slab: Rename node...
1164
  		cachep->node[node]->next_reap = jiffies +
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
1165
1166
  		    REAPTIMEOUT_NODE +
  		    ((unsigned long)cachep) % REAPTIMEOUT_NODE;
556a169da   Pekka Enberg   slab: fix bootstr...
1167
1168
1169
1170
  	}
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1171
1172
   * Initialisation.  Called after the page allocator have been initialised and
   * before smp_init().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
1174
1175
   */
  void __init kmem_cache_init(void)
  {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1176
  	int i;
68126702b   Joonsoo Kim   slab: overloading...
1177
1178
  	BUILD_BUG_ON(sizeof(((struct page *)NULL)->lru) <
  					sizeof(struct rcu_head));
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1179
  	kmem_cache = &kmem_cache_boot;
8888177ea   Joonsoo Kim   mm/slab: remove B...
1180
  	if (!IS_ENABLED(CONFIG_NUMA) || num_possible_nodes() == 1)
62918a036   Siddha, Suresh B   [PATCH] x86-64: s...
1181
  		use_alien_caches = 0;
3c5834652   Christoph Lameter   slab: Simplify bo...
1182
  	for (i = 0; i < NUM_INIT_LISTS; i++)
ce8eb6c42   Christoph Lameter   slab: Rename list...
1183
  		kmem_cache_node_init(&init_kmem_cache_node[i]);
3c5834652   Christoph Lameter   slab: Simplify bo...
1184

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1185
1186
  	/*
  	 * Fragmentation resistance on low memory - only use bigger
3df1cccdf   David Rientjes   slab: introduce s...
1187
1188
  	 * 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
1189
  	 */
3df1cccdf   David Rientjes   slab: introduce s...
1190
  	if (!slab_max_order_set && totalram_pages > (32 << 20) >> PAGE_SHIFT)
543585cc5   David Rientjes   slab: rename slab...
1191
  		slab_max_order = SLAB_MAX_ORDER_HI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193
1194
  	/* Bootstrap is tricky, because several objects are allocated
  	 * from caches that do not exist yet:
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1195
1196
1197
  	 * 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...
1198
  	 *    Initially an __init data area is used for the head array and the
ce8eb6c42   Christoph Lameter   slab: Rename list...
1199
  	 *    kmem_cache_node structures, it's replaced with a kmalloc allocated
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1200
  	 *    array at the end of the bootstrap.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1201
  	 * 2) Create the first kmalloc cache.
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1202
  	 *    The struct kmem_cache for the new cache is allocated normally.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1203
1204
1205
  	 *    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 ...
1206
  	 * 4) Replace the __init data head arrays for kmem_cache and the first
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207
  	 *    kmalloc cache with kmalloc allocated arrays.
ce8eb6c42   Christoph Lameter   slab: Rename list...
1208
  	 * 5) Replace the __init data for kmem_cache_node for kmem_cache and
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1209
1210
  	 *    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
1211
  	 */
9b030cb86   Christoph Lameter   mm/sl[aou]b: Use ...
1212
  	/* 1) create the kmem_cache */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1213

8da3430d8   Eric Dumazet   slab: NUMA kmem_c...
1214
  	/*
b56efcf0a   Eric Dumazet   slab: shrink size...
1215
  	 * struct kmem_cache size depends on nr_node_ids & nr_cpu_ids
8da3430d8   Eric Dumazet   slab: NUMA kmem_c...
1216
  	 */
2f9baa9fc   Christoph Lameter   slab: Use the new...
1217
  	create_boot_cache(kmem_cache, "kmem_cache",
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1218
  		offsetof(struct kmem_cache, node) +
6744f087b   Christoph Lameter   slab: Common name...
1219
  				  nr_node_ids * sizeof(struct kmem_cache_node *),
2f9baa9fc   Christoph Lameter   slab: Use the new...
1220
1221
  				  SLAB_HWCACHE_ALIGN);
  	list_add(&kmem_cache->list, &slab_caches);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1222
  	slab_state = PARTIAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1223

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1224
  	/*
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1225
1226
  	 * 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...
1227
  	 */
af3b5f876   Vlastimil Babka   mm, slab: rename ...
1228
1229
  	kmalloc_caches[INDEX_NODE] = create_kmalloc_cache(
  				kmalloc_info[INDEX_NODE].name,
ce8eb6c42   Christoph Lameter   slab: Rename list...
1230
  				kmalloc_size(INDEX_NODE), ARCH_KMALLOC_FLAGS);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1231
  	slab_state = PARTIAL_NODE;
34cc6990d   Daniel Sanders   slab: correct siz...
1232
  	setup_kmalloc_cache_index_table();
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1233

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

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1241
  			init_list(kmalloc_caches[INDEX_NODE],
ce8eb6c42   Christoph Lameter   slab: Rename list...
1242
  					  &init_kmem_cache_node[SIZE_NODE + nid], nid);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
1243
1244
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245

f97d5f634   Christoph Lameter   slab: Common func...
1246
  	create_kmalloc_caches(ARCH_KMALLOC_FLAGS);
8429db5c6   Pekka Enberg   slab: setup cpu c...
1247
1248
1249
1250
1251
  }
  
  void __init kmem_cache_init_late(void)
  {
  	struct kmem_cache *cachep;
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1252
  	slab_state = UP;
52cef1891   Peter Zijlstra   slab, lockdep: Fi...
1253

8429db5c6   Pekka Enberg   slab: setup cpu c...
1254
  	/* 6) resize the head arrays to their final sizes */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1255
1256
  	mutex_lock(&slab_mutex);
  	list_for_each_entry(cachep, &slab_caches, list)
8429db5c6   Pekka Enberg   slab: setup cpu c...
1257
1258
  		if (enable_cpucache(cachep, GFP_NOWAIT))
  			BUG();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1259
  	mutex_unlock(&slab_mutex);
056c62418   Ravikiran G Thirumalai   [PATCH] slab: fix...
1260

97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1261
1262
  	/* Done! */
  	slab_state = FULL;
8f9f8d9e8   David Rientjes   slab: add memory ...
1263
1264
1265
  #ifdef CONFIG_NUMA
  	/*
  	 * Register a memory hotplug callback that initializes and frees
6a67368c3   Christoph Lameter   slab: Rename node...
1266
  	 * node.
8f9f8d9e8   David Rientjes   slab: add memory ...
1267
1268
1269
  	 */
  	hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI);
  #endif
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1270
1271
1272
  	/*
  	 * 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
1273
1274
1275
1276
1277
  	 */
  }
  
  static int __init cpucache_init(void)
  {
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1278
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1279

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1280
1281
  	/*
  	 * Register the timers that return unneeded pages to the page allocator
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1282
  	 */
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1283
1284
1285
  	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...
1286
1287
  
  	/* Done! */
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1288
  	slab_state = FULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1289
1290
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1291
  __initcall(cpucache_init);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1292
1293
1294
  static noinline void
  slab_out_of_memory(struct kmem_cache *cachep, gfp_t gfpflags, int nodeid)
  {
9a02d6999   David Rientjes   mm, slab: suppres...
1295
  #if DEBUG
ce8eb6c42   Christoph Lameter   slab: Rename list...
1296
  	struct kmem_cache_node *n;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1297
1298
  	unsigned long flags;
  	int node;
9a02d6999   David Rientjes   mm, slab: suppres...
1299
1300
1301
1302
1303
  	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...
1304

5b3810e5c   Vlastimil Babka   mm, sl[au]b: prin...
1305
1306
1307
1308
1309
  	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...
1310
  		cachep->name, cachep->size, cachep->gfporder);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1311

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
1315
  		spin_lock_irqsave(&n->list_lock, flags);
bf00bd345   David Rientjes   mm, slab: maintai...
1316
1317
1318
  		total_slabs = n->total_slabs;
  		free_slabs = n->free_slabs;
  		free_objs = n->free_objects;
ce8eb6c42   Christoph Lameter   slab: Rename list...
1319
  		spin_unlock_irqrestore(&n->list_lock, flags);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1320

bf00bd345   David Rientjes   mm, slab: maintai...
1321
1322
1323
1324
1325
  		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...
1326
  	}
9a02d6999   David Rientjes   mm, slab: suppres...
1327
  #endif
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1328
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1329
  /*
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1330
1331
   * Interface to system's page allocator. No need to hold the
   * kmem_cache_node ->list_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
1333
1334
1335
1336
   *
   * 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...
1337
1338
  static struct page *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
  								int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1339
1340
  {
  	struct page *page;
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1341
  	int nr_pages;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
1342

a618e89f1   Glauber Costa   slab: rename gfpf...
1343
  	flags |= cachep->allocflags;
e12ba74d8   Mel Gorman   Group short-lived...
1344
1345
  	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
  		flags |= __GFP_RECLAIMABLE;
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1346

96db800f5   Vlastimil Babka   mm: rename alloc_...
1347
  	page = __alloc_pages_node(nodeid, flags | __GFP_NOTRACK, cachep->gfporder);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1348
  	if (!page) {
9a02d6999   David Rientjes   mm, slab: suppres...
1349
  		slab_out_of_memory(cachep, flags, nodeid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350
  		return NULL;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1351
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1352

f3ccb2c42   Vladimir Davydov   memcg: unify slab...
1353
1354
1355
1356
  	if (memcg_charge_slab(page, flags, cachep->gfporder, cachep)) {
  		__free_pages(page, cachep->gfporder);
  		return NULL;
  	}
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1357
  	nr_pages = (1 << cachep->gfporder);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1358
  	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
7779f2123   Johannes Weiner   mm: memcontrol: a...
1359
  		mod_lruvec_page_state(page, NR_SLAB_RECLAIMABLE, nr_pages);
972d1a7b1   Christoph Lameter   [PATCH] ZVC: Supp...
1360
  	else
7779f2123   Johannes Weiner   mm: memcontrol: a...
1361
  		mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE, nr_pages);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1362

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1363
  	__SetPageSlab(page);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1364
1365
  	/* 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...
1366
  		SetPageSlabPfmemalloc(page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
1367

b1eeab676   Vegard Nossum   kmemcheck: add ho...
1368
1369
1370
1371
1372
1373
1374
1375
  	if (kmemcheck_enabled && !(cachep->flags & SLAB_NOTRACK)) {
  		kmemcheck_alloc_shadow(page, cachep->gfporder, flags, nodeid);
  
  		if (cachep->ctor)
  			kmemcheck_mark_uninitialized_pages(page, nr_pages);
  		else
  			kmemcheck_mark_unallocated_pages(page, nr_pages);
  	}
c175eea46   Pekka Enberg   slab: add hooks f...
1376

0c3aa83e0   Joonsoo Kim   slab: change retu...
1377
  	return page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1378
1379
1380
1381
1382
  }
  
  /*
   * Interface to system's page release.
   */
0c3aa83e0   Joonsoo Kim   slab: change retu...
1383
  static void kmem_freepages(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
  {
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1385
1386
  	int order = cachep->gfporder;
  	unsigned long nr_freed = (1 << order);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1387

27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1388
  	kmemcheck_free_shadow(page, order);
c175eea46   Pekka Enberg   slab: add hooks f...
1389

972d1a7b1   Christoph Lameter   [PATCH] ZVC: Supp...
1390
  	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
7779f2123   Johannes Weiner   mm: memcontrol: a...
1391
  		mod_lruvec_page_state(page, NR_SLAB_RECLAIMABLE, -nr_freed);
972d1a7b1   Christoph Lameter   [PATCH] ZVC: Supp...
1392
  	else
7779f2123   Johannes Weiner   mm: memcontrol: a...
1393
  		mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE, -nr_freed);
73293c2f9   Joonsoo Kim   slab: correct pfm...
1394

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1395
  	BUG_ON(!PageSlab(page));
73293c2f9   Joonsoo Kim   slab: correct pfm...
1396
  	__ClearPageSlabPfmemalloc(page);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1397
  	__ClearPageSlab(page);
8456a648c   Joonsoo Kim   slab: use struct ...
1398
1399
  	page_mapcount_reset(page);
  	page->mapping = NULL;
1f458cbf1   Glauber Costa   memcg: destroy me...
1400

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1401
1402
  	if (current->reclaim_state)
  		current->reclaim_state->reclaimed_slab += nr_freed;
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1403
1404
  	memcg_uncharge_slab(page, order, cachep);
  	__free_pages(page, order);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1405
1406
1407
1408
  }
  
  static void kmem_rcu_free(struct rcu_head *head)
  {
68126702b   Joonsoo Kim   slab: overloading...
1409
1410
  	struct kmem_cache *cachep;
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1411

68126702b   Joonsoo Kim   slab: overloading...
1412
1413
1414
1415
  	page = container_of(head, struct page, rcu_head);
  	cachep = page->slab_cache;
  
  	kmem_freepages(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1416
1417
1418
  }
  
  #if DEBUG
40b441379   Joonsoo Kim   mm/slab: clean up...
1419
1420
1421
1422
1423
1424
1425
1426
  static bool is_debug_pagealloc_cache(struct kmem_cache *cachep)
  {
  	if (debug_pagealloc_enabled() && OFF_SLAB(cachep) &&
  		(cachep->size % PAGE_SIZE) == 0)
  		return true;
  
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1427
1428
  
  #ifdef CONFIG_DEBUG_PAGEALLOC
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1429
  static void store_stackinfo(struct kmem_cache *cachep, unsigned long *addr,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1430
  			    unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1431
  {
8c138bc00   Christoph Lameter   slab: Get rid of ...
1432
  	int size = cachep->object_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1433

3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1434
  	addr = (unsigned long *)&((char *)addr)[obj_offset(cachep)];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1436
  	if (size < 5 * sizeof(unsigned long))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1437
  		return;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1438
1439
1440
1441
  	*addr++ = 0x12345678;
  	*addr++ = caller;
  	*addr++ = smp_processor_id();
  	size -= 3 * sizeof(unsigned long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1442
1443
1444
1445
1446
1447
1448
  	{
  		unsigned long *sptr = &caller;
  		unsigned long svalue;
  
  		while (!kstack_end(sptr)) {
  			svalue = *sptr++;
  			if (kernel_text_address(svalue)) {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1449
  				*addr++ = svalue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
1451
1452
1453
1454
1455
1456
  				size -= sizeof(unsigned long);
  				if (size <= sizeof(unsigned long))
  					break;
  			}
  		}
  
  	}
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1457
  	*addr++ = 0x87654321;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1458
  }
40b441379   Joonsoo Kim   mm/slab: clean up...
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
  
  static void slab_kernel_map(struct kmem_cache *cachep, void *objp,
  				int map, unsigned long caller)
  {
  	if (!is_debug_pagealloc_cache(cachep))
  		return;
  
  	if (caller)
  		store_stackinfo(cachep, objp, caller);
  
  	kernel_map_pages(virt_to_page(objp), cachep->size / PAGE_SIZE, map);
  }
  
  #else
  static inline void slab_kernel_map(struct kmem_cache *cachep, void *objp,
  				int map, unsigned long caller) {}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475
  #endif
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1476
  static void poison_obj(struct kmem_cache *cachep, void *addr, unsigned char val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1477
  {
8c138bc00   Christoph Lameter   slab: Get rid of ...
1478
  	int size = cachep->object_size;
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1479
  	addr = &((char *)addr)[obj_offset(cachep)];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1480
1481
  
  	memset(addr, val, size);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1482
  	*(unsigned char *)(addr + size - 1) = POISON_END;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1483
1484
1485
1486
1487
  }
  
  static void dump_line(char *data, int offset, int limit)
  {
  	int i;
aa83aa40e   Dave Jones   [PATCH] single bi...
1488
1489
  	unsigned char error = 0;
  	int bad_count = 0;
1170532bb   Joe Perches   mm: convert print...
1490
  	pr_err("%03x: ", offset);
aa83aa40e   Dave Jones   [PATCH] single bi...
1491
1492
1493
1494
1495
  	for (i = 0; i < limit; i++) {
  		if (data[offset + i] != POISON_FREE) {
  			error = data[offset + i];
  			bad_count++;
  		}
aa83aa40e   Dave Jones   [PATCH] single bi...
1496
  	}
fdde6abb3   Sebastian Andrzej Siewior   slab: use print_h...
1497
1498
  	print_hex_dump(KERN_CONT, "", 0, 16, 1,
  			&data[offset], limit, 1);
aa83aa40e   Dave Jones   [PATCH] single bi...
1499
1500
1501
1502
  
  	if (bad_count == 1) {
  		error ^= POISON_FREE;
  		if (!(error & (error - 1))) {
1170532bb   Joe Perches   mm: convert print...
1503
1504
  			pr_err("Single bit error detected. Probably bad RAM.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1505
  #ifdef CONFIG_X86
1170532bb   Joe Perches   mm: convert print...
1506
1507
  			pr_err("Run memtest86+ or a similar memory test tool.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1508
  #else
1170532bb   Joe Perches   mm: convert print...
1509
1510
  			pr_err("Run a memory test tool.
  ");
aa83aa40e   Dave Jones   [PATCH] single bi...
1511
1512
1513
  #endif
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1514
1515
1516
1517
  }
  #endif
  
  #if DEBUG
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1518
  static void print_objinfo(struct kmem_cache *cachep, void *objp, int lines)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1519
1520
1521
1522
1523
  {
  	int i, size;
  	char *realobj;
  
  	if (cachep->flags & SLAB_RED_ZONE) {
1170532bb   Joe Perches   mm: convert print...
1524
1525
1526
1527
  		pr_err("Redzone: 0x%llx/0x%llx
  ",
  		       *dbg_redzone1(cachep, objp),
  		       *dbg_redzone2(cachep, objp));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1528
1529
1530
  	}
  
  	if (cachep->flags & SLAB_STORE_USER) {
1170532bb   Joe Perches   mm: convert print...
1531
1532
  		pr_err("Last user: [<%p>](%pSR)
  ",
071361d34   Joe Perches   mm: Convert print...
1533
1534
  		       *dbg_userword(cachep, objp),
  		       *dbg_userword(cachep, objp));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1535
  	}
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1536
  	realobj = (char *)objp + obj_offset(cachep);
8c138bc00   Christoph Lameter   slab: Get rid of ...
1537
  	size = cachep->object_size;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1538
  	for (i = 0; i < size && lines; i += 16, lines--) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1539
1540
  		int limit;
  		limit = 16;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1541
1542
  		if (i + limit > size)
  			limit = size - i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1543
1544
1545
  		dump_line(realobj, i, limit);
  	}
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1546
  static void check_poison_obj(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1547
1548
1549
1550
  {
  	char *realobj;
  	int size, i;
  	int lines = 0;
40b441379   Joonsoo Kim   mm/slab: clean up...
1551
1552
  	if (is_debug_pagealloc_cache(cachep))
  		return;
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1553
  	realobj = (char *)objp + obj_offset(cachep);
8c138bc00   Christoph Lameter   slab: Get rid of ...
1554
  	size = cachep->object_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1555

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1556
  	for (i = 0; i < size; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1557
  		char exp = POISON_FREE;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1558
  		if (i == size - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559
1560
1561
1562
1563
1564
  			exp = POISON_END;
  		if (realobj[i] != exp) {
  			int limit;
  			/* Mismatch ! */
  			/* Print header */
  			if (lines == 0) {
1170532bb   Joe Perches   mm: convert print...
1565
1566
1567
1568
  				pr_err("Slab corruption (%s): %s start=%p, len=%d
  ",
  				       print_tainted(), cachep->name,
  				       realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1569
1570
1571
  				print_objinfo(cachep, objp, 0);
  			}
  			/* Hexdump the affected line */
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1572
  			i = (i / 16) * 16;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1573
  			limit = 16;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1574
1575
  			if (i + limit > size)
  				limit = size - i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
  			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 ...
1588
  		struct page *page = virt_to_head_page(objp);
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
1589
  		unsigned int objnr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1590

8456a648c   Joonsoo Kim   slab: use struct ...
1591
  		objnr = obj_to_index(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592
  		if (objnr) {
8456a648c   Joonsoo Kim   slab: use struct ...
1593
  			objp = index_to_obj(cachep, page, objnr - 1);
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1594
  			realobj = (char *)objp + obj_offset(cachep);
1170532bb   Joe Perches   mm: convert print...
1595
1596
  			pr_err("Prev obj: start=%p, len=%d
  ", realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597
1598
  			print_objinfo(cachep, objp, 2);
  		}
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1599
  		if (objnr + 1 < cachep->num) {
8456a648c   Joonsoo Kim   slab: use struct ...
1600
  			objp = index_to_obj(cachep, page, objnr + 1);
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
1601
  			realobj = (char *)objp + obj_offset(cachep);
1170532bb   Joe Perches   mm: convert print...
1602
1603
  			pr_err("Next obj: start=%p, len=%d
  ", realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1604
1605
1606
1607
1608
  			print_objinfo(cachep, objp, 2);
  		}
  	}
  }
  #endif
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1609
  #if DEBUG
8456a648c   Joonsoo Kim   slab: use struct ...
1610
1611
  static void slab_destroy_debugcheck(struct kmem_cache *cachep,
  						struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1612
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1613
  	int i;
b03a017be   Joonsoo Kim   mm/slab: introduc...
1614
1615
1616
1617
1618
  
  	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
1619
  	for (i = 0; i < cachep->num; i++) {
8456a648c   Joonsoo Kim   slab: use struct ...
1620
  		void *objp = index_to_obj(cachep, page, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1621
1622
  
  		if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1623
  			check_poison_obj(cachep, objp);
40b441379   Joonsoo Kim   mm/slab: clean up...
1624
  			slab_kernel_map(cachep, objp, 1, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1625
1626
1627
  		}
  		if (cachep->flags & SLAB_RED_ZONE) {
  			if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
1628
  				slab_error(cachep, "start of a freed object was overwritten");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1629
  			if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
1630
  				slab_error(cachep, "end of a freed object was overwritten");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1631
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632
  	}
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1633
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1634
  #else
8456a648c   Joonsoo Kim   slab: use struct ...
1635
1636
  static void slab_destroy_debugcheck(struct kmem_cache *cachep,
  						struct page *page)
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1637
  {
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1638
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639
  #endif
911851e6e   Randy Dunlap   [PATCH] slab: fix...
1640
1641
1642
  /**
   * slab_destroy - destroy and release all objects in a slab
   * @cachep: cache pointer being destroyed
cb8ee1a3d   Masanari Iida   mm: Fix warning o...
1643
   * @page: page pointer being destroyed
911851e6e   Randy Dunlap   [PATCH] slab: fix...
1644
   *
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1645
1646
1647
   * 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...
1648
   */
8456a648c   Joonsoo Kim   slab: use struct ...
1649
  static void slab_destroy(struct kmem_cache *cachep, struct page *page)
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1650
  {
7e0073552   Joonsoo Kim   slab: replace non...
1651
  	void *freelist;
12dd36fae   Matthew Dobson   [PATCH] slab: ext...
1652

8456a648c   Joonsoo Kim   slab: use struct ...
1653
1654
  	freelist = page->freelist;
  	slab_destroy_debugcheck(cachep, page);
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1655
  	if (unlikely(cachep->flags & SLAB_TYPESAFE_BY_RCU))
bc4f610d5   Kirill A. Shutemov   slab, slub: use p...
1656
1657
  		call_rcu(&page->rcu_head, kmem_rcu_free);
  	else
0c3aa83e0   Joonsoo Kim   slab: change retu...
1658
  		kmem_freepages(cachep, page);
68126702b   Joonsoo Kim   slab: overloading...
1659
1660
  
  	/*
8456a648c   Joonsoo Kim   slab: use struct ...
1661
  	 * From now on, we don't use freelist
68126702b   Joonsoo Kim   slab: overloading...
1662
1663
1664
  	 * although actual page can be freed in rcu context
  	 */
  	if (OFF_SLAB(cachep))
8456a648c   Joonsoo Kim   slab: use struct ...
1665
  		kmem_cache_free(cachep->freelist_cache, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1666
  }
97654dfa2   Joonsoo Kim   slab: defer slab_...
1667
1668
1669
1670
1671
1672
1673
1674
1675
  static void slabs_destroy(struct kmem_cache *cachep, struct list_head *list)
  {
  	struct page *page, *n;
  
  	list_for_each_entry_safe(page, n, list, lru) {
  		list_del(&page->lru);
  		slab_destroy(cachep, page);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676
  /**
a70773ddb   Randy.Dunlap   [PATCH] mm/slab: ...
1677
1678
1679
   * 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: ...
1680
1681
1682
   * @flags: slab allocation flags
   *
   * Also calculates the number of objects per slab.
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1683
1684
1685
1686
1687
   *
   * 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.
   */
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1688
  static size_t calculate_slab_order(struct kmem_cache *cachep,
2e6b36021   Joonsoo Kim   mm/slab: put the ...
1689
  				size_t size, unsigned long flags)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1690
1691
  {
  	size_t left_over = 0;
9888e6fa7   Linus Torvalds   slab: clarify and...
1692
  	int gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1693

0aa817f07   Christoph Lameter   Slab allocators: ...
1694
  	for (gfporder = 0; gfporder <= KMALLOC_MAX_ORDER; gfporder++) {
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1695
1696
  		unsigned int num;
  		size_t remainder;
70f75067b   Joonsoo Kim   mm/slab: avoid re...
1697
  		num = cache_estimate(gfporder, size, flags, &remainder);
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1698
1699
  		if (!num)
  			continue;
9888e6fa7   Linus Torvalds   slab: clarify and...
1700

f315e3fa1   Joonsoo Kim   slab: restrict th...
1701
1702
1703
  		/* 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...
1704
  		if (flags & CFLGS_OFF_SLAB) {
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1705
1706
1707
1708
1709
1710
1711
  			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...
1712
  			/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1713
  			 * Needed to avoid possible looping condition
76b342bdc   Joonsoo Kim   mm/slab: separate...
1714
  			 * in cache_grow_begin()
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1715
  			 */
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1716
1717
  			if (OFF_SLAB(freelist_cache))
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1718

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

9888e6fa7   Linus Torvalds   slab: clarify and...
1724
  		/* Found something acceptable - save it away */
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1725
  		cachep->num = num;
9888e6fa7   Linus Torvalds   slab: clarify and...
1726
  		cachep->gfporder = gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1727
1728
1729
  		left_over = remainder;
  
  		/*
f78bb8ad4   Linus Torvalds   slab: fix calcula...
1730
1731
1732
1733
1734
1735
1736
1737
  		 * 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...
1738
1739
1740
  		 * Large number of objects is good, but very large slabs are
  		 * currently bad for the gfp()s.
  		 */
543585cc5   David Rientjes   slab: rename slab...
1741
  		if (gfporder >= slab_max_order)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1742
  			break;
9888e6fa7   Linus Torvalds   slab: clarify and...
1743
1744
1745
  		/*
  		 * Acceptable internal fragmentation?
  		 */
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1746
  		if (left_over * 8 <= (PAGE_SIZE << gfporder))
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1747
1748
1749
1750
  			break;
  	}
  	return left_over;
  }
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1751
1752
1753
1754
1755
1756
1757
1758
  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...
1759
  	cpu_cache = __alloc_percpu(size, sizeof(void *));
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
  
  	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...
1771
  static int __ref setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp)
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1772
  {
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1773
  	if (slab_state >= FULL)
83b519e8b   Pekka Enberg   slab: setup alloc...
1774
  		return enable_cpucache(cachep, gfp);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
1775

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1776
1777
1778
  	cachep->cpu_cache = alloc_kmem_cache_cpus(cachep, 1, 1);
  	if (!cachep->cpu_cache)
  		return 1;
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1779
  	if (slab_state == DOWN) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1780
1781
  		/* Creation of first cache (kmem_cache). */
  		set_up_node(kmem_cache, CACHE_CACHE);
2f9baa9fc   Christoph Lameter   slab: Use the new...
1782
  	} else if (slab_state == PARTIAL) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1783
1784
  		/* For kmem_cache_node */
  		set_up_node(cachep, SIZE_NODE);
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1785
  	} else {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1786
  		int node;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1787

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1788
1789
1790
1791
1792
  		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...
1793
1794
  		}
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1795

6a67368c3   Christoph Lameter   slab: Rename node...
1796
  	cachep->node[numa_mem_id()]->next_reap =
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
1797
1798
  			jiffies + REAPTIMEOUT_NODE +
  			((unsigned long)cachep) % REAPTIMEOUT_NODE;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1799
1800
1801
1802
1803
1804
1805
  
  	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 ...
1806
  	return 0;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1807
  }
12220dea0   Joonsoo Kim   mm/slab: support ...
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
  unsigned long kmem_cache_flags(unsigned long object_size,
  	unsigned long flags, const char *name,
  	void (*ctor)(void *))
  {
  	return flags;
  }
  
  struct kmem_cache *
  __kmem_cache_alias(const char *name, size_t size, size_t align,
  		   unsigned long flags, void (*ctor)(void *))
  {
  	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...
1833
1834
1835
1836
1837
1838
  static bool set_objfreelist_slab_cache(struct kmem_cache *cachep,
  			size_t size, unsigned long flags)
  {
  	size_t left;
  
  	cachep->num = 0;
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1839
  	if (cachep->ctor || flags & SLAB_TYPESAFE_BY_RCU)
b03a017be   Joonsoo Kim   mm/slab: introduc...
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
  		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...
1854
1855
1856
1857
1858
1859
1860
1861
  static bool set_off_slab_cache(struct kmem_cache *cachep,
  			size_t size, unsigned long flags)
  {
  	size_t left;
  
  	cachep->num = 0;
  
  	/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1862
1863
  	 * Always use on-slab management when SLAB_NOLEAKTRACE
  	 * to avoid recursive calls into kmemleak.
158e319bb   Joonsoo Kim   mm/slab: clean up...
1864
  	 */
158e319bb   Joonsoo Kim   mm/slab: clean up...
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
  	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,
  			size_t size, unsigned long flags)
  {
  	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...
1903
  /**
039363f38   Christoph Lameter   mm, sl[aou]b: Ext...
1904
   * __kmem_cache_create - Create a cache.
a755b76ab   Randy Dunlap   mm: fix slab.c ke...
1905
   * @cachep: cache management descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1906
   * @flags: SLAB flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1907
1908
1909
   *
   * 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...
1910
   * The @ctor is run when new pages are allocated by the cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1911
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1912
1913
1914
1915
1916
1917
1918
1919
   * 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
1920
1921
1922
1923
   * %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.
   */
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1924
  int
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1925
  __kmem_cache_create (struct kmem_cache *cachep, unsigned long flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926
  {
d4a5fca59   David Rientjes   mm, slab: initial...
1927
  	size_t ralign = BYTES_PER_WORD;
83b519e8b   Pekka Enberg   slab: setup alloc...
1928
  	gfp_t gfp;
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
1929
  	int err;
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1930
  	size_t size = cachep->size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1931

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1932
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1933
1934
1935
1936
1937
1938
1939
  #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 ...
1940
1941
  	if (size < 4096 || fls(size - 1) == fls(size-1 + REDZONE_ALIGN +
  						2 * sizeof(unsigned long long)))
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1942
  		flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
1943
  	if (!(flags & SLAB_TYPESAFE_BY_RCU))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1944
1945
  		flags |= SLAB_POISON;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1946
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1947

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1948
1949
  	/*
  	 * Check that size is in terms of words.  This is needed to avoid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1950
1951
1952
  	 * 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...
1953
  	size = ALIGN(size, BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1954

87a927c71   David Woodhouse   Fix slab redzone ...
1955
1956
1957
1958
  	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...
1959
  		size = ALIGN(size, REDZONE_ALIGN);
87a927c71   David Woodhouse   Fix slab redzone ...
1960
  	}
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1961

a44b56d35   Kevin Hilman   [PATCH] slab debu...
1962
  	/* 3) caller mandated alignment */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1963
1964
  	if (ralign < cachep->align) {
  		ralign = cachep->align;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1965
  	}
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1966
1967
  	/* disable debug if necessary */
  	if (ralign > __alignof__(unsigned long long))
a44b56d35   Kevin Hilman   [PATCH] slab debu...
1968
  		flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1969
  	/*
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1970
  	 * 4) Store it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1971
  	 */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1972
  	cachep->align = ralign;
158e319bb   Joonsoo Kim   mm/slab: clean up...
1973
1974
1975
1976
  	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
1977

83b519e8b   Pekka Enberg   slab: setup alloc...
1978
1979
1980
1981
  	if (slab_is_available())
  		gfp = GFP_KERNEL;
  	else
  		gfp = GFP_NOWAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1982
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1983

ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1984
1985
1986
1987
  	/*
  	 * Both debugging options require word-alignment which is calculated
  	 * into align above.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1988
  	if (flags & SLAB_RED_ZONE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1989
  		/* add space for red zone words */
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1990
1991
  		cachep->obj_offset += sizeof(unsigned long long);
  		size += 2 * sizeof(unsigned long long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1992
1993
  	}
  	if (flags & SLAB_STORE_USER) {
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1994
  		/* user store requires one word storage behind the end of
87a927c71   David Woodhouse   Fix slab redzone ...
1995
1996
  		 * 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
1997
  		 */
87a927c71   David Woodhouse   Fix slab redzone ...
1998
1999
2000
2001
  		if (flags & SLAB_RED_ZONE)
  			size += REDZONE_ALIGN;
  		else
  			size += BYTES_PER_WORD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2002
  	}
832a15d20   Joonsoo Kim   mm/slab: align ca...
2003
  #endif
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2004
  	kasan_cache_create(cachep, &size, &flags);
832a15d20   Joonsoo Kim   mm/slab: align ca...
2005
2006
2007
2008
2009
2010
2011
2012
2013
  	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...
2014
2015
2016
2017
2018
2019
2020
  	/*
  	 * 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.
  	 */
40323278b   Joonsoo Kim   mm/slab: use more...
2021
  	if (debug_pagealloc_enabled() && (flags & SLAB_POISON) &&
f3a3c320d   Joonsoo Kim   mm/slab: do not c...
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
  		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
2033
2034
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2035

b03a017be   Joonsoo Kim   mm/slab: introduc...
2036
2037
2038
2039
  	if (set_objfreelist_slab_cache(cachep, size, flags)) {
  		flags |= CFLGS_OBJFREELIST_SLAB;
  		goto done;
  	}
158e319bb   Joonsoo Kim   mm/slab: clean up...
2040
  	if (set_off_slab_cache(cachep, size, flags)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2041
  		flags |= CFLGS_OFF_SLAB;
158e319bb   Joonsoo Kim   mm/slab: clean up...
2042
  		goto done;
832a15d20   Joonsoo Kim   mm/slab: align ca...
2043
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2044

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

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

158e319bb   Joonsoo Kim   mm/slab: clean up...
2050
2051
  done:
  	cachep->freelist_size = cachep->num * sizeof(freelist_idx_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2052
  	cachep->flags = flags;
a57a49887   Joonsoo Kim   slab: use __GFP_C...
2053
  	cachep->allocflags = __GFP_COMP;
a3187e438   Yang Shi   mm: slab: remove ...
2054
  	if (flags & SLAB_CACHE_DMA)
a618e89f1   Glauber Costa   slab: rename gfpf...
2055
  		cachep->allocflags |= GFP_DMA;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
2056
  	cachep->size = size;
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
2057
  	cachep->reciprocal_buffer_size = reciprocal_value(size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2058

40b441379   Joonsoo Kim   mm/slab: clean up...
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
  #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...
2072
2073
  		cachep->freelist_cache =
  			kmalloc_slab(cachep->freelist_size, 0u);
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2074
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2075

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2076
2077
  	err = setup_cpu_cache(cachep, gfp);
  	if (err) {
52b4b950b   Dmitry Safonov   mm: slab: free km...
2078
  		__kmem_cache_release(cachep);
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2079
  		return err;
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
2080
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2081

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2082
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2083
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
  
  #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 ...
2095
2096
2097
2098
  static void check_mutex_acquired(void)
  {
  	BUG_ON(!mutex_is_locked(&slab_mutex));
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2099
  static void check_spinlock_acquired(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
2101
2102
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2103
  	assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2104
2105
  #endif
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2106

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2107
  static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2108
2109
2110
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2111
  	assert_spin_locked(&get_node(cachep, node)->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2112
2113
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114
2115
2116
  #else
  #define check_irq_off()	do { } while(0)
  #define check_irq_on()	do { } while(0)
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2117
  #define check_mutex_acquired()	do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2118
  #define check_spinlock_acquired(x) do { } while(0)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2119
  #define check_spinlock_acquired_node(x, y) do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2120
  #endif
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
  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...
2137

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2138
2139
  static void do_drain(void *arg)
  {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2140
  	struct kmem_cache *cachep = arg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2141
  	struct array_cache *ac;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2142
  	int node = numa_mem_id();
18bf85411   Christoph Lameter   slab: use get_nod...
2143
  	struct kmem_cache_node *n;
97654dfa2   Joonsoo Kim   slab: defer slab_...
2144
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2145
2146
  
  	check_irq_off();
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2147
  	ac = cpu_cache_get(cachep);
18bf85411   Christoph Lameter   slab: use get_nod...
2148
2149
  	n = get_node(cachep, node);
  	spin_lock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
2150
  	free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
2151
  	spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
2152
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2153
2154
  	ac->avail = 0;
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2155
  static void drain_cpu_caches(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2156
  {
ce8eb6c42   Christoph Lameter   slab: Rename list...
2157
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2158
  	int node;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2159
  	LIST_HEAD(list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2160

15c8b6c1a   Jens Axboe   on_each_cpu(): ki...
2161
  	on_each_cpu(do_drain, cachep, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2162
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2163
2164
  	for_each_kmem_cache_node(cachep, node, n)
  		if (n->alien)
ce8eb6c42   Christoph Lameter   slab: Rename list...
2165
  			drain_alien_cache(cachep, n->alien);
a4523a8b3   Roland Dreier   [PATCH] slab: Fix...
2166

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2167
2168
2169
2170
2171
2172
2173
  	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
2174
  }
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2175
2176
2177
2178
2179
2180
2181
  /*
   * 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...
2182
  			struct kmem_cache_node *n, int tofree)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2183
  {
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2184
2185
  	struct list_head *p;
  	int nr_freed;
8456a648c   Joonsoo Kim   slab: use struct ...
2186
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2187

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2191
2192
2193
2194
  		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...
2195
2196
  			goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2197

8456a648c   Joonsoo Kim   slab: use struct ...
2198
  		page = list_entry(p, struct page, lru);
8456a648c   Joonsoo Kim   slab: use struct ...
2199
  		list_del(&page->lru);
f728b0a5d   Greg Thelen   mm, slab: faster ...
2200
  		n->free_slabs--;
bf00bd345   David Rientjes   mm, slab: maintai...
2201
  		n->total_slabs--;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2202
2203
2204
2205
  		/*
  		 * Safe to drop the lock. The slab is no longer linked
  		 * to the cache.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
2206
2207
  		n->free_objects -= cache->num;
  		spin_unlock_irq(&n->list_lock);
8456a648c   Joonsoo Kim   slab: use struct ...
2208
  		slab_destroy(cache, page);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2209
  		nr_freed++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2210
  	}
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2211
2212
  out:
  	return nr_freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2213
  }
c9fc58640   Tejun Heo   slab: introduce _...
2214
  int __kmem_cache_shrink(struct kmem_cache *cachep)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2215
  {
18bf85411   Christoph Lameter   slab: use get_nod...
2216
2217
  	int ret = 0;
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2218
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2219
2220
2221
2222
  
  	drain_cpu_caches(cachep);
  
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2223
  	for_each_kmem_cache_node(cachep, node, n) {
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
2224
  		drain_freelist(cachep, n, INT_MAX);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2225

ce8eb6c42   Christoph Lameter   slab: Rename list...
2226
2227
  		ret += !list_empty(&n->slabs_full) ||
  			!list_empty(&n->slabs_partial);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2228
2229
2230
  	}
  	return (ret ? 1 : 0);
  }
c9fc58640   Tejun Heo   slab: introduce _...
2231
2232
2233
2234
2235
2236
  #ifdef CONFIG_MEMCG
  void __kmemcg_cache_deactivate(struct kmem_cache *cachep)
  {
  	__kmem_cache_shrink(cachep);
  }
  #endif
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
2237
  int __kmem_cache_shutdown(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2238
  {
c9fc58640   Tejun Heo   slab: introduce _...
2239
  	return __kmem_cache_shrink(cachep);
52b4b950b   Dmitry Safonov   mm: slab: free km...
2240
2241
2242
2243
  }
  
  void __kmem_cache_release(struct kmem_cache *cachep)
  {
12c3667fb   Christoph Lameter   mm/sl[aou]b: Get ...
2244
  	int i;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2245
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2246

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2250
  	/* NUMA: free the node structures */
18bf85411   Christoph Lameter   slab: use get_nod...
2251
2252
2253
2254
2255
  	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 ...
2256
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2258

e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2259
2260
  /*
   * Get the memory for a slab management obj.
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
   *
   * For a slab cache when the slab descriptor is off-slab, the
   * slab descriptor can't come from the same cache which is being created,
   * Because if it is the case, that means we defer the creation of
   * the kmalloc_{dma,}_cache of size sizeof(slab descriptor) to this point.
   * And we eventually call down to __kmem_cache_create(), which
   * in turn looks up in the kmalloc_{dma,}_caches for the disired-size one.
   * This is a "chicken-and-egg" problem.
   *
   * So the off-slab slab descriptor shall come from the kmalloc_{dma,}_caches,
   * which are all initialized during kmem_cache_init().
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2272
   */
7e0073552   Joonsoo Kim   slab: replace non...
2273
  static void *alloc_slabmgmt(struct kmem_cache *cachep,
0c3aa83e0   Joonsoo Kim   slab: change retu...
2274
2275
  				   struct page *page, int colour_off,
  				   gfp_t local_flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2276
  {
7e0073552   Joonsoo Kim   slab: replace non...
2277
  	void *freelist;
0c3aa83e0   Joonsoo Kim   slab: change retu...
2278
  	void *addr = page_address(page);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2279

2e6b36021   Joonsoo Kim   mm/slab: put the ...
2280
2281
  	page->s_mem = addr + colour_off;
  	page->active = 0;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2282
2283
2284
  	if (OBJFREELIST_SLAB(cachep))
  		freelist = NULL;
  	else if (OFF_SLAB(cachep)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2285
  		/* Slab management obj is off-slab. */
8456a648c   Joonsoo Kim   slab: use struct ...
2286
  		freelist = kmem_cache_alloc_node(cachep->freelist_cache,
8759ec50a   Pekka Enberg   slab: remove GFP_...
2287
  					      local_flags, nodeid);
8456a648c   Joonsoo Kim   slab: use struct ...
2288
  		if (!freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2289
2290
  			return NULL;
  	} else {
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2291
2292
2293
  		/* 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
2294
  	}
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2295

8456a648c   Joonsoo Kim   slab: use struct ...
2296
  	return freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2297
  }
7cc68973c   Joonsoo Kim   slab: fix the typ...
2298
  static inline freelist_idx_t get_free_obj(struct page *page, unsigned int idx)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2299
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2300
  	return ((freelist_idx_t *)page->freelist)[idx];
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2301
2302
2303
  }
  
  static inline void set_free_obj(struct page *page,
7cc68973c   Joonsoo Kim   slab: fix the typ...
2304
  					unsigned int idx, freelist_idx_t val)
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2305
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2306
  	((freelist_idx_t *)(page->freelist))[idx] = val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2307
  }
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2308
  static void cache_init_objs_debug(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2309
  {
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2310
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2311
2312
2313
  	int i;
  
  	for (i = 0; i < cachep->num; i++) {
8456a648c   Joonsoo Kim   slab: use struct ...
2314
  		void *objp = index_to_obj(cachep, page, i);
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2315

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2316
2317
2318
2319
2320
2321
2322
2323
  		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
2324
2325
2326
  		 * 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
2327
  		 */
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2328
2329
2330
  		if (cachep->ctor && !(cachep->flags & SLAB_POISON)) {
  			kasan_unpoison_object_data(cachep,
  						   objp + obj_offset(cachep));
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
2331
  			cachep->ctor(objp + obj_offset(cachep));
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2332
2333
2334
  			kasan_poison_object_data(
  				cachep, objp + obj_offset(cachep));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2335
2336
2337
  
  		if (cachep->flags & SLAB_RED_ZONE) {
  			if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2338
  				slab_error(cachep, "constructor overwrote the end of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2339
  			if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
756a025f0   Joe Perches   mm: coalesce spli...
2340
  				slab_error(cachep, "constructor overwrote the start of an object");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2341
  		}
40b441379   Joonsoo Kim   mm/slab: clean up...
2342
2343
2344
2345
2346
  		/* need to poison the objs? */
  		if (cachep->flags & SLAB_POISON) {
  			poison_obj(cachep, objp, POISON_FREE);
  			slab_kernel_map(cachep, objp, 0, 0);
  		}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2347
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2348
  #endif
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2349
  }
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2350
2351
2352
2353
2354
  #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...
2355
  		unsigned int *list;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2356
  		unsigned int count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
  	};
  	struct rnd_state rnd_state;
  };
  
  /*
   * Initialize the state based on the randomization methode available.
   * return true if the pre-computed list is available, false otherwize.
   */
  static bool freelist_state_initialize(union freelist_init_state *state,
  				struct kmem_cache *cachep,
  				unsigned int count)
  {
  	bool ret;
  	unsigned int rand;
  
  	/* Use best entropy available to define a random shift */
7c00fce98   Thomas Garnier   mm: reorganize SL...
2373
  	rand = get_random_int();
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2374
2375
2376
2377
2378
2379
2380
2381
  
  	/* 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...
2382
  		state->pos = rand % count;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2383
2384
2385
2386
2387
2388
2389
2390
  		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...
2391
2392
2393
  	if (state->pos >= state->count)
  		state->pos = 0;
  	return state->list[state->pos++];
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2394
  }
7c00fce98   Thomas Garnier   mm: reorganize SL...
2395
2396
2397
2398
2399
2400
  /* 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...
2401
2402
2403
2404
2405
2406
  /*
   * 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...
2407
  	unsigned int objfreelist = 0, i, rand, count = cachep->num;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
  	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...
2432
2433
2434
2435
2436
2437
2438
2439
2440
  		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...
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
  	} 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...
2458
2459
2460
2461
  static void cache_init_objs(struct kmem_cache *cachep,
  			    struct page *page)
  {
  	int i;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2462
  	void *objp;
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2463
  	bool shuffled;
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2464
2465
  
  	cache_init_objs_debug(cachep, page);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2466
2467
2468
2469
  	/* Try to randomize the freelist if enabled */
  	shuffled = shuffle_freelist(cachep, page);
  
  	if (!shuffled && OBJFREELIST_SLAB(cachep)) {
b03a017be   Joonsoo Kim   mm/slab: introduc...
2470
2471
2472
  		page->freelist = index_to_obj(cachep, page, cachep->num - 1) +
  						obj_offset(cachep);
  	}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2473
  	for (i = 0; i < cachep->num; i++) {
b3cbd9bf7   Andrey Ryabinin   mm/kasan: get rid...
2474
2475
  		objp = index_to_obj(cachep, page, i);
  		kasan_init_slab_obj(cachep, objp);
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2476
  		/* constructor could break poison info */
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2477
  		if (DEBUG == 0 && cachep->ctor) {
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2478
2479
2480
2481
  			kasan_unpoison_object_data(cachep, objp);
  			cachep->ctor(objp);
  			kasan_poison_object_data(cachep, objp);
  		}
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2482

c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2483
2484
  		if (!shuffled)
  			set_free_obj(page, i, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2485
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2486
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2487
  static void *slab_get_obj(struct kmem_cache *cachep, struct page *page)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2488
  {
b1cb0982b   Joonsoo Kim   slab: change the ...
2489
  	void *objp;
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2490

e5c58dfdc   Joonsoo Kim   slab: introduce h...
2491
  	objp = index_to_obj(cachep, page, get_free_obj(page, page->active));
8456a648c   Joonsoo Kim   slab: use struct ...
2492
  	page->active++;
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2493

d31676dfd   Joonsoo Kim   mm/slab: alternat...
2494
2495
2496
2497
  #if DEBUG
  	if (cachep->flags & SLAB_STORE_USER)
  		set_store_user_dirty(cachep);
  #endif
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2498
2499
  	return objp;
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2500
2501
  static void slab_put_obj(struct kmem_cache *cachep,
  			struct page *page, void *objp)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2502
  {
8456a648c   Joonsoo Kim   slab: use struct ...
2503
  	unsigned int objnr = obj_to_index(cachep, page, objp);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2504
  #if DEBUG
16025177e   Joonsoo Kim   slab: remove kmem...
2505
  	unsigned int i;
b1cb0982b   Joonsoo Kim   slab: change the ...
2506

b1cb0982b   Joonsoo Kim   slab: change the ...
2507
  	/* Verify double free bug */
8456a648c   Joonsoo Kim   slab: use struct ...
2508
  	for (i = page->active; i < cachep->num; i++) {
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2509
  		if (get_free_obj(page, i) == objnr) {
1170532bb   Joe Perches   mm: convert print...
2510
2511
  			pr_err("slab: double free detected in cache '%s', objp %p
  ",
756a025f0   Joe Perches   mm: coalesce spli...
2512
  			       cachep->name, objp);
b1cb0982b   Joonsoo Kim   slab: change the ...
2513
2514
  			BUG();
  		}
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2515
2516
  	}
  #endif
8456a648c   Joonsoo Kim   slab: use struct ...
2517
  	page->active--;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2518
2519
  	if (!page->freelist)
  		page->freelist = objp + obj_offset(cachep);
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2520
  	set_free_obj(page, page->active, objnr);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2521
  }
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2522
2523
2524
  /*
   * 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_...
2525
   * virtual address for kfree, ksize, and slab debugging.
4776874ff   Pekka Enberg   [PATCH] slab: pag...
2526
   */
8456a648c   Joonsoo Kim   slab: use struct ...
2527
  static void slab_map_pages(struct kmem_cache *cache, struct page *page,
7e0073552   Joonsoo Kim   slab: replace non...
2528
  			   void *freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2529
  {
a57a49887   Joonsoo Kim   slab: use __GFP_C...
2530
  	page->slab_cache = cache;
8456a648c   Joonsoo Kim   slab: use struct ...
2531
  	page->freelist = freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2532
2533
2534
2535
2536
2537
  }
  
  /*
   * 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...
2538
2539
  static struct page *cache_grow_begin(struct kmem_cache *cachep,
  				gfp_t flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2540
  {
7e0073552   Joonsoo Kim   slab: replace non...
2541
  	void *freelist;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2542
2543
  	size_t offset;
  	gfp_t local_flags;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2544
  	int page_node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2545
  	struct kmem_cache_node *n;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2546
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2547

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2548
2549
2550
  	/*
  	 * 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
2551
  	 */
c871ac4e9   Andrew Morton   slab: improve che...
2552
  	if (unlikely(flags & GFP_SLAB_BUG_MASK)) {
bacdcb346   Michal Hocko   slab: make GFP_SL...
2553
  		gfp_t invalid_mask = flags & GFP_SLAB_BUG_MASK;
72baeef0c   Michal Hocko   slab: do not pani...
2554
2555
2556
2557
2558
  		flags &= ~GFP_SLAB_BUG_MASK;
  		pr_warn("Unexpected gfp: %#x (%pGg). Fixing up to gfp: %#x (%pGg). Fix your code!
  ",
  				invalid_mask, &invalid_mask, flags, &flags);
  		dump_stack();
c871ac4e9   Andrew Morton   slab: improve che...
2559
  	}
6cb062296   Christoph Lameter   Categorize GFP flags
2560
  	local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2561

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2562
  	check_irq_off();
d0164adc8   Mel Gorman   mm, page_alloc: d...
2563
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2564
2565
2566
  		local_irq_enable();
  
  	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2567
2568
  	 * Get mem for the objs.  Attempt to allocate a physical page from
  	 * 'nodeid'.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2569
  	 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
2570
  	page = kmem_getpages(cachep, local_flags, nodeid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
2571
  	if (!page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2572
  		goto failed;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2573
2574
  	page_node = page_to_nid(page);
  	n = get_node(cachep, page_node);
03d1d43a1   Joonsoo Kim   mm/slab: racy acc...
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
  
  	/* 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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2586
  	/* Get slab management. */
8456a648c   Joonsoo Kim   slab: use struct ...
2587
  	freelist = alloc_slabmgmt(cachep, page, offset,
511e3a058   Joonsoo Kim   mm/slab: make cac...
2588
  			local_flags & ~GFP_CONSTRAINT_MASK, page_node);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2589
  	if (OFF_SLAB(cachep) && !freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2590
  		goto opps1;
8456a648c   Joonsoo Kim   slab: use struct ...
2591
  	slab_map_pages(cachep, page, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2592

7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2593
  	kasan_poison_slab(page);
8456a648c   Joonsoo Kim   slab: use struct ...
2594
  	cache_init_objs(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2595

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

76b342bdc   Joonsoo Kim   mm/slab: separate...
2599
  	return page;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2600
  opps1:
0c3aa83e0   Joonsoo Kim   slab: change retu...
2601
  	kmem_freepages(cachep, page);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2602
  failed:
d0164adc8   Mel Gorman   mm, page_alloc: d...
2603
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2604
  		local_irq_disable();
76b342bdc   Joonsoo Kim   mm/slab: separate...
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
  	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;
  
  	INIT_LIST_HEAD(&page->lru);
  	n = get_node(cachep, page_to_nid(page));
  
  	spin_lock(&n->list_lock);
bf00bd345   David Rientjes   mm, slab: maintai...
2622
  	n->total_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2623
  	if (!page->active) {
76b342bdc   Joonsoo Kim   mm/slab: separate...
2624
  		list_add_tail(&page->lru, &(n->slabs_free));
f728b0a5d   Greg Thelen   mm, slab: faster ...
2625
  		n->free_slabs++;
bf00bd345   David Rientjes   mm, slab: maintai...
2626
  	} else
76b342bdc   Joonsoo Kim   mm/slab: separate...
2627
  		fixup_slab_list(cachep, n, page, &list);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
2628

76b342bdc   Joonsoo Kim   mm/slab: separate...
2629
2630
2631
2632
2633
  	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
2634
2635
2636
2637
2638
2639
2640
2641
  }
  
  #if DEBUG
  
  /*
   * Perform extra freeing checks:
   * - detect bad pointers.
   * - POISON/RED_ZONE checking
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2642
2643
2644
   */
  static void kfree_debugcheck(const void *objp)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2645
  	if (!virt_addr_valid(objp)) {
1170532bb   Joe Perches   mm: convert print...
2646
2647
  		pr_err("kfree_debugcheck: out of range ptr %lxh
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2648
2649
  		       (unsigned long)objp);
  		BUG();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2650
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2651
  }
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2652
2653
  static inline void verify_redzone_free(struct kmem_cache *cache, void *obj)
  {
b46b8f19c   David Woodhouse   Increase slab red...
2654
  	unsigned long long redzone1, redzone2;
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
  
  	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");
1170532bb   Joe Perches   mm: convert print...
2669
2670
2671
  	pr_err("%p: redzone 1:0x%llx, redzone 2:0x%llx
  ",
  	       obj, redzone1, redzone2);
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2672
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2673
  static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2674
  				   unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2675
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2676
  	unsigned int objnr;
8456a648c   Joonsoo Kim   slab: use struct ...
2677
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2678

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2684
  	if (cachep->flags & SLAB_RED_ZONE) {
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2685
  		verify_redzone_free(cachep, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2686
2687
2688
  		*dbg_redzone1(cachep, objp) = RED_INACTIVE;
  		*dbg_redzone2(cachep, objp) = RED_INACTIVE;
  	}
d31676dfd   Joonsoo Kim   mm/slab: alternat...
2689
2690
  	if (cachep->flags & SLAB_STORE_USER) {
  		set_store_user_dirty(cachep);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2691
  		*dbg_userword(cachep, objp) = (void *)caller;
d31676dfd   Joonsoo Kim   mm/slab: alternat...
2692
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2693

8456a648c   Joonsoo Kim   slab: use struct ...
2694
  	objnr = obj_to_index(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2695
2696
  
  	BUG_ON(objnr >= cachep->num);
8456a648c   Joonsoo Kim   slab: use struct ...
2697
  	BUG_ON(objp != index_to_obj(cachep, page, objnr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2698

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2699
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2700
  		poison_obj(cachep, objp, POISON_FREE);
40b441379   Joonsoo Kim   mm/slab: clean up...
2701
  		slab_kernel_map(cachep, objp, 0, caller);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2702
2703
2704
  	}
  	return objp;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2705
2706
2707
  #else
  #define kfree_debugcheck(x) do { } while(0)
  #define cache_free_debugcheck(x,objp,z) (objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2708
  #endif
b03a017be   Joonsoo Kim   mm/slab: introduc...
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
  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...
2723
  static inline void fixup_slab_list(struct kmem_cache *cachep,
b03a017be   Joonsoo Kim   mm/slab: introduc...
2724
2725
  				struct kmem_cache_node *n, struct page *page,
  				void **list)
d8410234d   Joonsoo Kim   mm/slab: factor o...
2726
2727
2728
  {
  	/* move slabp to correct slabp list: */
  	list_del(&page->lru);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2729
  	if (page->active == cachep->num) {
d8410234d   Joonsoo Kim   mm/slab: factor o...
2730
  		list_add(&page->lru, &n->slabs_full);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
  		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
d8410234d   Joonsoo Kim   mm/slab: factor o...
2744
2745
  		list_add(&page->lru, &n->slabs_partial);
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2746
2747
  /* 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...
2748
  					struct page *page, bool pfmemalloc)
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
  {
  	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 */
  	list_del(&page->lru);
bf00bd345   David Rientjes   mm, slab: maintai...
2767
  	if (!page->active) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2768
  		list_add_tail(&page->lru, &n->slabs_free);
bf00bd345   David Rientjes   mm, slab: maintai...
2769
  		n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2770
  	} else
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2771
2772
2773
2774
2775
2776
  		list_add_tail(&page->lru, &n->slabs_partial);
  
  	list_for_each_entry(page, &n->slabs_partial, lru) {
  		if (!PageSlabPfmemalloc(page))
  			return page;
  	}
f728b0a5d   Greg Thelen   mm, slab: faster ...
2777
  	n->free_touched = 1;
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2778
  	list_for_each_entry(page, &n->slabs_free, lru) {
f728b0a5d   Greg Thelen   mm, slab: faster ...
2779
  		if (!PageSlabPfmemalloc(page)) {
bf00bd345   David Rientjes   mm, slab: maintai...
2780
  			n->free_slabs--;
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2781
  			return page;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2782
  		}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2783
2784
2785
2786
2787
2788
  	}
  
  	return NULL;
  }
  
  static struct page *get_first_slab(struct kmem_cache_node *n, bool pfmemalloc)
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2789
2790
  {
  	struct page *page;
f728b0a5d   Greg Thelen   mm, slab: faster ...
2791
  	assert_spin_locked(&n->list_lock);
bf00bd345   David Rientjes   mm, slab: maintai...
2792
  	page = list_first_entry_or_null(&n->slabs_partial, struct page, lru);
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2793
2794
  	if (!page) {
  		n->free_touched = 1;
bf00bd345   David Rientjes   mm, slab: maintai...
2795
2796
  		page = list_first_entry_or_null(&n->slabs_free, struct page,
  						lru);
f728b0a5d   Greg Thelen   mm, slab: faster ...
2797
  		if (page)
bf00bd345   David Rientjes   mm, slab: maintai...
2798
  			n->free_slabs--;
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2799
  	}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2800
  	if (sk_memalloc_socks())
bf00bd345   David Rientjes   mm, slab: maintai...
2801
  		page = get_valid_first_slab(n, page, pfmemalloc);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2802

7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2803
2804
  	return page;
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
  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...
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
  /*
   * 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...
2855
  static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2856
2857
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2858
  	struct kmem_cache_node *n;
801faf0db   Joonsoo Kim   mm/slab: lockless...
2859
  	struct array_cache *ac, *shared;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2860
  	int node;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2861
  	void *list = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2862
  	struct page *page;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2863

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

9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2867
  	ac = cpu_cache_get(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2868
2869
  	batchcount = ac->batchcount;
  	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2870
2871
2872
2873
  		/*
  		 * 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
2874
2875
2876
  		 */
  		batchcount = BATCHREFILL_LIMIT;
  	}
18bf85411   Christoph Lameter   slab: use get_nod...
2877
  	n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2878

ce8eb6c42   Christoph Lameter   slab: Rename list...
2879
  	BUG_ON(ac->avail > 0 || !n);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2880
2881
2882
  	shared = READ_ONCE(n->shared);
  	if (!n->free_objects && (!shared || !shared->avail))
  		goto direct_grow;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2883
  	spin_lock(&n->list_lock);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2884
  	shared = READ_ONCE(n->shared);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2885

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

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

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

213b46958   Joonsoo Kim   mm/slab: refill c...
2900
  		batchcount = alloc_block(cachep, ac, page, batchcount);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2901
  		fixup_slab_list(cachep, n, page, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2902
  	}
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2903
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2904
  	n->free_objects -= ac->avail;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2905
  alloc_done:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2906
  	spin_unlock(&n->list_lock);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2907
  	fixup_objfreelist_debug(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2908

801faf0db   Joonsoo Kim   mm/slab: lockless...
2909
  direct_grow:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2910
  	if (unlikely(!ac->avail)) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2911
2912
2913
2914
2915
2916
2917
  		/* 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...
2918
  		page = cache_grow_begin(cachep, gfp_exact_node(flags), node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2919

76b342bdc   Joonsoo Kim   mm/slab: separate...
2920
2921
2922
2923
  		/*
  		 * cache_grow_begin() can reenable interrupts,
  		 * then ac could change.
  		 */
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2924
  		ac = cpu_cache_get(cachep);
213b46958   Joonsoo Kim   mm/slab: refill c...
2925
2926
2927
  		if (!ac->avail && page)
  			alloc_block(cachep, ac, page, batchcount);
  		cache_grow_end(cachep, page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2928

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2934
  	return ac->entry[--ac->avail];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2935
  }
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2936
2937
  static inline void cache_alloc_debugcheck_before(struct kmem_cache *cachep,
  						gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2938
  {
d0164adc8   Mel Gorman   mm, page_alloc: d...
2939
  	might_sleep_if(gfpflags_allow_blocking(flags));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2940
2941
2942
  }
  
  #if DEBUG
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2943
  static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2944
  				gfp_t flags, void *objp, unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2945
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2946
  	if (!objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2947
  		return objp;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2948
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2949
  		check_poison_obj(cachep, objp);
40b441379   Joonsoo Kim   mm/slab: clean up...
2950
  		slab_kernel_map(cachep, objp, 1, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2951
2952
2953
  		poison_obj(cachep, objp, POISON_INUSE);
  	}
  	if (cachep->flags & SLAB_STORE_USER)
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2954
  		*dbg_userword(cachep, objp) = (void *)caller;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2955
2956
  
  	if (cachep->flags & SLAB_RED_ZONE) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2957
2958
  		if (*dbg_redzone1(cachep, objp) != RED_INACTIVE ||
  				*dbg_redzone2(cachep, objp) != RED_INACTIVE) {
756a025f0   Joe Perches   mm: coalesce spli...
2959
  			slab_error(cachep, "double free, or memory outside object was overwritten");
1170532bb   Joe Perches   mm: convert print...
2960
2961
2962
2963
  			pr_err("%p: redzone 1:0x%llx, redzone 2:0x%llx
  ",
  			       objp, *dbg_redzone1(cachep, objp),
  			       *dbg_redzone2(cachep, objp));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2964
2965
2966
2967
  		}
  		*dbg_redzone1(cachep, objp) = RED_ACTIVE;
  		*dbg_redzone2(cachep, objp) = RED_ACTIVE;
  	}
037873014   Joonsoo Kim   slab: fix oops wh...
2968

3dafccf22   Manfred Spraul   [PATCH] slab: dis...
2969
  	objp += obj_offset(cachep);
4f1049345   Christoph Lameter   slab allocators: ...
2970
  	if (cachep->ctor && cachep->flags & SLAB_POISON)
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
2971
  		cachep->ctor(objp);
7ea466f22   Tetsuo Handa   slab: fix DEBUG_S...
2972
2973
  	if (ARCH_SLAB_MINALIGN &&
  	    ((unsigned long)objp & (ARCH_SLAB_MINALIGN-1))) {
1170532bb   Joe Perches   mm: convert print...
2974
2975
  		pr_err("0x%p: not aligned to ARCH_SLAB_MINALIGN=%d
  ",
c225150b8   Hugh Dickins   slab: fix DEBUG_S...
2976
  		       objp, (int)ARCH_SLAB_MINALIGN);
a44b56d35   Kevin Hilman   [PATCH] slab debu...
2977
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2978
2979
2980
2981
2982
  	return objp;
  }
  #else
  #define cache_alloc_debugcheck_after(a,b,objp,d) (objp)
  #endif
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2983
  static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2984
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2985
  	void *objp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2986
  	struct array_cache *ac;
5c3823008   Alok N Kataria   [PATCH] kmalloc_n...
2987
  	check_irq_off();
8a8b6502f   Akinobu Mita   [PATCH] fault-inj...
2988

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2994
2995
  		STATS_INC_ALLOCHIT(cachep);
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2996
  	}
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2997
2998
  
  	STATS_INC_ALLOCMISS(cachep);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2999
  	objp = cache_alloc_refill(cachep, flags);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3000
3001
3002
3003
3004
3005
3006
  	/*
  	 * 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...
3007
3008
3009
3010
3011
  	/*
  	 * 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...
3012
3013
  	if (objp)
  		kmemleak_erase(&ac->entry[ac->avail]);
5c3823008   Alok N Kataria   [PATCH] kmalloc_n...
3014
3015
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3016
3017
  #ifdef CONFIG_NUMA
  /*
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
3018
   * Try allocating on another node if PFA_SPREAD_SLAB is a mempolicy is set.
c61afb181   Paul Jackson   [PATCH] cpuset me...
3019
3020
3021
3022
3023
3024
3025
   *
   * 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...
3026
  	if (in_interrupt() || (flags & __GFP_THISNODE))
c61afb181   Paul Jackson   [PATCH] cpuset me...
3027
  		return NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3028
  	nid_alloc = nid_here = numa_mem_id();
c61afb181   Paul Jackson   [PATCH] cpuset me...
3029
  	if (cpuset_do_slab_mem_spread() && (cachep->flags & SLAB_MEM_SPREAD))
6adef3ebe   Jack Steiner   cpusets: new roun...
3030
  		nid_alloc = cpuset_slab_spread_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
3031
  	else if (current->mempolicy)
2a389610a   David Rientjes   mm, mempolicy: re...
3032
  		nid_alloc = mempolicy_slab_node();
c61afb181   Paul Jackson   [PATCH] cpuset me...
3033
  	if (nid_alloc != nid_here)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3034
  		return ____cache_alloc_node(cachep, flags, nid_alloc);
c61afb181   Paul Jackson   [PATCH] cpuset me...
3035
3036
3037
3038
  	return NULL;
  }
  
  /*
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
3039
   * Fallback function if there was no memory available and no objects on a
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3040
   * certain node and fall back is permitted. First we scan all the
6a67368c3   Christoph Lameter   slab: Rename node...
3041
   * available node for available objects. If that fails then we
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3042
3043
3044
   * 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...
3045
   */
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3046
  static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
3047
  {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3048
  	struct zonelist *zonelist;
dd1a239f6   Mel Gorman   mm: have zonelist...
3049
  	struct zoneref *z;
54a6eb5c4   Mel Gorman   mm: use two zonel...
3050
3051
  	struct zone *zone;
  	enum zone_type high_zoneidx = gfp_zone(flags);
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
3052
  	void *obj = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
3053
  	struct page *page;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3054
  	int nid;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3055
  	unsigned int cpuset_mems_cookie;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3056
3057
3058
  
  	if (flags & __GFP_THISNODE)
  		return NULL;
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3059
  retry_cpuset:
d26914d11   Mel Gorman   mm: optimize put_...
3060
  	cpuset_mems_cookie = read_mems_allowed_begin();
2a389610a   David Rientjes   mm, mempolicy: re...
3061
  	zonelist = node_zonelist(mempolicy_slab_node(), flags);
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3062

3c517a613   Christoph Lameter   [PATCH] slab: bet...
3063
3064
3065
3066
3067
  retry:
  	/*
  	 * Look through allowed nodes for objects available
  	 * from existing per node queues.
  	 */
54a6eb5c4   Mel Gorman   mm: use two zonel...
3068
3069
  	for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) {
  		nid = zone_to_nid(zone);
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
3070

061d7074e   Vladimir Davydov   slab: fix cpuset ...
3071
  		if (cpuset_zone_allowed(zone, flags) &&
18bf85411   Christoph Lameter   slab: use get_nod...
3072
3073
  			get_node(cache, nid) &&
  			get_node(cache, nid)->free_objects) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3074
  				obj = ____cache_alloc_node(cache,
4167e9b2c   David Rientjes   mm: remove GFP_TH...
3075
  					gfp_exact_node(flags), nid);
481c5346d   Christoph Lameter   Slab: Fix memory ...
3076
3077
3078
  				if (obj)
  					break;
  		}
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3079
  	}
cfce66047   Christoph Lameter   Slab allocators: ...
3080
  	if (!obj) {
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3081
3082
3083
3084
3085
3086
  		/*
  		 * 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...
3087
3088
3089
3090
  		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...
3091
3092
  			obj = ____cache_alloc_node(cache,
  				gfp_exact_node(flags), nid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
3093

3c517a613   Christoph Lameter   [PATCH] slab: bet...
3094
  			/*
511e3a058   Joonsoo Kim   mm/slab: make cac...
3095
3096
  			 * Another processor may allocate the objects in
  			 * the slab since we are not holding any locks.
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3097
  			 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
3098
3099
  			if (!obj)
  				goto retry;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3100
  		}
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
3101
  	}
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3102

d26914d11   Mel Gorman   mm: optimize put_...
3103
  	if (unlikely(!obj && read_mems_allowed_retry(cpuset_mems_cookie)))
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3104
  		goto retry_cpuset;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
3105
3106
3107
3108
  	return obj;
  }
  
  /*
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3109
   * A interface to enable slab creation on nodeid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3110
   */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3111
  static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags,
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3112
  				int nodeid)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3113
  {
8456a648c   Joonsoo Kim   slab: use struct ...
3114
  	struct page *page;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3115
  	struct kmem_cache_node *n;
213b46958   Joonsoo Kim   mm/slab: refill c...
3116
  	void *obj = NULL;
b03a017be   Joonsoo Kim   mm/slab: introduc...
3117
  	void *list = NULL;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3118

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

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

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3129
  	check_spinlock_acquired_node(cachep, nodeid);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3130
3131
3132
3133
  
  	STATS_INC_NODEALLOCS(cachep);
  	STATS_INC_ACTIVE(cachep);
  	STATS_SET_HIGH(cachep);
8456a648c   Joonsoo Kim   slab: use struct ...
3134
  	BUG_ON(page->active == cachep->num);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3135

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

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

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3145
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
3146
  	spin_unlock(&n->list_lock);
76b342bdc   Joonsoo Kim   mm/slab: separate...
3147
  	page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid);
213b46958   Joonsoo Kim   mm/slab: refill c...
3148
3149
3150
3151
  	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...
3152
  	cache_grow_end(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3153

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

8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3157
  static __always_inline void *
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3158
  slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3159
  		   unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3160
3161
3162
  {
  	unsigned long save_flags;
  	void *ptr;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3163
  	int slab_node = numa_mem_id();
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3164

dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3165
  	flags &= gfp_allowed_mask;
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3166
3167
  	cachep = slab_pre_alloc_hook(cachep, flags);
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3168
  		return NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3169
3170
  	cache_alloc_debugcheck_before(cachep, flags);
  	local_irq_save(save_flags);
eacbbae38   Andrew Morton   slab: use NUMA_NO...
3171
  	if (nodeid == NUMA_NO_NODE)
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3172
  		nodeid = slab_node;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3173

18bf85411   Christoph Lameter   slab: use get_nod...
3174
  	if (unlikely(!get_node(cachep, nodeid))) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3175
3176
3177
3178
  		/* Node not bootstrapped yet */
  		ptr = fallback_alloc(cachep, flags);
  		goto out;
  	}
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3179
  	if (nodeid == slab_node) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
  		/*
  		 * 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);
d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3195
3196
  	if (unlikely(flags & __GFP_ZERO) && ptr)
  		memset(ptr, 0, cachep->object_size);
d07dbea46   Christoph Lameter   Slab allocators: ...
3197

d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3198
  	slab_post_alloc_hook(cachep, flags, 1, &ptr);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3199
3200
3201
3202
3203
3204
3205
  	return ptr;
  }
  
  static __always_inline void *
  __do_cache_alloc(struct kmem_cache *cache, gfp_t flags)
  {
  	void *objp;
2ad654bc5   Zefan Li   cpuset: PF_SPREAD...
3206
  	if (current->mempolicy || cpuset_do_slab_mem_spread()) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
  		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...
3217
3218
  	if (!objp)
  		objp = ____cache_alloc_node(cache, flags, numa_mem_id());
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
  
    out:
  	return objp;
  }
  #else
  
  static __always_inline void *
  __do_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
  {
  	return ____cache_alloc(cachep, flags);
  }
  
  #endif /* CONFIG_NUMA */
  
  static __always_inline void *
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3234
  slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3235
3236
3237
  {
  	unsigned long save_flags;
  	void *objp;
dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3238
  	flags &= gfp_allowed_mask;
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3239
3240
  	cachep = slab_pre_alloc_hook(cachep, flags);
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3241
  		return NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3242
3243
3244
3245
3246
3247
  	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);
d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3248
3249
  	if (unlikely(flags & __GFP_ZERO) && objp)
  		memset(objp, 0, cachep->object_size);
d07dbea46   Christoph Lameter   Slab allocators: ...
3250

d5e3ed66d   Jesper Dangaard Brouer   slab: use slab_po...
3251
  	slab_post_alloc_hook(cachep, flags, 1, &objp);
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3252
3253
  	return objp;
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3254
3255
  
  /*
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3256
   * Caller needs to acquire correct kmem_cache_node's list_lock
97654dfa2   Joonsoo Kim   slab: defer slab_...
3257
   * @list: List of detached free slabs should be freed by caller
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3258
   */
97654dfa2   Joonsoo Kim   slab: defer slab_...
3259
3260
  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
3261
3262
  {
  	int i;
25c063fbd   Joonsoo Kim   slab: move up cod...
3263
  	struct kmem_cache_node *n = get_node(cachep, node);
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3264
3265
3266
  	struct page *page;
  
  	n->free_objects += nr_objects;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3267
3268
  
  	for (i = 0; i < nr_objects; i++) {
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3269
  		void *objp;
8456a648c   Joonsoo Kim   slab: use struct ...
3270
  		struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3271

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3272
  		objp = objpp[i];
8456a648c   Joonsoo Kim   slab: use struct ...
3273
  		page = virt_to_head_page(objp);
8456a648c   Joonsoo Kim   slab: use struct ...
3274
  		list_del(&page->lru);
ff69416e6   Christoph Lameter   [PATCH] slab: fix...
3275
  		check_spinlock_acquired_node(cachep, node);
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3276
  		slab_put_obj(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3277
  		STATS_DEC_ACTIVE(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3278
3279
  
  		/* fixup slab chains */
f728b0a5d   Greg Thelen   mm, slab: faster ...
3280
  		if (page->active == 0) {
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3281
  			list_add(&page->lru, &n->slabs_free);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3282
  			n->free_slabs++;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3283
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3284
3285
3286
3287
  			/* Unconditionally move a slab to the end of the
  			 * partial list on free - maximum time for the
  			 * other objects to be freed, too.
  			 */
8456a648c   Joonsoo Kim   slab: use struct ...
3288
  			list_add_tail(&page->lru, &n->slabs_partial);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3289
3290
  		}
  	}
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3291
3292
3293
3294
3295
  
  	while (n->free_objects > n->free_limit && !list_empty(&n->slabs_free)) {
  		n->free_objects -= cachep->num;
  
  		page = list_last_entry(&n->slabs_free, struct page, lru);
de24baecd   Wei Yongjun   mm/slab: use list...
3296
  		list_move(&page->lru, list);
f728b0a5d   Greg Thelen   mm, slab: faster ...
3297
  		n->free_slabs--;
bf00bd345   David Rientjes   mm, slab: maintai...
3298
  		n->total_slabs--;
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3299
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3300
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3301
  static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3302
3303
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3304
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3305
  	int node = numa_mem_id();
97654dfa2   Joonsoo Kim   slab: defer slab_...
3306
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3307
3308
  
  	batchcount = ac->batchcount;
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3309

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3310
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
3311
  	n = get_node(cachep, node);
ce8eb6c42   Christoph Lameter   slab: Rename list...
3312
3313
3314
  	spin_lock(&n->list_lock);
  	if (n->shared) {
  		struct array_cache *shared_array = n->shared;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3315
  		int max = shared_array->limit - shared_array->avail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3316
3317
3318
  		if (max) {
  			if (batchcount > max)
  				batchcount = max;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3319
  			memcpy(&(shared_array->entry[shared_array->avail]),
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3320
  			       ac->entry, sizeof(void *) * batchcount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3321
3322
3323
3324
  			shared_array->avail += batchcount;
  			goto free_done;
  		}
  	}
97654dfa2   Joonsoo Kim   slab: defer slab_...
3325
  	free_block(cachep, ac->entry, batchcount, node, &list);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3326
  free_done:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3327
3328
3329
  #if STATS
  	{
  		int i = 0;
73c0219d8   Geliang Tang   mm/slab.c: use li...
3330
  		struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3331

73c0219d8   Geliang Tang   mm/slab.c: use li...
3332
  		list_for_each_entry(page, &n->slabs_free, lru) {
8456a648c   Joonsoo Kim   slab: use struct ...
3333
  			BUG_ON(page->active);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3334
3335
  
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3336
3337
3338
3339
  		}
  		STATS_SET_FREEABLE(cachep, i);
  	}
  #endif
ce8eb6c42   Christoph Lameter   slab: Rename list...
3340
  	spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
3341
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3342
  	ac->avail -= batchcount;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3343
  	memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3344
3345
3346
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3347
3348
   * 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
3349
   */
a947eb95e   Suleiman Souhlal   SLAB: Record actu...
3350
  static inline void __cache_free(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3351
  				unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3352
  {
55834c590   Alexander Potapenko   mm: kasan: initia...
3353
3354
3355
3356
3357
3358
  	/* Put the object into the quarantine, don't touch it for now. */
  	if (kasan_slab_free(cachep, objp))
  		return;
  
  	___cache_free(cachep, objp, caller);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3359

55834c590   Alexander Potapenko   mm: kasan: initia...
3360
3361
3362
3363
  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...
3364

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3365
  	check_irq_off();
d5cff6352   Catalin Marinas   kmemleak: Add the...
3366
  	kmemleak_free_recursive(objp, cachep->flags);
a947eb95e   Suleiman Souhlal   SLAB: Record actu...
3367
  	objp = cache_free_debugcheck(cachep, objp, caller);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3368

8c138bc00   Christoph Lameter   slab: Get rid of ...
3369
  	kmemcheck_slab_free(cachep, objp, cachep->object_size);
c175eea46   Pekka Enberg   slab: add hooks f...
3370

1807a1aaf   Siddha, Suresh B   slab: skip callin...
3371
3372
3373
3374
3375
3376
3377
  	/*
  	 * 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...
3378
  	if (nr_online_nodes > 1 && cache_free_alien(cachep, objp))
729bd0b74   Pekka Enberg   [PATCH] slab: ext...
3379
  		return;
3d8801940   Joonsoo Kim   mm/slab: move cac...
3380
  	if (ac->avail < ac->limit) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3381
  		STATS_INC_FREEHIT(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3382
3383
3384
  	} else {
  		STATS_INC_FREEMISS(cachep);
  		cache_flusharray(cachep, ac);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3385
  	}
42c8c99cd   Zhao Jin   slab, cleanup: re...
3386

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
  	if (sk_memalloc_socks()) {
  		struct page *page = virt_to_head_page(objp);
  
  		if (unlikely(PageSlabPfmemalloc(page))) {
  			cache_free_pfmemalloc(cachep, page, objp);
  			return;
  		}
  	}
  
  	ac->entry[ac->avail++] = objp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
  }
  
  /**
   * 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.
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3407
  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3408
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3409
  	void *ret = slab_alloc(cachep, flags, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3410

505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3411
  	kasan_slab_alloc(cachep, ret, flags);
ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3412
  	trace_kmem_cache_alloc(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3413
  			       cachep->object_size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3414
3415
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3416
3417
  }
  EXPORT_SYMBOL(kmem_cache_alloc);
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3418
3419
3420
3421
3422
3423
3424
3425
3426
  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...
3427
  int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3428
  			  void **p)
484748f0b   Christoph Lameter   slab: infrastruct...
3429
  {
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
  	size_t i;
  
  	s = slab_pre_alloc_hook(s, flags);
  	if (!s)
  		return 0;
  
  	cache_alloc_debugcheck_before(s, flags);
  
  	local_irq_disable();
  	for (i = 0; i < size; i++) {
  		void *objp = __do_cache_alloc(s, flags);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3441
3442
3443
3444
3445
  		if (unlikely(!objp))
  			goto error;
  		p[i] = objp;
  	}
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3446
  	cache_alloc_debugcheck_after_bulk(s, flags, size, p, _RET_IP_);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
  	/* Clear memory outside IRQ disabled section */
  	if (unlikely(flags & __GFP_ZERO))
  		for (i = 0; i < size; i++)
  			memset(p[i], 0, s->object_size);
  
  	slab_post_alloc_hook(s, flags, size, p);
  	/* FIXME: Trace call missing. Christoph would like a bulk variant */
  	return size;
  error:
  	local_irq_enable();
7b0501dd6   Jesper Dangaard Brouer   slab: avoid runni...
3457
  	cache_alloc_debugcheck_after_bulk(s, flags, i, p, _RET_IP_);
2a777eac1   Jesper Dangaard Brouer   slab: implement b...
3458
3459
3460
  	slab_post_alloc_hook(s, flags, i, p);
  	__kmem_cache_free_bulk(s, i, p);
  	return 0;
484748f0b   Christoph Lameter   slab: infrastruct...
3461
3462
  }
  EXPORT_SYMBOL(kmem_cache_alloc_bulk);
0f24f1287   Li Zefan   tracing, slab: De...
3463
  #ifdef CONFIG_TRACING
85beb5869   Steven Rostedt   tracing/slab: Mov...
3464
  void *
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3465
  kmem_cache_alloc_trace(struct kmem_cache *cachep, gfp_t flags, size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3466
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3467
  	void *ret;
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3468
  	ret = slab_alloc(cachep, flags, _RET_IP_);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3469

505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3470
  	kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3471
  	trace_kmalloc(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3472
  		      size, cachep->size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3473
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3474
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3475
  EXPORT_SYMBOL(kmem_cache_alloc_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3476
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3477
  #ifdef CONFIG_NUMA
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
  /**
   * 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.
   */
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3489
3490
  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3491
  	void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3492

505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3493
  	kasan_slab_alloc(cachep, ret, flags);
ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3494
  	trace_kmem_cache_alloc_node(_RET_IP_, ret,
8c138bc00   Christoph Lameter   slab: Get rid of ...
3495
  				    cachep->object_size, cachep->size,
ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3496
  				    flags, nodeid);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3497
3498
  
  	return ret;
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3499
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3500
  EXPORT_SYMBOL(kmem_cache_alloc_node);
0f24f1287   Li Zefan   tracing, slab: De...
3501
  #ifdef CONFIG_TRACING
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3502
  void *kmem_cache_alloc_node_trace(struct kmem_cache *cachep,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3503
  				  gfp_t flags,
4052147c0   Ezequiel Garcia   mm, slab: Match S...
3504
3505
  				  int nodeid,
  				  size_t size)
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3506
  {
85beb5869   Steven Rostedt   tracing/slab: Mov...
3507
  	void *ret;
592f41450   Ezequiel Garcia   mm/slab: Fix typo...
3508
  	ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3509
3510
  
  	kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3511
  	trace_kmalloc_node(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3512
  			   size, cachep->size,
85beb5869   Steven Rostedt   tracing/slab: Mov...
3513
3514
  			   flags, nodeid);
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3515
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3516
  EXPORT_SYMBOL(kmem_cache_alloc_node_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3517
  #endif
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3518
  static __always_inline void *
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3519
  __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3520
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3521
  	struct kmem_cache *cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3522
  	void *ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3523

2c59dd654   Christoph Lameter   slab: Common Kmal...
3524
  	cachep = kmalloc_slab(size, flags);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3525
3526
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3527
  	ret = kmem_cache_alloc_node_trace(cachep, flags, node, size);
505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3528
  	kasan_kmalloc(cachep, ret, size, flags);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3529
3530
  
  	return ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3531
  }
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3532

8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3533
3534
  void *__kmalloc_node(size_t size, gfp_t flags, int node)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3535
  	return __do_kmalloc_node(size, flags, node, _RET_IP_);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3536
  }
dbe5e69d2   Christoph Hellwig   [PATCH] slab: opt...
3537
  EXPORT_SYMBOL(__kmalloc_node);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3538
3539
  
  void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3540
  		int node, unsigned long caller)
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3541
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3542
  	return __do_kmalloc_node(size, flags, node, caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3543
3544
  }
  EXPORT_SYMBOL(__kmalloc_node_track_caller);
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3545
  #endif /* CONFIG_NUMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3546
3547
  
  /**
800590f52   Paul Drynoff   [PATCH] slab: kma...
3548
   * __do_kmalloc - allocate memory
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3549
   * @size: how many bytes of memory are required.
800590f52   Paul Drynoff   [PATCH] slab: kma...
3550
   * @flags: the type of memory to allocate (see kmalloc).
911851e6e   Randy Dunlap   [PATCH] slab: fix...
3551
   * @caller: function caller for debug tracking of the caller
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3552
   */
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3553
  static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3554
  					  unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3555
  {
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3556
  	struct kmem_cache *cachep;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3557
  	void *ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3558

2c59dd654   Christoph Lameter   slab: Common Kmal...
3559
  	cachep = kmalloc_slab(size, flags);
a5c96d8a1   Linus Torvalds   Fix up non-NUMA S...
3560
3561
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3562
  	ret = slab_alloc(cachep, flags, caller);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3563

505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3564
  	kasan_kmalloc(cachep, ret, size, flags);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3565
  	trace_kmalloc(caller, ret,
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3566
  		      size, cachep->size, flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3567
3568
  
  	return ret;
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3569
  }
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3570
3571
  void *__kmalloc(size_t size, gfp_t flags)
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3572
  	return __do_kmalloc(size, flags, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3573
3574
  }
  EXPORT_SYMBOL(__kmalloc);
ce71e27c6   Eduard - Gabriel Munteanu   SLUB: Replace __b...
3575
  void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller)
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3576
  {
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3577
  	return __do_kmalloc(size, flags, caller);
7fd6b1413   Pekka Enberg   [PATCH] slab: fix...
3578
3579
  }
  EXPORT_SYMBOL(__kmalloc_track_caller);
1d2c8eea6   Christoph Hellwig   [PATCH] slab: cle...
3580

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3581
3582
3583
3584
3585
3586
3587
3588
  /**
   * 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...
3589
  void kmem_cache_free(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3590
3591
  {
  	unsigned long flags;
b9ce5ef49   Glauber Costa   sl[au]b: always g...
3592
3593
3594
  	cachep = cache_from_obj(cachep, objp);
  	if (!cachep)
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3595
3596
  
  	local_irq_save(flags);
d97d476b1   Feng Tang   slab: Fix a typo ...
3597
  	debug_check_no_locks_freed(objp, cachep->object_size);
3ac7fe5a4   Thomas Gleixner   infrastructure to...
3598
  	if (!(cachep->flags & SLAB_DEBUG_OBJECTS))
8c138bc00   Christoph Lameter   slab: Get rid of ...
3599
  		debug_check_no_obj_freed(objp, cachep->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3600
  	__cache_free(cachep, objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3601
  	local_irq_restore(flags);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3602

ca2b84cb3   Eduard - Gabriel Munteanu   kmemtrace: use tr...
3603
  	trace_kmem_cache_free(_RET_IP_, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3604
3605
  }
  EXPORT_SYMBOL(kmem_cache_free);
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3606
3607
3608
3609
3610
3611
3612
3613
  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...
3614
3615
3616
3617
  		if (!orig_s) /* called via kfree_bulk */
  			s = virt_to_cache(objp);
  		else
  			s = cache_from_obj(orig_s, objp);
e6cdb58d1   Jesper Dangaard Brouer   slab: implement b...
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
  
  		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
3630
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3631
3632
3633
   * kfree - free previously allocated memory
   * @objp: pointer returned by kmalloc.
   *
80e93effc   Pekka Enberg   [PATCH] update kf...
3634
3635
   * If @objp is NULL, no operation is performed.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3636
3637
3638
3639
3640
   * 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...
3641
  	struct kmem_cache *c;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3642
  	unsigned long flags;
2121db74b   Pekka Enberg   kmemtrace: trace ...
3643
  	trace_kfree(_RET_IP_, objp);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3644
  	if (unlikely(ZERO_OR_NULL_PTR(objp)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3645
3646
3647
  		return;
  	local_irq_save(flags);
  	kfree_debugcheck(objp);
6ed5eb221   Pekka Enberg   [PATCH] slab: ext...
3648
  	c = virt_to_cache(objp);
8c138bc00   Christoph Lameter   slab: Get rid of ...
3649
3650
3651
  	debug_check_no_locks_freed(objp, c->object_size);
  
  	debug_check_no_obj_freed(objp, c->object_size);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3652
  	__cache_free(c, (void *)objp, _RET_IP_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3653
3654
3655
  	local_irq_restore(flags);
  }
  EXPORT_SYMBOL(kfree);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3656
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3657
   * This initializes kmem_cache_node or resizes various caches for all nodes.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3658
   */
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3659
  static int setup_kmem_cache_nodes(struct kmem_cache *cachep, gfp_t gfp)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3660
  {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3661
  	int ret;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3662
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3663
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3664

9c09a95cf   Mel Gorman   slab: partially r...
3665
  	for_each_online_node(node) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3666
3667
  		ret = setup_kmem_cache_node(cachep, node, gfp, true);
  		if (ret)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3668
  			goto fail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3669
  	}
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3670

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3673
  fail:
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3674
  	if (!cachep->list.next) {
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3675
3676
3677
  		/* Cache is not active yet. Roll back what we did */
  		node--;
  		while (node >= 0) {
18bf85411   Christoph Lameter   slab: use get_nod...
3678
3679
  			n = get_node(cachep, node);
  			if (n) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
3680
3681
3682
  				kfree(n->shared);
  				free_alien_cache(n->alien);
  				kfree(n);
6a67368c3   Christoph Lameter   slab: Rename node...
3683
  				cachep->node[node] = NULL;
0718dc2a8   Christoph Lameter   [PATCH] slab: fix...
3684
3685
3686
3687
  			}
  			node--;
  		}
  	}
cafeb02e0   Christoph Lameter   [PATCH] alloc_kme...
3688
  	return -ENOMEM;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3689
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3690
  /* Always called with the slab_mutex held */
943a451a8   Glauber Costa   slab: propagate t...
3691
  static int __do_tune_cpucache(struct kmem_cache *cachep, int limit,
83b519e8b   Pekka Enberg   slab: setup alloc...
3692
  				int batchcount, int shared, gfp_t gfp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3693
  {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3694
3695
  	struct array_cache __percpu *cpu_cache, *prev;
  	int cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3696

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3697
3698
  	cpu_cache = alloc_kmem_cache_cpus(cachep, limit, batchcount);
  	if (!cpu_cache)
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
3699
  		return -ENOMEM;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3700
3701
  	prev = cachep->cpu_cache;
  	cachep->cpu_cache = cpu_cache;
a87c75fbc   Greg Thelen   slab: avoid IPIs ...
3702
3703
3704
3705
3706
3707
  	/*
  	 * 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...
3708

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3709
  	check_irq_on();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3710
3711
  	cachep->batchcount = batchcount;
  	cachep->limit = limit;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3712
  	cachep->shared = shared;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3713

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3714
  	if (!prev)
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3715
  		goto setup_node;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3716
3717
  
  	for_each_online_cpu(cpu) {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3718
  		LIST_HEAD(list);
18bf85411   Christoph Lameter   slab: use get_nod...
3719
3720
  		int node;
  		struct kmem_cache_node *n;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3721
  		struct array_cache *ac = per_cpu_ptr(prev, cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3722

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3723
  		node = cpu_to_mem(cpu);
18bf85411   Christoph Lameter   slab: use get_nod...
3724
3725
  		n = get_node(cachep, node);
  		spin_lock_irq(&n->list_lock);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3726
  		free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
3727
  		spin_unlock_irq(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
3728
  		slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3729
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3730
  	free_percpu(prev);
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3731
3732
  setup_node:
  	return setup_kmem_cache_nodes(cachep, gfp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3733
  }
943a451a8   Glauber Costa   slab: propagate t...
3734
3735
3736
3737
  static int do_tune_cpucache(struct kmem_cache *cachep, int limit,
  				int batchcount, int shared, gfp_t gfp)
  {
  	int ret;
426589f57   Vladimir Davydov   slab: link memcg ...
3738
  	struct kmem_cache *c;
943a451a8   Glauber Costa   slab: propagate t...
3739
3740
3741
3742
3743
3744
3745
3746
  
  	ret = __do_tune_cpucache(cachep, limit, batchcount, shared, gfp);
  
  	if (slab_state < FULL)
  		return ret;
  
  	if ((ret < 0) || !is_root_cache(cachep))
  		return ret;
426589f57   Vladimir Davydov   slab: link memcg ...
3747
3748
3749
3750
  	lockdep_assert_held(&slab_mutex);
  	for_each_memcg_cache(c, cachep) {
  		/* return value determined by the root cache only */
  		__do_tune_cpucache(c, limit, batchcount, shared, gfp);
943a451a8   Glauber Costa   slab: propagate t...
3751
3752
3753
3754
  	}
  
  	return ret;
  }
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3755
  /* Called with slab_mutex held always */
83b519e8b   Pekka Enberg   slab: setup alloc...
3756
  static int enable_cpucache(struct kmem_cache *cachep, gfp_t gfp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3757
3758
  {
  	int err;
943a451a8   Glauber Costa   slab: propagate t...
3759
3760
3761
  	int limit = 0;
  	int shared = 0;
  	int batchcount = 0;
7c00fce98   Thomas Garnier   mm: reorganize SL...
3762
  	err = cache_random_seq_create(cachep, cachep->num, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3763
3764
  	if (err)
  		goto end;
943a451a8   Glauber Costa   slab: propagate t...
3765
3766
3767
3768
3769
3770
  	if (!is_root_cache(cachep)) {
  		struct kmem_cache *root = memcg_root_cache(cachep);
  		limit = root->limit;
  		shared = root->shared;
  		batchcount = root->batchcount;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3771

943a451a8   Glauber Costa   slab: propagate t...
3772
3773
  	if (limit && shared && batchcount)
  		goto skip_setup;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3774
3775
  	/*
  	 * The head array serves three purposes:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3776
3777
  	 * - create a LIFO ordering, i.e. return objects that are cache-warm
  	 * - reduce the number of spinlock operations.
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3778
  	 * - reduce the number of linked list operations on the slab and
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3779
3780
3781
3782
  	 *   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...
3783
  	if (cachep->size > 131072)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3784
  		limit = 1;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3785
  	else if (cachep->size > PAGE_SIZE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3786
  		limit = 8;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3787
  	else if (cachep->size > 1024)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3788
  		limit = 24;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
3789
  	else if (cachep->size > 256)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3790
3791
3792
  		limit = 54;
  	else
  		limit = 120;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3793
3794
  	/*
  	 * CPU bound tasks (e.g. network routing) can exhibit cpu bound
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3795
3796
3797
3798
3799
3800
3801
3802
  	 * 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...
3803
  	if (cachep->size <= PAGE_SIZE && num_possible_cpus() > 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3804
  		shared = 8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3805
3806
  
  #if DEBUG
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3807
3808
3809
  	/*
  	 * 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
3810
3811
3812
3813
  	 */
  	if (limit > 32)
  		limit = 32;
  #endif
943a451a8   Glauber Costa   slab: propagate t...
3814
3815
3816
  	batchcount = (limit + 1) / 2;
  skip_setup:
  	err = do_tune_cpucache(cachep, limit, batchcount, shared, gfp);
c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
3817
  end:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3818
  	if (err)
1170532bb   Joe Perches   mm: convert print...
3819
3820
  		pr_err("enable_cpucache failed for %s, error %d
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3821
  		       cachep->name, -err);
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
3822
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3823
  }
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3824
  /*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3825
3826
   * 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...
3827
   * if drain_array() is used on the shared array.
1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3828
   */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3829
  static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n,
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3830
  			 struct array_cache *ac, int node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3831
  {
97654dfa2   Joonsoo Kim   slab: defer slab_...
3832
  	LIST_HEAD(list);
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3833
3834
3835
  
  	/* 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
3836

1b55253a7   Christoph Lameter   [PATCH] slab: rem...
3837
3838
  	if (!ac || !ac->avail)
  		return;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3839
3840
  
  	if (ac->touched) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3841
  		ac->touched = 0;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3842
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3843
  	}
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
3844
3845
3846
3847
3848
3849
  
  	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
3850
3851
3852
3853
  }
  
  /**
   * cache_reap - Reclaim memory from caches.
05fb6bf0b   Randy Dunlap   [PATCH] kernel-do...
3854
   * @w: work descriptor
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3855
3856
3857
3858
3859
3860
   *
   * 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
3861
3862
   * 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
3863
   */
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3864
  static void cache_reap(struct work_struct *w)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3865
  {
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
3866
  	struct kmem_cache *searchp;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3867
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3868
  	int node = numa_mem_id();
bf6aede71   Jean Delvare   workqueue: add to...
3869
  	struct delayed_work *work = to_delayed_work(w);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3870

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

18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3875
  	list_for_each_entry(searchp, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3876
  		check_irq_on();
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3877
  		/*
ce8eb6c42   Christoph Lameter   slab: Rename list...
3878
  		 * We only take the node lock if absolutely necessary and we
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3879
3880
3881
  		 * have established with reasonable certainty that
  		 * we can do some work if the lock was obtained.
  		 */
18bf85411   Christoph Lameter   slab: use get_nod...
3882
  		n = get_node(searchp, node);
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3883

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

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

35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3888
3889
3890
3891
  		/*
  		 * These are racy checks but it does not matter
  		 * if we skip one check or scan twice.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
3892
  		if (time_after(n->next_reap, jiffies))
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3893
  			goto next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3894

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
3899
3900
  		if (n->free_touched)
  			n->free_touched = 0;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3901
3902
  		else {
  			int freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3903

ce8eb6c42   Christoph Lameter   slab: Rename list...
3904
  			freed = drain_freelist(searchp, n, (n->free_limit +
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3905
3906
3907
  				5 * searchp->num - 1) / (5 * searchp->num));
  			STATS_ADD_REAPED(searchp, freed);
  		}
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3908
  next:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3909
3910
3911
  		cond_resched();
  	}
  	check_irq_on();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3912
  	mutex_unlock(&slab_mutex);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
3913
  	next_reap_node();
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3914
  out:
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3915
  	/* Set up the next iteration */
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3916
  	schedule_delayed_work(work, round_jiffies_relative(REAPTIMEOUT_AC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3917
  }
158a96242   Linus Torvalds   Unify /proc/slabi...
3918
  #ifdef CONFIG_SLABINFO
0d7561c61   Glauber Costa   sl[au]b: Process ...
3919
  void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3920
  {
f728b0a5d   Greg Thelen   mm, slab: faster ...
3921
  	unsigned long active_objs, num_objs, active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3922
3923
  	unsigned long total_slabs = 0, free_objs = 0, shared_avail = 0;
  	unsigned long free_slabs = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3924
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3925
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3926

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

bf00bd345   David Rientjes   mm, slab: maintai...
3931
3932
  		total_slabs += n->total_slabs;
  		free_slabs += n->free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3933
  		free_objs += n->free_objects;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3934

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
3938
  		spin_unlock_irq(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3939
  	}
bf00bd345   David Rientjes   mm, slab: maintai...
3940
3941
  	num_objs = total_slabs * cachep->num;
  	active_slabs = total_slabs - free_slabs;
f728b0a5d   Greg Thelen   mm, slab: faster ...
3942
  	active_objs = num_objs - free_objs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3943

0d7561c61   Glauber Costa   sl[au]b: Process ...
3944
3945
3946
  	sinfo->active_objs = active_objs;
  	sinfo->num_objs = num_objs;
  	sinfo->active_slabs = active_slabs;
bf00bd345   David Rientjes   mm, slab: maintai...
3947
  	sinfo->num_slabs = total_slabs;
0d7561c61   Glauber Costa   sl[au]b: Process ...
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
  	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
3958
  #if STATS
ce8eb6c42   Christoph Lameter   slab: Rename list...
3959
  	{			/* node stats */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3960
3961
3962
3963
3964
3965
  		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
3966
  		unsigned long node_allocs = cachep->node_allocs;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3967
  		unsigned long node_frees = cachep->node_frees;
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
3968
  		unsigned long overflows = cachep->node_overflow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3969

756a025f0   Joe Perches   mm: coalesce spli...
3970
  		seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu %4lu %4lu %4lu %4lu %4lu",
e92dd4fd1   Joe Perches   slab: Fix continu...
3971
3972
3973
  			   allocs, high, grown,
  			   reaped, errors, max_freeable, node_allocs,
  			   node_frees, overflows);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3974
3975
3976
3977
3978
3979
3980
3981
3982
  	}
  	/* 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...
3983
  			   allochit, allocmiss, freehit, freemiss);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3984
3985
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3986
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3987
3988
3989
3990
3991
3992
3993
3994
  #define MAX_SLABINFO_WRITE 128
  /**
   * slabinfo_write - Tuning for the slab allocator
   * @file: unused
   * @buffer: user buffer
   * @count: data length
   * @ppos: unused
   */
b7454ad3c   Glauber Costa   mm/sl[au]b: Move ...
3995
  ssize_t slabinfo_write(struct file *file, const char __user *buffer,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3996
  		       size_t count, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3997
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3998
  	char kbuf[MAX_SLABINFO_WRITE + 1], *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3999
  	int limit, batchcount, shared, res;
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
4000
  	struct kmem_cache *cachep;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4001

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4002
4003
4004
4005
  	if (count > MAX_SLABINFO_WRITE)
  		return -EINVAL;
  	if (copy_from_user(&kbuf, buffer, count))
  		return -EFAULT;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4006
  	kbuf[MAX_SLABINFO_WRITE] = '\0';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
  
  	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...
4017
  	mutex_lock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4018
  	res = -EINVAL;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4019
  	list_for_each_entry(cachep, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4020
  		if (!strcmp(cachep->name, kbuf)) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
4021
4022
  			if (limit < 1 || batchcount < 1 ||
  					batchcount > limit || shared < 0) {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
4023
  				res = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4024
  			} else {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
4025
  				res = do_tune_cpucache(cachep, limit,
83b519e8b   Pekka Enberg   slab: setup alloc...
4026
4027
  						       batchcount, shared,
  						       GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4028
4029
4030
4031
  			}
  			break;
  		}
  	}
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4032
  	mutex_unlock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4033
4034
4035
4036
  	if (res >= 0)
  		res = count;
  	return res;
  }
871751e25   Al Viro   [PATCH] slab: imp...
4037
4038
  
  #ifdef CONFIG_DEBUG_SLAB_LEAK
871751e25   Al Viro   [PATCH] slab: imp...
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
  static inline int add_caller(unsigned long *n, unsigned long v)
  {
  	unsigned long *p;
  	int l;
  	if (!v)
  		return 1;
  	l = n[1];
  	p = n + 2;
  	while (l) {
  		int i = l/2;
  		unsigned long *q = p + 2 * i;
  		if (*q == v) {
  			q[1]++;
  			return 1;
  		}
  		if (*q > v) {
  			l = i;
  		} else {
  			p = q + 2;
  			l -= i + 1;
  		}
  	}
  	if (++n[1] == n[0])
  		return 0;
  	memmove(p + 2, p, n[1] * 2 * sizeof(unsigned long) - ((void *)p - (void *)n));
  	p[0] = v;
  	p[1] = 1;
  	return 1;
  }
8456a648c   Joonsoo Kim   slab: use struct ...
4068
4069
  static void handle_slab(unsigned long *n, struct kmem_cache *c,
  						struct page *page)
871751e25   Al Viro   [PATCH] slab: imp...
4070
4071
  {
  	void *p;
d31676dfd   Joonsoo Kim   mm/slab: alternat...
4072
4073
  	int i, j;
  	unsigned long v;
b1cb0982b   Joonsoo Kim   slab: change the ...
4074

871751e25   Al Viro   [PATCH] slab: imp...
4075
4076
  	if (n[0] == n[1])
  		return;
8456a648c   Joonsoo Kim   slab: use struct ...
4077
  	for (i = 0, p = page->s_mem; i < c->num; i++, p += c->size) {
d31676dfd   Joonsoo Kim   mm/slab: alternat...
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
  		bool active = true;
  
  		for (j = page->active; j < c->num; j++) {
  			if (get_free_obj(page, j) == i) {
  				active = false;
  				break;
  			}
  		}
  
  		if (!active)
871751e25   Al Viro   [PATCH] slab: imp...
4088
  			continue;
b1cb0982b   Joonsoo Kim   slab: change the ...
4089

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
  		/*
  		 * probe_kernel_read() is used for DEBUG_PAGEALLOC. page table
  		 * mapping is established when actual object allocation and
  		 * we could mistakenly access the unmapped object in the cpu
  		 * cache.
  		 */
  		if (probe_kernel_read(&v, dbg_userword(c, p), sizeof(v)))
  			continue;
  
  		if (!add_caller(n, v))
871751e25   Al Viro   [PATCH] slab: imp...
4100
4101
4102
4103
4104
4105
4106
  			return;
  	}
  }
  
  static void show_symbol(struct seq_file *m, unsigned long address)
  {
  #ifdef CONFIG_KALLSYMS
871751e25   Al Viro   [PATCH] slab: imp...
4107
  	unsigned long offset, size;
9281acea6   Tejun Heo   kallsyms: make KS...
4108
  	char modname[MODULE_NAME_LEN], name[KSYM_NAME_LEN];
871751e25   Al Viro   [PATCH] slab: imp...
4109

a5c43dae7   Alexey Dobriyan   Fix race between ...
4110
  	if (lookup_symbol_attrs(address, &size, &offset, modname, name) == 0) {
871751e25   Al Viro   [PATCH] slab: imp...
4111
  		seq_printf(m, "%s+%#lx/%#lx", name, offset, size);
a5c43dae7   Alexey Dobriyan   Fix race between ...
4112
  		if (modname[0])
871751e25   Al Viro   [PATCH] slab: imp...
4113
4114
4115
4116
4117
4118
4119
4120
4121
  			seq_printf(m, " [%s]", modname);
  		return;
  	}
  #endif
  	seq_printf(m, "%p", (void *)address);
  }
  
  static int leaks_show(struct seq_file *m, void *p)
  {
0672aa7c2   Thierry Reding   mm, slab: Build f...
4122
  	struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
8456a648c   Joonsoo Kim   slab: use struct ...
4123
  	struct page *page;
ce8eb6c42   Christoph Lameter   slab: Rename list...
4124
  	struct kmem_cache_node *n;
871751e25   Al Viro   [PATCH] slab: imp...
4125
  	const char *name;
db8450673   Christoph Lameter   slab: Fixup CONFI...
4126
  	unsigned long *x = m->private;
871751e25   Al Viro   [PATCH] slab: imp...
4127
4128
4129
4130
4131
4132
4133
  	int node;
  	int i;
  
  	if (!(cachep->flags & SLAB_STORE_USER))
  		return 0;
  	if (!(cachep->flags & SLAB_RED_ZONE))
  		return 0;
d31676dfd   Joonsoo Kim   mm/slab: alternat...
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
  	/*
  	 * Set store_user_clean and start to grab stored user information
  	 * for all objects on this cache. If some alloc/free requests comes
  	 * during the processing, information would be wrong so restart
  	 * whole processing.
  	 */
  	do {
  		set_store_user_clean(cachep);
  		drain_cpu_caches(cachep);
  
  		x[1] = 0;
871751e25   Al Viro   [PATCH] slab: imp...
4145

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4146
  		for_each_kmem_cache_node(cachep, node, n) {
871751e25   Al Viro   [PATCH] slab: imp...
4147

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4148
4149
  			check_irq_on();
  			spin_lock_irq(&n->list_lock);
871751e25   Al Viro   [PATCH] slab: imp...
4150

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4151
4152
4153
4154
4155
4156
4157
  			list_for_each_entry(page, &n->slabs_full, lru)
  				handle_slab(x, cachep, page);
  			list_for_each_entry(page, &n->slabs_partial, lru)
  				handle_slab(x, cachep, page);
  			spin_unlock_irq(&n->list_lock);
  		}
  	} while (!is_store_user_clean(cachep));
871751e25   Al Viro   [PATCH] slab: imp...
4158

871751e25   Al Viro   [PATCH] slab: imp...
4159
  	name = cachep->name;
db8450673   Christoph Lameter   slab: Fixup CONFI...
4160
  	if (x[0] == x[1]) {
871751e25   Al Viro   [PATCH] slab: imp...
4161
  		/* Increase the buffer size */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4162
  		mutex_unlock(&slab_mutex);
db8450673   Christoph Lameter   slab: Fixup CONFI...
4163
  		m->private = kzalloc(x[0] * 4 * sizeof(unsigned long), GFP_KERNEL);
871751e25   Al Viro   [PATCH] slab: imp...
4164
4165
  		if (!m->private) {
  			/* Too bad, we are really out */
db8450673   Christoph Lameter   slab: Fixup CONFI...
4166
  			m->private = x;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4167
  			mutex_lock(&slab_mutex);
871751e25   Al Viro   [PATCH] slab: imp...
4168
4169
  			return -ENOMEM;
  		}
db8450673   Christoph Lameter   slab: Fixup CONFI...
4170
4171
  		*(unsigned long *)m->private = x[0] * 2;
  		kfree(x);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4172
  		mutex_lock(&slab_mutex);
871751e25   Al Viro   [PATCH] slab: imp...
4173
4174
4175
4176
  		/* Now make sure this entry will be retried */
  		m->count = m->size;
  		return 0;
  	}
db8450673   Christoph Lameter   slab: Fixup CONFI...
4177
4178
4179
  	for (i = 0; i < x[1]; i++) {
  		seq_printf(m, "%s: %lu ", name, x[2*i+3]);
  		show_symbol(m, x[2*i+2]);
871751e25   Al Viro   [PATCH] slab: imp...
4180
4181
4182
  		seq_putc(m, '
  ');
  	}
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
4183

871751e25   Al Viro   [PATCH] slab: imp...
4184
4185
  	return 0;
  }
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4186
  static const struct seq_operations slabstats_op = {
1df3b26f2   Vladimir Davydov   slab: print slabi...
4187
  	.start = slab_start,
276a2439c   Wanpeng Li   mm/slab: Give s_n...
4188
4189
  	.next = slab_next,
  	.stop = slab_stop,
871751e25   Al Viro   [PATCH] slab: imp...
4190
4191
  	.show = leaks_show,
  };
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4192
4193
4194
  
  static int slabstats_open(struct inode *inode, struct file *file)
  {
b208ce329   Rob Jones   mm/slab.c: use __...
4195
4196
4197
4198
4199
4200
4201
4202
4203
  	unsigned long *n;
  
  	n = __seq_open_private(file, &slabstats_op, PAGE_SIZE);
  	if (!n)
  		return -ENOMEM;
  
  	*n = PAGE_SIZE / (2 * sizeof(unsigned long));
  
  	return 0;
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
  }
  
  static const struct file_operations proc_slabstats_operations = {
  	.open		= slabstats_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= seq_release_private,
  };
  #endif
  
  static int __init slab_proc_init(void)
  {
  #ifdef CONFIG_DEBUG_SLAB_LEAK
  	proc_create("slab_allocators", 0, NULL, &proc_slabstats_operations);
871751e25   Al Viro   [PATCH] slab: imp...
4218
  #endif
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4219
4220
4221
  	return 0;
  }
  module_init(slab_proc_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4222
  #endif
04385fc5e   Kees Cook   mm: SLAB hardened...
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
  #ifdef CONFIG_HARDENED_USERCOPY
  /*
   * Rejects objects that are incorrectly sized.
   *
   * Returns NULL if check passes, otherwise const char * to name of cache
   * to indicate an error.
   */
  const char *__check_heap_object(const void *ptr, unsigned long n,
  				struct page *page)
  {
  	struct kmem_cache *cachep;
  	unsigned int objnr;
  	unsigned long offset;
  
  	/* Find and validate object. */
  	cachep = page->slab_cache;
  	objnr = obj_to_index(cachep, page, (void *)ptr);
  	BUG_ON(objnr >= cachep->num);
  
  	/* Find offset within object. */
  	offset = ptr - index_to_obj(cachep, page, objnr) - obj_offset(cachep);
  
  	/* Allow address range falling entirely within object size. */
  	if (offset <= cachep->object_size && n <= cachep->object_size - offset)
  		return NULL;
  
  	return cachep->name;
  }
  #endif /* CONFIG_HARDENED_USERCOPY */
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
  /**
   * ksize - get the actual amount of memory allocated for a given object
   * @objp: Pointer to the object
   *
   * kmalloc may internally round up allocations and return more memory
   * than requested. ksize() can be used to determine the actual amount of
   * memory allocated. The caller may use this additional memory, even though
   * a smaller amount of memory was initially specified with the kmalloc call.
   * The caller must guarantee that objp points to a valid object previously
   * allocated with either kmalloc() or kmem_cache_alloc(). The object
   * must not be freed during the duration of the call.
   */
fd76bab2f   Pekka Enberg   slab: introduce k...
4264
  size_t ksize(const void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4265
  {
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4266
  	size_t size;
ef8b4520b   Christoph Lameter   Slab allocators: ...
4267
4268
  	BUG_ON(!objp);
  	if (unlikely(objp == ZERO_SIZE_PTR))
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4269
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4270

7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4271
4272
4273
4274
  	size = virt_to_cache(objp)->object_size;
  	/* We assume that ksize callers could use the whole allocated area,
  	 * so we need to unpoison this area.
  	 */
4ebb31a42   Alexander Potapenko   mm, kasan: don't ...
4275
  	kasan_unpoison_shadow(objp, size);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4276
4277
  
  	return size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4278
  }
b1aabecd5   Kirill A. Shutemov   mm: Export symbol...
4279
  EXPORT_SYMBOL(ksize);