Blame view

mm/slab.c 111 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
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
  /*
   * 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/
29
   * slabs and you must pass objects with the same initializations to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
   * 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
53
   * The c_cpuarray may not be read with enabled local interrupts -
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
   * it's changed with a smp_call_function().
   *
   * SMP synchronization:
   *  constructors and destructors are called without any locking.
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
58
   *  Several members in struct kmem_cache and struct slab never change, they
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
65
66
67
68
69
70
   *	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...
71
   *	The global cache-chain is protected by the mutex 'slab_mutex'.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
75
76
77
   *	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...
78
79
80
81
82
83
84
85
86
   * 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
87
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
  #include	<linux/slab.h>
  #include	<linux/mm.h>
c9cf55285   Randy Dunlap   [PATCH] add poiso...
90
  #include	<linux/poison.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
  #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...
96
  #include	<linux/cpuset.h>
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
97
  #include	<linux/proc_fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
101
102
103
104
  #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 ...
105
  #include	<linux/string.h>
138ae6631   Andrew Morton   [PATCH] slab: use...
106
  #include	<linux/uaccess.h>
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
107
  #include	<linux/nodemask.h>
d5cff6352   Catalin Marinas   kmemleak: Add the...
108
  #include	<linux/kmemleak.h>
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
109
  #include	<linux/mempolicy.h>
fc0abb145   Ingo Molnar   [PATCH] sem2mutex...
110
  #include	<linux/mutex.h>
8a8b6502f   Akinobu Mita   [PATCH] fault-inj...
111
  #include	<linux/fault-inject.h>
e7eebaf6a   Ingo Molnar   [PATCH] pi-futex:...
112
  #include	<linux/rtmutex.h>
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
113
  #include	<linux/reciprocal_div.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
114
  #include	<linux/debugobjects.h>
c175eea46   Pekka Enberg   slab: add hooks f...
115
  #include	<linux/kmemcheck.h>
8f9f8d9e8   David Rientjes   slab: add memory ...
116
  #include	<linux/memory.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
117
  #include	<linux/prefetch.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118

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

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

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

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

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

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

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
298
299
  /*
   * memory layout of objects:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
   * 0		: objp
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
301
   * 0 .. cachep->obj_offset - BYTES_PER_WORD - 1: padding. This ensures that
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
   * 		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...
304
   * cachep->obj_offset - BYTES_PER_WORD .. cachep->obj_offset - 1:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
   * 		redzone word.
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
306
   * cachep->obj_offset: The real object.
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
307
308
   * 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
309
   *					[BYTES_PER_WORD long]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
   */
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
311
  static int obj_offset(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
  {
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
313
  	return cachep->obj_offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  }
b46b8f19c   David Woodhouse   Increase slab red...
315
  static unsigned long long *dbg_redzone1(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
b46b8f19c   David Woodhouse   Increase slab red...
318
319
  	return (unsigned long long*) (objp + obj_offset(cachep) -
  				      sizeof(unsigned long long));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
  }
b46b8f19c   David Woodhouse   Increase slab red...
321
  static unsigned long long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
324
  {
  	BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
  	if (cachep->flags & SLAB_STORE_USER)
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
325
  		return (unsigned long long *)(objp + cachep->size -
b46b8f19c   David Woodhouse   Increase slab red...
326
  					      sizeof(unsigned long long) -
87a927c71   David Woodhouse   Fix slab redzone ...
327
  					      REDZONE_ALIGN);
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));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
331
  static void **dbg_userword(struct kmem_cache *cachep, void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
  {
  	BUG_ON(!(cachep->flags & SLAB_STORE_USER));
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
334
  	return (void **)(objp + cachep->size - BYTES_PER_WORD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
336
337
  }
  
  #else
3dafccf22   Manfred Spraul   [PATCH] slab: dis...
338
  #define obj_offset(x)			0
b46b8f19c   David Woodhouse   Increase slab red...
339
340
  #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
341
342
343
  #define dbg_userword(cachep, objp)	({BUG(); (void **)NULL;})
  
  #endif
037873014   Joonsoo Kim   slab: fix oops wh...
344
  #ifdef CONFIG_DEBUG_SLAB_LEAK
d31676dfd   Joonsoo Kim   mm/slab: alternat...
345
  static inline bool is_store_user_clean(struct kmem_cache *cachep)
037873014   Joonsoo Kim   slab: fix oops wh...
346
  {
d31676dfd   Joonsoo Kim   mm/slab: alternat...
347
348
  	return atomic_read(&cachep->store_user_clean) == 1;
  }
037873014   Joonsoo Kim   slab: fix oops wh...
349

d31676dfd   Joonsoo Kim   mm/slab: alternat...
350
351
352
353
  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...
354

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

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

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

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

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

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

0edaf86cf   Andrew Morton   include/linux/nod...
506
  	node = next_node_in(node, node_online_map);
909ea9646   Christoph Lameter   core: Replace __g...
507
  	__this_cpu_write(slab_reap_node, node);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
508
509
510
511
512
513
  }
  
  #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
514
515
516
517
518
519
520
  /*
   * 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 __...
521
  static void start_cpu_timer(int cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
  {
1871e52c7   Tejun Heo   percpu: make perc...
523
  	struct delayed_work *reap_work = &per_cpu(slab_reap_work, cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524
525
526
527
528
529
  
  	/*
  	 * When this gets called from do_initcalls via cpucache_init(),
  	 * init_workqueues() has already run, so keventd will be setup
  	 * at that time.
  	 */
52bad64d9   David Howells   WorkStruct: Separ...
530
  	if (keventd_up() && reap_work->work.func == NULL) {
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
531
  		init_reap_node(cpu);
203b42f73   Tejun Heo   workqueue: make d...
532
  		INIT_DEFERRABLE_WORK(reap_work, cache_reap);
2b2842146   Arjan van de Ven   [PATCH] user of t...
533
534
  		schedule_delayed_work_on(cpu, reap_work,
  					__round_jiffies_relative(HZ, cpu));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
  	}
  }
1fe00d50a   Joonsoo Kim   slab: factor out ...
537
  static void init_arraycache(struct array_cache *ac, int limit, int batch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
538
  {
d5cff6352   Catalin Marinas   kmemleak: Add the...
539
540
  	/*
  	 * The array_cache structures contain pointers to free object.
25985edce   Lucas De Marchi   Fix common misspe...
541
  	 * However, when such objects are allocated or transferred to another
d5cff6352   Catalin Marinas   kmemleak: Add the...
542
543
544
545
  	 * 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 ...
546
547
548
549
550
551
  	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
552
  	}
1fe00d50a   Joonsoo Kim   slab: factor out ...
553
554
555
556
557
  }
  
  static struct array_cache *alloc_arraycache(int node, int entries,
  					    int batchcount, gfp_t gfp)
  {
5e8047896   Joonsoo Kim   slab: change int ...
558
  	size_t memsize = sizeof(void *) * entries + sizeof(struct array_cache);
1fe00d50a   Joonsoo Kim   slab: factor out ...
559
560
561
562
563
  	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
564
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
565
566
  static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep,
  					struct page *page, void *objp)
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
567
  {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
568
569
570
  	struct kmem_cache_node *n;
  	int page_node;
  	LIST_HEAD(list);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
571

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

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

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

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

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

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

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

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

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

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

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

c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
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
915
916
  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...
917
918
919
920
921
922
  	/*
  	 * 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...
923
  	if (old_shared && force_change)
801faf0db   Joonsoo Kim   mm/slab: lockless...
924
  		synchronize_sched();
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
925
926
927
928
929
930
931
  fail:
  	kfree(old_shared);
  	kfree(new_shared);
  	free_alien_cache(new_alien);
  
  	return ret;
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
932
  #ifdef CONFIG_SMP
0db0628d9   Paul Gortmaker   kernel: delete __...
933
  static void cpuup_canceled(long cpu)
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
934
935
  {
  	struct kmem_cache *cachep;
ce8eb6c42   Christoph Lameter   slab: Rename list...
936
  	struct kmem_cache_node *n = NULL;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
937
  	int node = cpu_to_mem(cpu);
a70f73028   Rusty Russell   cpumask: replace ...
938
  	const struct cpumask *mask = cpumask_of_node(node);
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
939

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

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
952
953
  		/* Free limit for this kmem_cache_node */
  		n->free_limit -= cachep->batchcount;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
954
955
956
957
  
  		/* 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_...
958
  			free_block(cachep, nc->entry, nc->avail, node, &list);
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
959
960
  			nc->avail = 0;
  		}
fbf1e473b   Akinobu Mita   cpu hotplug: slab...
961

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

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

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

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

6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  	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:...
1056
  #endif
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1057
1058
1059
1060
1061
  
  static int slab_online_cpu(unsigned int cpu)
  {
  	start_cpu_timer(cpu);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1062
  }
6731d4f12   Sebastian Andrzej Siewior   slab: Convert to ...
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
  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
1076

8f9f8d9e8   David Rientjes   slab: add memory ...
1077
1078
1079
1080
1081
1082
  #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...
1083
   * Must hold slab_mutex.
8f9f8d9e8   David Rientjes   slab: add memory ...
1084
   */
6a67368c3   Christoph Lameter   slab: Rename node...
1085
  static int __meminit drain_cache_node_node(int node)
8f9f8d9e8   David Rientjes   slab: add memory ...
1086
1087
1088
  {
  	struct kmem_cache *cachep;
  	int ret = 0;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
1089
  	list_for_each_entry(cachep, &slab_caches, list) {
ce8eb6c42   Christoph Lameter   slab: Rename list...
1090
  		struct kmem_cache_node *n;
8f9f8d9e8   David Rientjes   slab: add memory ...
1091

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18bf85411   Christoph Lameter   slab: use get_nod...
1314
  	for_each_kmem_cache_node(cachep, node, n) {
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1315
1316
  		unsigned long active_objs = 0, num_objs = 0, free_objects = 0;
  		unsigned long active_slabs = 0, num_slabs = 0;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
1317
1318
  		unsigned long num_slabs_partial = 0, num_slabs_free = 0;
  		unsigned long num_slabs_full;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1319

ce8eb6c42   Christoph Lameter   slab: Rename list...
1320
  		spin_lock_irqsave(&n->list_lock, flags);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
1321
  		num_slabs = n->num_slabs;
8456a648c   Joonsoo Kim   slab: use struct ...
1322
1323
  		list_for_each_entry(page, &n->slabs_partial, lru) {
  			active_objs += page->active;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
1324
  			num_slabs_partial++;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1325
  		}
8456a648c   Joonsoo Kim   slab: use struct ...
1326
  		list_for_each_entry(page, &n->slabs_free, lru)
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
1327
  			num_slabs_free++;
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1328

ce8eb6c42   Christoph Lameter   slab: Rename list...
1329
1330
  		free_objects += n->free_objects;
  		spin_unlock_irqrestore(&n->list_lock, flags);
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1331

8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1332
  		num_objs = num_slabs * cachep->num;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
1333
1334
1335
1336
  		active_slabs = num_slabs - num_slabs_free;
  		num_slabs_full = num_slabs -
  			(num_slabs_partial + num_slabs_free);
  		active_objs += (num_slabs_full * cachep->num);
5b3810e5c   Vlastimil Babka   mm, sl[au]b: prin...
1337
1338
  		pr_warn("  node %d: slabs: %ld/%ld, objs: %ld/%ld, free: %ld
  ",
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1339
1340
1341
  			node, active_slabs, num_slabs, active_objs, num_objs,
  			free_objects);
  	}
9a02d6999   David Rientjes   mm, slab: suppres...
1342
  #endif
8bdec192b   Rafael Aquini   mm: SLAB Out-of-m...
1343
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1344
  /*
8a7d9b430   Wang Sheng-Hui   mm/slab.c: fix co...
1345
1346
   * Interface to system's page allocator. No need to hold the
   * kmem_cache_node ->list_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
1348
1349
1350
1351
   *
   * 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...
1352
1353
  static struct page *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
  								int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1354
1355
  {
  	struct page *page;
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1356
  	int nr_pages;
765c4507a   Christoph Lameter   [PATCH] GFP_THISN...
1357

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

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

f3ccb2c42   Vladimir Davydov   memcg: unify slab...
1368
1369
1370
1371
  	if (memcg_charge_slab(page, flags, cachep->gfporder, cachep)) {
  		__free_pages(page, cachep->gfporder);
  		return NULL;
  	}
e1b6aa6f1   Christoph Hellwig   [PATCH] slab: cle...
1372
  	nr_pages = (1 << cachep->gfporder);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
  	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
972d1a7b1   Christoph Lameter   [PATCH] ZVC: Supp...
1374
1375
1376
1377
1378
  		add_zone_page_state(page_zone(page),
  			NR_SLAB_RECLAIMABLE, nr_pages);
  	else
  		add_zone_page_state(page_zone(page),
  			NR_SLAB_UNRECLAIMABLE, nr_pages);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1379

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1380
  	__SetPageSlab(page);
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
1381
1382
  	/* 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...
1383
  		SetPageSlabPfmemalloc(page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
1384

b1eeab676   Vegard Nossum   kmemcheck: add ho...
1385
1386
1387
1388
1389
1390
1391
1392
  	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...
1393

0c3aa83e0   Joonsoo Kim   slab: change retu...
1394
  	return page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1395
1396
1397
1398
1399
  }
  
  /*
   * Interface to system's page release.
   */
0c3aa83e0   Joonsoo Kim   slab: change retu...
1400
  static void kmem_freepages(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1401
  {
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1402
1403
  	int order = cachep->gfporder;
  	unsigned long nr_freed = (1 << order);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1404

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

972d1a7b1   Christoph Lameter   [PATCH] ZVC: Supp...
1407
1408
1409
1410
1411
1412
  	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
  		sub_zone_page_state(page_zone(page),
  				NR_SLAB_RECLAIMABLE, nr_freed);
  	else
  		sub_zone_page_state(page_zone(page),
  				NR_SLAB_UNRECLAIMABLE, nr_freed);
73293c2f9   Joonsoo Kim   slab: correct pfm...
1413

a57a49887   Joonsoo Kim   slab: use __GFP_C...
1414
  	BUG_ON(!PageSlab(page));
73293c2f9   Joonsoo Kim   slab: correct pfm...
1415
  	__ClearPageSlabPfmemalloc(page);
a57a49887   Joonsoo Kim   slab: use __GFP_C...
1416
  	__ClearPageSlab(page);
8456a648c   Joonsoo Kim   slab: use struct ...
1417
1418
  	page_mapcount_reset(page);
  	page->mapping = NULL;
1f458cbf1   Glauber Costa   memcg: destroy me...
1419

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1420
1421
  	if (current->reclaim_state)
  		current->reclaim_state->reclaimed_slab += nr_freed;
27ee57c93   Vladimir Davydov   mm: memcontrol: r...
1422
1423
  	memcg_uncharge_slab(page, order, cachep);
  	__free_pages(page, order);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1424
1425
1426
1427
  }
  
  static void kmem_rcu_free(struct rcu_head *head)
  {
68126702b   Joonsoo Kim   slab: overloading...
1428
1429
  	struct kmem_cache *cachep;
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1430

68126702b   Joonsoo Kim   slab: overloading...
1431
1432
1433
1434
  	page = container_of(head, struct page, rcu_head);
  	cachep = page->slab_cache;
  
  	kmem_freepages(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435
1436
1437
  }
  
  #if DEBUG
40b441379   Joonsoo Kim   mm/slab: clean up...
1438
1439
1440
1441
1442
1443
1444
1445
  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
1446
1447
  
  #ifdef CONFIG_DEBUG_PAGEALLOC
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
1448
  static void store_stackinfo(struct kmem_cache *cachep, unsigned long *addr,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1449
  			    unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
  {
8c138bc00   Christoph Lameter   slab: Get rid of ...
1451
  	int size = cachep->object_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1452

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

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

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1575
  	for (i = 0; i < size; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1576
  		char exp = POISON_FREE;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1577
  		if (i == size - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1578
1579
1580
1581
1582
1583
  			exp = POISON_END;
  		if (realobj[i] != exp) {
  			int limit;
  			/* Mismatch ! */
  			/* Print header */
  			if (lines == 0) {
1170532bb   Joe Perches   mm: convert print...
1584
1585
1586
1587
  				pr_err("Slab corruption (%s): %s start=%p, len=%d
  ",
  				       print_tainted(), cachep->name,
  				       realobj, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1588
1589
1590
  				print_objinfo(cachep, objp, 0);
  			}
  			/* Hexdump the affected line */
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1591
  			i = (i / 16) * 16;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592
  			limit = 16;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1593
1594
  			if (i + limit > size)
  				limit = size - i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
  			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 ...
1607
  		struct page *page = virt_to_head_page(objp);
8fea4e96a   Pekka Enberg   [PATCH] slab: obj...
1608
  		unsigned int objnr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1609

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

8456a648c   Joonsoo Kim   slab: use struct ...
1672
1673
  	freelist = page->freelist;
  	slab_destroy_debugcheck(cachep, page);
bc4f610d5   Kirill A. Shutemov   slab, slub: use p...
1674
1675
1676
  	if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU))
  		call_rcu(&page->rcu_head, kmem_rcu_free);
  	else
0c3aa83e0   Joonsoo Kim   slab: change retu...
1677
  		kmem_freepages(cachep, page);
68126702b   Joonsoo Kim   slab: overloading...
1678
1679
  
  	/*
8456a648c   Joonsoo Kim   slab: use struct ...
1680
  	 * From now on, we don't use freelist
68126702b   Joonsoo Kim   slab: overloading...
1681
1682
1683
  	 * although actual page can be freed in rcu context
  	 */
  	if (OFF_SLAB(cachep))
8456a648c   Joonsoo Kim   slab: use struct ...
1684
  		kmem_cache_free(cachep->freelist_cache, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1685
  }
97654dfa2   Joonsoo Kim   slab: defer slab_...
1686
1687
1688
1689
1690
1691
1692
1693
1694
  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
1695
  /**
a70773ddb   Randy.Dunlap   [PATCH] mm/slab: ...
1696
1697
1698
   * 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: ...
1699
1700
1701
   * @flags: slab allocation flags
   *
   * Also calculates the number of objects per slab.
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1702
1703
1704
1705
1706
   *
   * 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
1707
  static size_t calculate_slab_order(struct kmem_cache *cachep,
2e6b36021   Joonsoo Kim   mm/slab: put the ...
1708
  				size_t size, unsigned long flags)
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1709
1710
  {
  	size_t left_over = 0;
9888e6fa7   Linus Torvalds   slab: clarify and...
1711
  	int gfporder;
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1712

0aa817f07   Christoph Lameter   Slab allocators: ...
1713
  	for (gfporder = 0; gfporder <= KMALLOC_MAX_ORDER; gfporder++) {
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1714
1715
  		unsigned int num;
  		size_t remainder;
70f75067b   Joonsoo Kim   mm/slab: avoid re...
1716
  		num = cache_estimate(gfporder, size, flags, &remainder);
4d268eba1   Pekka Enberg   [PATCH] slab: ext...
1717
1718
  		if (!num)
  			continue;
9888e6fa7   Linus Torvalds   slab: clarify and...
1719

f315e3fa1   Joonsoo Kim   slab: restrict th...
1720
1721
1722
  		/* 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...
1723
  		if (flags & CFLGS_OFF_SLAB) {
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1724
1725
1726
1727
1728
1729
1730
  			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...
1731
  			/*
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1732
  			 * Needed to avoid possible looping condition
76b342bdc   Joonsoo Kim   mm/slab: separate...
1733
  			 * in cache_grow_begin()
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1734
  			 */
3217fd9bd   Joonsoo Kim   mm/slab: make cri...
1735
1736
  			if (OFF_SLAB(freelist_cache))
  				continue;
b1ab41c49   Ingo Molnar   [PATCH] slab.c: f...
1737

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

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

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1795
1796
1797
  	cachep->cpu_cache = alloc_kmem_cache_cpus(cachep, 1, 1);
  	if (!cachep->cpu_cache)
  		return 1;
97d066091   Christoph Lameter   mm, sl[aou]b: Com...
1798
  	if (slab_state == DOWN) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1799
1800
  		/* Creation of first cache (kmem_cache). */
  		set_up_node(kmem_cache, CACHE_CACHE);
2f9baa9fc   Christoph Lameter   slab: Use the new...
1801
  	} else if (slab_state == PARTIAL) {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1802
1803
  		/* For kmem_cache_node */
  		set_up_node(cachep, SIZE_NODE);
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1804
  	} else {
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1805
  		int node;
f30cf7d13   Pekka Enberg   [PATCH] slab: ext...
1806

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1807
1808
1809
1810
1811
  		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...
1812
1813
  		}
  	}
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
1814

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1952
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1953
1954
1955
1956
1957
1958
1959
  #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 ...
1960
1961
  	if (size < 4096 || fls(size - 1) == fls(size-1 + REDZONE_ALIGN +
  						2 * sizeof(unsigned long long)))
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1962
  		flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1963
1964
1965
  	if (!(flags & SLAB_DESTROY_BY_RCU))
  		flags |= SLAB_POISON;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1966
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1967

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1968
1969
  	/*
  	 * Check that size is in terms of words.  This is needed to avoid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1970
1971
1972
  	 * unaligned accesses for some archs when redzoning is used, and makes
  	 * sure any on-slab bufctl's are also correctly aligned.
  	 */
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
1973
1974
1975
  	if (size & (BYTES_PER_WORD - 1)) {
  		size += (BYTES_PER_WORD - 1);
  		size &= ~(BYTES_PER_WORD - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1976
  	}
87a927c71   David Woodhouse   Fix slab redzone ...
1977
1978
1979
1980
1981
1982
1983
  	if (flags & SLAB_RED_ZONE) {
  		ralign = REDZONE_ALIGN;
  		/* If redzoning, ensure that the second redzone is suitably
  		 * aligned, by adjusting the object size accordingly. */
  		size += REDZONE_ALIGN - 1;
  		size &= ~(REDZONE_ALIGN - 1);
  	}
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1984

a44b56d35   Kevin Hilman   [PATCH] slab debu...
1985
  	/* 3) caller mandated alignment */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1986
1987
  	if (ralign < cachep->align) {
  		ralign = cachep->align;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1988
  	}
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
1989
1990
  	/* disable debug if necessary */
  	if (ralign > __alignof__(unsigned long long))
a44b56d35   Kevin Hilman   [PATCH] slab debu...
1991
  		flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
1992
  	/*
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
1993
  	 * 4) Store it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1994
  	 */
8a13a4cc8   Christoph Lameter   mm/sl[aou]b: Shri...
1995
  	cachep->align = ralign;
158e319bb   Joonsoo Kim   mm/slab: clean up...
1996
1997
1998
1999
  	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
2000

83b519e8b   Pekka Enberg   slab: setup alloc...
2001
2002
2003
2004
  	if (slab_is_available())
  		gfp = GFP_KERNEL;
  	else
  		gfp = GFP_NOWAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2005
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2006

ca5f9703d   Pekka Enberg   [PATCH] slab: res...
2007
2008
2009
2010
  	/*
  	 * Both debugging options require word-alignment which is calculated
  	 * into align above.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2011
  	if (flags & SLAB_RED_ZONE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2012
  		/* add space for red zone words */
3ff84a7f3   Pekka Enberg   Revert "slab: Fix...
2013
2014
  		cachep->obj_offset += sizeof(unsigned long long);
  		size += 2 * sizeof(unsigned long long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2015
2016
  	}
  	if (flags & SLAB_STORE_USER) {
ca5f9703d   Pekka Enberg   [PATCH] slab: res...
2017
  		/* user store requires one word storage behind the end of
87a927c71   David Woodhouse   Fix slab redzone ...
2018
2019
  		 * 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
2020
  		 */
87a927c71   David Woodhouse   Fix slab redzone ...
2021
2022
2023
2024
  		if (flags & SLAB_RED_ZONE)
  			size += REDZONE_ALIGN;
  		else
  			size += BYTES_PER_WORD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2025
  	}
832a15d20   Joonsoo Kim   mm/slab: align ca...
2026
  #endif
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
2027
  	kasan_cache_create(cachep, &size, &flags);
832a15d20   Joonsoo Kim   mm/slab: align ca...
2028
2029
2030
2031
2032
2033
2034
2035
2036
  	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...
2037
2038
2039
2040
2041
2042
2043
  	/*
  	 * 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...
2044
  	if (debug_pagealloc_enabled() && (flags & SLAB_POISON) &&
f3a3c320d   Joonsoo Kim   mm/slab: do not c...
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
  		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
2056
2057
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2058

b03a017be   Joonsoo Kim   mm/slab: introduc...
2059
2060
2061
2062
  	if (set_objfreelist_slab_cache(cachep, size, flags)) {
  		flags |= CFLGS_OBJFREELIST_SLAB;
  		goto done;
  	}
158e319bb   Joonsoo Kim   mm/slab: clean up...
2063
  	if (set_off_slab_cache(cachep, size, flags)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2064
  		flags |= CFLGS_OFF_SLAB;
158e319bb   Joonsoo Kim   mm/slab: clean up...
2065
  		goto done;
832a15d20   Joonsoo Kim   mm/slab: align ca...
2066
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2067

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

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

158e319bb   Joonsoo Kim   mm/slab: clean up...
2073
2074
  done:
  	cachep->freelist_size = cachep->num * sizeof(freelist_idx_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2075
  	cachep->flags = flags;
a57a49887   Joonsoo Kim   slab: use __GFP_C...
2076
  	cachep->allocflags = __GFP_COMP;
a3187e438   Yang Shi   mm: slab: remove ...
2077
  	if (flags & SLAB_CACHE_DMA)
a618e89f1   Glauber Costa   slab: rename gfpf...
2078
  		cachep->allocflags |= GFP_DMA;
3b0efdfa1   Christoph Lameter   mm, sl[aou]b: Ext...
2079
  	cachep->size = size;
6a2d7a955   Eric Dumazet   [PATCH] SLAB: use...
2080
  	cachep->reciprocal_buffer_size = reciprocal_value(size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2081

40b441379   Joonsoo Kim   mm/slab: clean up...
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
  #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...
2095
2096
  		cachep->freelist_cache =
  			kmalloc_slab(cachep->freelist_size, 0u);
e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2097
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2098

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2099
2100
  	err = setup_cpu_cache(cachep, gfp);
  	if (err) {
52b4b950b   Dmitry Safonov   mm: slab: free km...
2101
  		__kmem_cache_release(cachep);
278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2102
  		return err;
2ed3a4ef9   Christoph Lameter   [PATCH] slab: do ...
2103
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2104

278b1bb13   Christoph Lameter   mm/sl[aou]b: Move...
2105
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2106
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
  
  #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 ...
2118
2119
2120
2121
  static void check_mutex_acquired(void)
  {
  	BUG_ON(!mutex_is_locked(&slab_mutex));
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2122
  static void check_spinlock_acquired(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2123
2124
2125
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2126
  	assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2127
2128
  #endif
  }
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2129

343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2130
  static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2131
2132
2133
  {
  #ifdef CONFIG_SMP
  	check_irq_off();
18bf85411   Christoph Lameter   slab: use get_nod...
2134
  	assert_spin_locked(&get_node(cachep, node)->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2135
2136
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2137
2138
2139
  #else
  #define check_irq_off()	do { } while(0)
  #define check_irq_on()	do { } while(0)
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2140
  #define check_mutex_acquired()	do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2141
  #define check_spinlock_acquired(x) do { } while(0)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2142
  #define check_spinlock_acquired_node(x, y) do { } while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2143
  #endif
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
  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...
2160

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2161
2162
  static void do_drain(void *arg)
  {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2163
  	struct kmem_cache *cachep = arg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2164
  	struct array_cache *ac;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
2165
  	int node = numa_mem_id();
18bf85411   Christoph Lameter   slab: use get_nod...
2166
  	struct kmem_cache_node *n;
97654dfa2   Joonsoo Kim   slab: defer slab_...
2167
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2168
2169
  
  	check_irq_off();
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2170
  	ac = cpu_cache_get(cachep);
18bf85411   Christoph Lameter   slab: use get_nod...
2171
2172
  	n = get_node(cachep, node);
  	spin_lock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
2173
  	free_block(cachep, ac->entry, ac->avail, node, &list);
18bf85411   Christoph Lameter   slab: use get_nod...
2174
  	spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
2175
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2176
2177
  	ac->avail = 0;
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2178
  static void drain_cpu_caches(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2179
  {
ce8eb6c42   Christoph Lameter   slab: Rename list...
2180
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2181
  	int node;
18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2182
  	LIST_HEAD(list);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2183

15c8b6c1a   Jens Axboe   on_each_cpu(): ki...
2184
  	on_each_cpu(do_drain, cachep, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2185
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2186
2187
  	for_each_kmem_cache_node(cachep, node, n)
  		if (n->alien)
ce8eb6c42   Christoph Lameter   slab: Rename list...
2188
  			drain_alien_cache(cachep, n->alien);
a4523a8b3   Roland Dreier   [PATCH] slab: Fix...
2189

18726ca8b   Joonsoo Kim   mm/slab: fix the ...
2190
2191
2192
2193
2194
2195
2196
  	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
2197
  }
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2198
2199
2200
2201
2202
2203
2204
  /*
   * 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...
2205
  			struct kmem_cache_node *n, int tofree)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2206
  {
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2207
2208
  	struct list_head *p;
  	int nr_freed;
8456a648c   Joonsoo Kim   slab: use struct ...
2209
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2210

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2214
2215
2216
2217
  		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...
2218
2219
  			goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2220

8456a648c   Joonsoo Kim   slab: use struct ...
2221
  		page = list_entry(p, struct page, lru);
8456a648c   Joonsoo Kim   slab: use struct ...
2222
  		list_del(&page->lru);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
2223
  		n->num_slabs--;
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2224
2225
2226
2227
  		/*
  		 * Safe to drop the lock. The slab is no longer linked
  		 * to the cache.
  		 */
ce8eb6c42   Christoph Lameter   slab: Rename list...
2228
2229
  		n->free_objects -= cache->num;
  		spin_unlock_irq(&n->list_lock);
8456a648c   Joonsoo Kim   slab: use struct ...
2230
  		slab_destroy(cache, page);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2231
  		nr_freed++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2232
  	}
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2233
2234
  out:
  	return nr_freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2235
  }
d6e0b7fa1   Vladimir Davydov   slub: make dead c...
2236
  int __kmem_cache_shrink(struct kmem_cache *cachep, bool deactivate)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2237
  {
18bf85411   Christoph Lameter   slab: use get_nod...
2238
2239
  	int ret = 0;
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2240
  	struct kmem_cache_node *n;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2241
2242
2243
2244
  
  	drain_cpu_caches(cachep);
  
  	check_irq_on();
18bf85411   Christoph Lameter   slab: use get_nod...
2245
  	for_each_kmem_cache_node(cachep, node, n) {
a5aa63a5f   Joonsoo Kim   mm/slab: drain th...
2246
  		drain_freelist(cachep, n, INT_MAX);
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
2247

ce8eb6c42   Christoph Lameter   slab: Rename list...
2248
2249
  		ret += !list_empty(&n->slabs_full) ||
  			!list_empty(&n->slabs_partial);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2250
2251
2252
  	}
  	return (ret ? 1 : 0);
  }
945cf2b61   Christoph Lameter   mm/sl[aou]b: Extr...
2253
  int __kmem_cache_shutdown(struct kmem_cache *cachep)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2254
  {
52b4b950b   Dmitry Safonov   mm: slab: free km...
2255
2256
2257
2258
2259
  	return __kmem_cache_shrink(cachep, false);
  }
  
  void __kmem_cache_release(struct kmem_cache *cachep)
  {
12c3667fb   Christoph Lameter   mm/sl[aou]b: Get ...
2260
  	int i;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2261
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2262

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
2266
  	/* NUMA: free the node structures */
18bf85411   Christoph Lameter   slab: use get_nod...
2267
2268
2269
2270
2271
  	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 ...
2272
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2273
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2274

e5ac9c5ae   Ravikiran G Thirumalai   [PATCH] Add some ...
2275
2276
  /*
   * Get the memory for a slab management obj.
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
   *
   * 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 ...
2288
   */
7e0073552   Joonsoo Kim   slab: replace non...
2289
  static void *alloc_slabmgmt(struct kmem_cache *cachep,
0c3aa83e0   Joonsoo Kim   slab: change retu...
2290
2291
  				   struct page *page, int colour_off,
  				   gfp_t local_flags, int nodeid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2292
  {
7e0073552   Joonsoo Kim   slab: replace non...
2293
  	void *freelist;
0c3aa83e0   Joonsoo Kim   slab: change retu...
2294
  	void *addr = page_address(page);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2295

2e6b36021   Joonsoo Kim   mm/slab: put the ...
2296
2297
  	page->s_mem = addr + colour_off;
  	page->active = 0;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2298
2299
2300
  	if (OBJFREELIST_SLAB(cachep))
  		freelist = NULL;
  	else if (OFF_SLAB(cachep)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2301
  		/* Slab management obj is off-slab. */
8456a648c   Joonsoo Kim   slab: use struct ...
2302
  		freelist = kmem_cache_alloc_node(cachep->freelist_cache,
8759ec50a   Pekka Enberg   slab: remove GFP_...
2303
  					      local_flags, nodeid);
8456a648c   Joonsoo Kim   slab: use struct ...
2304
  		if (!freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2305
2306
  			return NULL;
  	} else {
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2307
2308
2309
  		/* 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
2310
  	}
2e6b36021   Joonsoo Kim   mm/slab: put the ...
2311

8456a648c   Joonsoo Kim   slab: use struct ...
2312
  	return freelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2313
  }
7cc68973c   Joonsoo Kim   slab: fix the typ...
2314
  static inline freelist_idx_t get_free_obj(struct page *page, unsigned int idx)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2315
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2316
  	return ((freelist_idx_t *)page->freelist)[idx];
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2317
2318
2319
  }
  
  static inline void set_free_obj(struct page *page,
7cc68973c   Joonsoo Kim   slab: fix the typ...
2320
  					unsigned int idx, freelist_idx_t val)
e5c58dfdc   Joonsoo Kim   slab: introduce h...
2321
  {
a41adfaa2   Joonsoo Kim   slab: introduce b...
2322
  	((freelist_idx_t *)(page->freelist))[idx] = val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2323
  }
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2324
  static void cache_init_objs_debug(struct kmem_cache *cachep, struct page *page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2325
  {
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2326
  #if DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2327
2328
2329
  	int i;
  
  	for (i = 0; i < cachep->num; i++) {
8456a648c   Joonsoo Kim   slab: use struct ...
2330
  		void *objp = index_to_obj(cachep, page, i);
10b2e9e8e   Joonsoo Kim   mm/slab: factor o...
2331

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

c7ce4f60a   Thomas Garnier   mm: SLAB freelist...
2499
2500
  		if (!shuffled)
  			set_free_obj(page, i, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2501
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2502
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2503
  static void *slab_get_obj(struct kmem_cache *cachep, struct page *page)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2504
  {
b1cb0982b   Joonsoo Kim   slab: change the ...
2505
  	void *objp;
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2506

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

d31676dfd   Joonsoo Kim   mm/slab: alternat...
2510
2511
2512
2513
  #if DEBUG
  	if (cachep->flags & SLAB_STORE_USER)
  		set_store_user_dirty(cachep);
  #endif
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2514
2515
  	return objp;
  }
260b61dd4   Joonsoo Kim   mm/slab: remove t...
2516
2517
  static void slab_put_obj(struct kmem_cache *cachep,
  			struct page *page, void *objp)
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2518
  {
8456a648c   Joonsoo Kim   slab: use struct ...
2519
  	unsigned int objnr = obj_to_index(cachep, page, objp);
78d382d77   Matthew Dobson   [PATCH] slab: ext...
2520
  #if DEBUG
16025177e   Joonsoo Kim   slab: remove kmem...
2521
  	unsigned int i;
b1cb0982b   Joonsoo Kim   slab: change the ...
2522

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2564
2565
2566
  	/*
  	 * 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
2567
  	 */
c871ac4e9   Andrew Morton   slab: improve che...
2568
  	if (unlikely(flags & GFP_SLAB_BUG_MASK)) {
bacdcb346   Michal Hocko   slab: make GFP_SL...
2569
  		gfp_t invalid_mask = flags & GFP_SLAB_BUG_MASK;
72baeef0c   Michal Hocko   slab: do not pani...
2570
2571
2572
2573
2574
  		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...
2575
  	}
6cb062296   Christoph Lameter   Categorize GFP flags
2576
  	local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2577

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2578
  	check_irq_off();
d0164adc8   Mel Gorman   mm, page_alloc: d...
2579
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2580
2581
2582
  		local_irq_enable();
  
  	/*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2583
2584
  	 * Get mem for the objs.  Attempt to allocate a physical page from
  	 * 'nodeid'.
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2585
  	 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
2586
  	page = kmem_getpages(cachep, local_flags, nodeid);
0c3aa83e0   Joonsoo Kim   slab: change retu...
2587
  	if (!page)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2588
  		goto failed;
511e3a058   Joonsoo Kim   mm/slab: make cac...
2589
2590
  	page_node = page_to_nid(page);
  	n = get_node(cachep, page_node);
03d1d43a1   Joonsoo Kim   mm/slab: racy acc...
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
  
  	/* 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
2602
  	/* Get slab management. */
8456a648c   Joonsoo Kim   slab: use struct ...
2603
  	freelist = alloc_slabmgmt(cachep, page, offset,
511e3a058   Joonsoo Kim   mm/slab: make cac...
2604
  			local_flags & ~GFP_CONSTRAINT_MASK, page_node);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2605
  	if (OFF_SLAB(cachep) && !freelist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2606
  		goto opps1;
8456a648c   Joonsoo Kim   slab: use struct ...
2607
  	slab_map_pages(cachep, page, freelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2608

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

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

76b342bdc   Joonsoo Kim   mm/slab: separate...
2615
  	return page;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2616
  opps1:
0c3aa83e0   Joonsoo Kim   slab: change retu...
2617
  	kmem_freepages(cachep, page);
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2618
  failed:
d0164adc8   Mel Gorman   mm, page_alloc: d...
2619
  	if (gfpflags_allow_blocking(local_flags))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2620
  		local_irq_disable();
76b342bdc   Joonsoo Kim   mm/slab: separate...
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
  	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);
  	if (!page->active)
  		list_add_tail(&page->lru, &(n->slabs_free));
  	else
  		fixup_slab_list(cachep, n, page, &list);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
2642
2643
  
  	n->num_slabs++;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2644
2645
2646
2647
2648
  	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
2649
2650
2651
2652
2653
2654
2655
2656
  }
  
  #if DEBUG
  
  /*
   * Perform extra freeing checks:
   * - detect bad pointers.
   * - POISON/RED_ZONE checking
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2657
2658
2659
   */
  static void kfree_debugcheck(const void *objp)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2660
  	if (!virt_addr_valid(objp)) {
1170532bb   Joe Perches   mm: convert print...
2661
2662
  		pr_err("kfree_debugcheck: out of range ptr %lxh
  ",
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
2663
2664
  		       (unsigned long)objp);
  		BUG();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2665
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2666
  }
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2667
2668
  static inline void verify_redzone_free(struct kmem_cache *cache, void *obj)
  {
b46b8f19c   David Woodhouse   Increase slab red...
2669
  	unsigned long long redzone1, redzone2;
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
  
  	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...
2684
2685
2686
  	pr_err("%p: redzone 1:0x%llx, redzone 2:0x%llx
  ",
  	       obj, redzone1, redzone2);
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2687
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
2688
  static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2689
  				   unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2690
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2691
  	unsigned int objnr;
8456a648c   Joonsoo Kim   slab: use struct ...
2692
  	struct page *page;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2693

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2699
  	if (cachep->flags & SLAB_RED_ZONE) {
58ce1fd58   Pekka Enberg   [PATCH] slab: red...
2700
  		verify_redzone_free(cachep, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2701
2702
2703
  		*dbg_redzone1(cachep, objp) = RED_INACTIVE;
  		*dbg_redzone2(cachep, objp) = RED_INACTIVE;
  	}
d31676dfd   Joonsoo Kim   mm/slab: alternat...
2704
2705
  	if (cachep->flags & SLAB_STORE_USER) {
  		set_store_user_dirty(cachep);
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
2706
  		*dbg_userword(cachep, objp) = (void *)caller;
d31676dfd   Joonsoo Kim   mm/slab: alternat...
2707
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2708

8456a648c   Joonsoo Kim   slab: use struct ...
2709
  	objnr = obj_to_index(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2710
2711
  
  	BUG_ON(objnr >= cachep->num);
8456a648c   Joonsoo Kim   slab: use struct ...
2712
  	BUG_ON(objp != index_to_obj(cachep, page, objnr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2713

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2714
  	if (cachep->flags & SLAB_POISON) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2715
  		poison_obj(cachep, objp, POISON_FREE);
40b441379   Joonsoo Kim   mm/slab: clean up...
2716
  		slab_kernel_map(cachep, objp, 0, caller);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2717
2718
2719
  	}
  	return objp;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2720
2721
2722
  #else
  #define kfree_debugcheck(x) do { } while(0)
  #define cache_free_debugcheck(x,objp,z) (objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2723
  #endif
b03a017be   Joonsoo Kim   mm/slab: introduc...
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
  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...
2738
  static inline void fixup_slab_list(struct kmem_cache *cachep,
b03a017be   Joonsoo Kim   mm/slab: introduc...
2739
2740
  				struct kmem_cache_node *n, struct page *page,
  				void **list)
d8410234d   Joonsoo Kim   mm/slab: factor o...
2741
2742
2743
  {
  	/* move slabp to correct slabp list: */
  	list_del(&page->lru);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2744
  	if (page->active == cachep->num) {
d8410234d   Joonsoo Kim   mm/slab: factor o...
2745
  		list_add(&page->lru, &n->slabs_full);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
  		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...
2759
2760
  		list_add(&page->lru, &n->slabs_partial);
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
  /* Try to find non-pfmemalloc slab if needed */
  static noinline struct page *get_valid_first_slab(struct kmem_cache_node *n,
  					struct page *page, bool pfmemalloc)
  {
  	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);
  	if (!page->active)
  		list_add_tail(&page->lru, &n->slabs_free);
  	else
  		list_add_tail(&page->lru, &n->slabs_partial);
  
  	list_for_each_entry(page, &n->slabs_partial, lru) {
  		if (!PageSlabPfmemalloc(page))
  			return page;
  	}
  
  	list_for_each_entry(page, &n->slabs_free, lru) {
  		if (!PageSlabPfmemalloc(page))
  			return page;
  	}
  
  	return NULL;
  }
  
  static struct page *get_first_slab(struct kmem_cache_node *n, bool pfmemalloc)
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
  {
  	struct page *page;
  
  	page = list_first_entry_or_null(&n->slabs_partial,
  			struct page, lru);
  	if (!page) {
  		n->free_touched = 1;
  		page = list_first_entry_or_null(&n->slabs_free,
  				struct page, lru);
  	}
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2811
2812
  	if (sk_memalloc_socks())
  		return get_valid_first_slab(n, page, pfmemalloc);
7aa0d2278   Geliang Tang   mm/slab.c: add a ...
2813
2814
  	return page;
  }
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
  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...
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
  /*
   * 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...
2865
  static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2866
2867
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2868
  	struct kmem_cache_node *n;
801faf0db   Joonsoo Kim   mm/slab: lockless...
2869
  	struct array_cache *ac, *shared;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2870
  	int node;
b03a017be   Joonsoo Kim   mm/slab: introduc...
2871
  	void *list = NULL;
76b342bdc   Joonsoo Kim   mm/slab: separate...
2872
  	struct page *page;
1ca4cb241   Pekka Enberg   [PATCH] slab: red...
2873

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

9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2877
  	ac = cpu_cache_get(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2878
2879
  	batchcount = ac->batchcount;
  	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2880
2881
2882
2883
  		/*
  		 * 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
2884
2885
2886
  		 */
  		batchcount = BATCHREFILL_LIMIT;
  	}
18bf85411   Christoph Lameter   slab: use get_nod...
2887
  	n = get_node(cachep, node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2888

ce8eb6c42   Christoph Lameter   slab: Rename list...
2889
  	BUG_ON(ac->avail > 0 || !n);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2890
2891
2892
  	shared = READ_ONCE(n->shared);
  	if (!n->free_objects && (!shared || !shared->avail))
  		goto direct_grow;
ce8eb6c42   Christoph Lameter   slab: Rename list...
2893
  	spin_lock(&n->list_lock);
801faf0db   Joonsoo Kim   mm/slab: lockless...
2894
  	shared = READ_ONCE(n->shared);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2895

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

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

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

213b46958   Joonsoo Kim   mm/slab: refill c...
2910
  		batchcount = alloc_block(cachep, ac, page, batchcount);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2911
  		fixup_slab_list(cachep, n, page, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2912
  	}
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2913
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2914
  	n->free_objects -= ac->avail;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
2915
  alloc_done:
ce8eb6c42   Christoph Lameter   slab: Rename list...
2916
  	spin_unlock(&n->list_lock);
b03a017be   Joonsoo Kim   mm/slab: introduc...
2917
  	fixup_objfreelist_debug(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2918

801faf0db   Joonsoo Kim   mm/slab: lockless...
2919
  direct_grow:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2920
  	if (unlikely(!ac->avail)) {
f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
2921
2922
2923
2924
2925
2926
2927
  		/* 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...
2928
  		page = cache_grow_begin(cachep, gfp_exact_node(flags), node);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
2929

76b342bdc   Joonsoo Kim   mm/slab: separate...
2930
2931
2932
2933
  		/*
  		 * cache_grow_begin() can reenable interrupts,
  		 * then ac could change.
  		 */
9a2dba4b4   Pekka Enberg   [PATCH] slab: ren...
2934
  		ac = cpu_cache_get(cachep);
213b46958   Joonsoo Kim   mm/slab: refill c...
2935
2936
2937
  		if (!ac->avail && page)
  			alloc_block(cachep, ac, page, batchcount);
  		cache_grow_end(cachep, page);
072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
2938

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

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

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

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

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

3c517a613   Christoph Lameter   [PATCH] slab: bet...
3073
3074
3075
3076
3077
  retry:
  	/*
  	 * Look through allowed nodes for objects available
  	 * from existing per node queues.
  	 */
54a6eb5c4   Mel Gorman   mm: use two zonel...
3078
3079
  	for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) {
  		nid = zone_to_nid(zone);
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
3080

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

3c517a613   Christoph Lameter   [PATCH] slab: bet...
3104
  			/*
511e3a058   Joonsoo Kim   mm/slab: make cac...
3105
3106
  			 * Another processor may allocate the objects in
  			 * the slab since we are not holding any locks.
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3107
  			 */
511e3a058   Joonsoo Kim   mm/slab: make cac...
3108
3109
  			if (!obj)
  				goto retry;
3c517a613   Christoph Lameter   [PATCH] slab: bet...
3110
  		}
aedb0eb10   Christoph Lameter   [PATCH] Slab: Do ...
3111
  	}
cc9a6c877   Mel Gorman   cpuset: mm: reduc...
3112

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

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

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

b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3139
  	check_spinlock_acquired_node(cachep, nodeid);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3140
3141
3142
3143
  
  	STATS_INC_NODEALLOCS(cachep);
  	STATS_INC_ACTIVE(cachep);
  	STATS_SET_HIGH(cachep);
8456a648c   Joonsoo Kim   slab: use struct ...
3144
  	BUG_ON(page->active == cachep->num);
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3145

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

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

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

a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3155
  must_grow:
ce8eb6c42   Christoph Lameter   slab: Rename list...
3156
  	spin_unlock(&n->list_lock);
76b342bdc   Joonsoo Kim   mm/slab: separate...
3157
  	page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid);
213b46958   Joonsoo Kim   mm/slab: refill c...
3158
3159
3160
3161
  	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...
3162
  	cache_grow_end(cachep, page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3163

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

8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3167
  static __always_inline void *
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3168
  slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3169
  		   unsigned long caller)
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3170
3171
3172
  {
  	unsigned long save_flags;
  	void *ptr;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3173
  	int slab_node = numa_mem_id();
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3174

dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
3175
  	flags &= gfp_allowed_mask;
011eceaf0   Jesper Dangaard Brouer   slab: use slab_pr...
3176
3177
  	cachep = slab_pre_alloc_hook(cachep, flags);
  	if (unlikely(!cachep))
824ebef12   Akinobu Mita   fault injection: ...
3178
  		return NULL;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3179
3180
  	cache_alloc_debugcheck_before(cachep, flags);
  	local_irq_save(save_flags);
eacbbae38   Andrew Morton   slab: use NUMA_NO...
3181
  	if (nodeid == NUMA_NO_NODE)
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3182
  		nodeid = slab_node;
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3183

18bf85411   Christoph Lameter   slab: use get_nod...
3184
  	if (unlikely(!get_node(cachep, nodeid))) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3185
3186
3187
3188
  		/* Node not bootstrapped yet */
  		ptr = fallback_alloc(cachep, flags);
  		goto out;
  	}
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3189
  	if (nodeid == slab_node) {
8c8cc2c10   Pekka Enberg   [PATCH] slab: cac...
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
  		/*
  		 * 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...
3205
3206
  	if (unlikely(flags & __GFP_ZERO) && ptr)
  		memset(ptr, 0, cachep->object_size);
d07dbea46   Christoph Lameter   Slab allocators: ...
3207

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

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

072bb0aa5   Mel Gorman   mm: sl[au]b: add ...
3282
  		objp = objpp[i];
8456a648c   Joonsoo Kim   slab: use struct ...
3283
  		page = virt_to_head_page(objp);
8456a648c   Joonsoo Kim   slab: use struct ...
3284
  		list_del(&page->lru);
ff69416e6   Christoph Lameter   [PATCH] slab: fix...
3285
  		check_spinlock_acquired_node(cachep, node);
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3286
  		slab_put_obj(cachep, page, objp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3287
  		STATS_DEC_ACTIVE(cachep);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3288
3289
  
  		/* fixup slab chains */
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3290
3291
3292
  		if (page->active == 0)
  			list_add(&page->lru, &n->slabs_free);
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3293
3294
3295
3296
  			/* 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 ...
3297
  			list_add_tail(&page->lru, &n->slabs_partial);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3298
3299
  		}
  	}
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3300
3301
3302
3303
3304
  
  	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...
3305
  		list_move(&page->lru, list);
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3306
  		n->num_slabs--;
6052b7880   Joonsoo Kim   mm/slab: don't ke...
3307
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3308
  }
343e0d7a9   Pekka Enberg   [PATCH] slab: rep...
3309
  static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3310
3311
  {
  	int batchcount;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3312
  	struct kmem_cache_node *n;
7d6e6d09d   Lee Schermerhorn   numa: slab: use n...
3313
  	int node = numa_mem_id();
97654dfa2   Joonsoo Kim   slab: defer slab_...
3314
  	LIST_HEAD(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3315
3316
  
  	batchcount = ac->batchcount;
260b61dd4   Joonsoo Kim   mm/slab: remove t...
3317

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

73c0219d8   Geliang Tang   mm/slab.c: use li...
3340
  		list_for_each_entry(page, &n->slabs_free, lru) {
8456a648c   Joonsoo Kim   slab: use struct ...
3341
  			BUG_ON(page->active);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3342
3343
  
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3344
3345
3346
3347
  		}
  		STATS_SET_FREEABLE(cachep, i);
  	}
  #endif
ce8eb6c42   Christoph Lameter   slab: Rename list...
3348
  	spin_unlock(&n->list_lock);
97654dfa2   Joonsoo Kim   slab: defer slab_...
3349
  	slabs_destroy(cachep, &list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3350
  	ac->avail -= batchcount;
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3351
  	memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3352
3353
3354
  }
  
  /*
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3355
3356
   * 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
3357
   */
a947eb95e   Suleiman Souhlal   SLAB: Record actu...
3358
  static inline void __cache_free(struct kmem_cache *cachep, void *objp,
7c0cb9c64   Ezequiel Garcia   mm, slab: Replace...
3359
  				unsigned long caller)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3360
  {
55834c590   Alexander Potapenko   mm: kasan: initia...
3361
3362
3363
3364
3365
3366
  	/* 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
3367

55834c590   Alexander Potapenko   mm: kasan: initia...
3368
3369
3370
3371
  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...
3372

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

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

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

f68f8dddb   Joonsoo Kim   mm/slab: re-imple...
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
  	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
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
  }
  
  /**
   * 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...
3415
  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3416
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3417
  	void *ret = slab_alloc(cachep, flags, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3418

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

505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3478
  	kasan_kmalloc(cachep, ret, size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3479
  	trace_kmalloc(_RET_IP_, ret,
ff4fcd01e   Ezequiel Garcia   mm, slab: Remove ...
3480
  		      size, cachep->size, flags);
85beb5869   Steven Rostedt   tracing/slab: Mov...
3481
  	return ret;
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3482
  }
85beb5869   Steven Rostedt   tracing/slab: Mov...
3483
  EXPORT_SYMBOL(kmem_cache_alloc_trace);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3484
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3485
  #ifdef CONFIG_NUMA
d0d04b78f   Zhouping Liu   mm, slab: moved k...
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
  /**
   * 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...
3497
3498
  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
  {
48356303f   Ezequiel Garcia   mm, slab: Rename ...
3499
  	void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
36555751c   Eduard - Gabriel Munteanu   kmemtrace: SLAB h...
3500

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

2c59dd654   Christoph Lameter   slab: Common Kmal...
3532
  	cachep = kmalloc_slab(size, flags);
6cb8f9132   Christoph Lameter   Slab allocators: ...
3533
3534
  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
  		return cachep;
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3535
  	ret = kmem_cache_alloc_node_trace(cachep, flags, node, size);
505f5dcb1   Alexander Potapenko   mm, kasan: add GF...
3536
  	kasan_kmalloc(cachep, ret, size, flags);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
3537
3538
  
  	return ret;
97e2bde47   Manfred Spraul   [PATCH] add kmall...
3539
  }
8b98c1699   Christoph Hellwig   [PATCH] leak trac...
3540

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

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

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

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

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

9c09a95cf   Mel Gorman   slab: partially r...
3673
  	for_each_online_node(node) {
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3674
3675
  		ret = setup_kmem_cache_node(cachep, node, gfp, true);
  		if (ret)
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3676
  			goto fail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3677
  	}
c3d332b6b   Joonsoo Kim   mm/slab: clean-up...
3678

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

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

bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3705
3706
  	cpu_cache = alloc_kmem_cache_cpus(cachep, limit, batchcount);
  	if (!cpu_cache)
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
3707
  		return -ENOMEM;
bf0dea23a   Joonsoo Kim   mm/slab: use perc...
3708
3709
3710
  	prev = cachep->cpu_cache;
  	cachep->cpu_cache = cpu_cache;
  	kick_all_cpus_sync();
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3711

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

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

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

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

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

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

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

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

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

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

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

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

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

ce8eb6c42   Christoph Lameter   slab: Rename list...
3907
  			freed = drain_freelist(searchp, n, (n->free_limit +
ed11d9eb2   Christoph Lameter   [PATCH] slab: con...
3908
3909
3910
  				5 * searchp->num - 1) / (5 * searchp->num));
  			STATS_ADD_REAPED(searchp, freed);
  		}
35386e3b0   Christoph Lameter   [PATCH] slab: cac...
3911
  next:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3912
3913
3914
  		cond_resched();
  	}
  	check_irq_on();
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
3915
  	mutex_unlock(&slab_mutex);
8fce4d8e3   Christoph Lameter   [PATCH] slab: Nod...
3916
  	next_reap_node();
7c5cae368   Christoph Lameter   [PATCH] slab: use...
3917
  out:
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
3918
  	/* Set up the next iteration */
5f0985bb1   Jianyu Zhan   mm/slab.c: cleanu...
3919
  	schedule_delayed_work(work, round_jiffies_relative(REAPTIMEOUT_AC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3920
  }
158a96242   Linus Torvalds   Unify /proc/slabi...
3921
  #ifdef CONFIG_SLABINFO
0d7561c61   Glauber Costa   sl[au]b: Process ...
3922
  void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3923
  {
8456a648c   Joonsoo Kim   slab: use struct ...
3924
  	struct page *page;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3925
3926
3927
3928
  	unsigned long active_objs;
  	unsigned long num_objs;
  	unsigned long active_slabs = 0;
  	unsigned long num_slabs, free_objects = 0, shared_avail = 0;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3929
3930
  	unsigned long num_slabs_partial = 0, num_slabs_free = 0;
  	unsigned long num_slabs_full = 0;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3931
  	const char *name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3932
  	char *error = NULL;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3933
  	int node;
ce8eb6c42   Christoph Lameter   slab: Rename list...
3934
  	struct kmem_cache_node *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3935

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3936
3937
  	active_objs = 0;
  	num_slabs = 0;
18bf85411   Christoph Lameter   slab: use get_nod...
3938
  	for_each_kmem_cache_node(cachep, node, n) {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3939

ca3b9b917   Ravikiran G Thirumalai   [PATCH] NUMA slab...
3940
  		check_irq_on();
ce8eb6c42   Christoph Lameter   slab: Rename list...
3941
  		spin_lock_irq(&n->list_lock);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3942

07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3943
  		num_slabs += n->num_slabs;
8456a648c   Joonsoo Kim   slab: use struct ...
3944
3945
  		list_for_each_entry(page, &n->slabs_partial, lru) {
  			if (page->active == cachep->num && !error)
106a74e13   Joonsoo Kim   slab: replace fre...
3946
  				error = "slabs_partial accounting error";
8456a648c   Joonsoo Kim   slab: use struct ...
3947
  			if (!page->active && !error)
106a74e13   Joonsoo Kim   slab: replace fre...
3948
  				error = "slabs_partial accounting error";
8456a648c   Joonsoo Kim   slab: use struct ...
3949
  			active_objs += page->active;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3950
  			num_slabs_partial++;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3951
  		}
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3952

8456a648c   Joonsoo Kim   slab: use struct ...
3953
3954
  		list_for_each_entry(page, &n->slabs_free, lru) {
  			if (page->active && !error)
106a74e13   Joonsoo Kim   slab: replace fre...
3955
  				error = "slabs_free accounting error";
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3956
  			num_slabs_free++;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3957
  		}
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3958

ce8eb6c42   Christoph Lameter   slab: Rename list...
3959
3960
3961
  		free_objects += n->free_objects;
  		if (n->shared)
  			shared_avail += n->shared->avail;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3962

ce8eb6c42   Christoph Lameter   slab: Rename list...
3963
  		spin_unlock_irq(&n->list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3964
  	}
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3965
  	num_objs = num_slabs * cachep->num;
07a63c41f   Aruna Ramakrishna   mm/slab: improve ...
3966
3967
3968
  	active_slabs = num_slabs - num_slabs_free;
  	num_slabs_full = num_slabs - (num_slabs_partial + num_slabs_free);
  	active_objs += (num_slabs_full * cachep->num);
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3969
  	if (num_objs - active_objs != free_objects && !error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3970
  		error = "free_objects accounting error";
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
3971
  	name = cachep->name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3972
  	if (error)
1170532bb   Joe Perches   mm: convert print...
3973
3974
  		pr_err("slab: cache %s error: %s
  ", name, error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3975

0d7561c61   Glauber Costa   sl[au]b: Process ...
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
  	sinfo->active_objs = active_objs;
  	sinfo->num_objs = num_objs;
  	sinfo->active_slabs = active_slabs;
  	sinfo->num_slabs = num_slabs;
  	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
3990
  #if STATS
ce8eb6c42   Christoph Lameter   slab: Rename list...
3991
  	{			/* node stats */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3992
3993
3994
3995
3996
3997
  		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
3998
  		unsigned long node_allocs = cachep->node_allocs;
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
3999
  		unsigned long node_frees = cachep->node_frees;
fb7faf331   Ravikiran G Thirumalai   [PATCH] slab: add...
4000
  		unsigned long overflows = cachep->node_overflow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4001

756a025f0   Joe Perches   mm: coalesce spli...
4002
  		seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu %4lu %4lu %4lu %4lu %4lu",
e92dd4fd1   Joe Perches   slab: Fix continu...
4003
4004
4005
  			   allocs, high, grown,
  			   reaped, errors, max_freeable, node_allocs,
  			   node_frees, overflows);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4006
4007
4008
4009
4010
4011
4012
4013
4014
  	}
  	/* 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...
4015
  			   allochit, allocmiss, freehit, freemiss);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4016
4017
  	}
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4018
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4019
4020
4021
4022
4023
4024
4025
4026
  #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 ...
4027
  ssize_t slabinfo_write(struct file *file, const char __user *buffer,
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4028
  		       size_t count, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4029
  {
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4030
  	char kbuf[MAX_SLABINFO_WRITE + 1], *tmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4031
  	int limit, batchcount, shared, res;
7a7c381d2   Christoph Hellwig   [PATCH] slab: sto...
4032
  	struct kmem_cache *cachep;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4033

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4034
4035
4036
4037
  	if (count > MAX_SLABINFO_WRITE)
  		return -EINVAL;
  	if (copy_from_user(&kbuf, buffer, count))
  		return -EFAULT;
b28a02de8   Pekka Enberg   [PATCH] slab: fix...
4038
  	kbuf[MAX_SLABINFO_WRITE] = '\0';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
  
  	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...
4049
  	mutex_lock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4050
  	res = -EINVAL;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4051
  	list_for_each_entry(cachep, &slab_caches, list) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4052
  		if (!strcmp(cachep->name, kbuf)) {
a737b3e2f   Andrew Morton   [PATCH] slab cleanup
4053
4054
  			if (limit < 1 || batchcount < 1 ||
  					batchcount > limit || shared < 0) {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
4055
  				res = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4056
  			} else {
e498be7da   Christoph Lameter   [PATCH] Numa-awar...
4057
  				res = do_tune_cpucache(cachep, limit,
83b519e8b   Pekka Enberg   slab: setup alloc...
4058
4059
  						       batchcount, shared,
  						       GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4060
4061
4062
4063
  			}
  			break;
  		}
  	}
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4064
  	mutex_unlock(&slab_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4065
4066
4067
4068
  	if (res >= 0)
  		res = count;
  	return res;
  }
871751e25   Al Viro   [PATCH] slab: imp...
4069
4070
  
  #ifdef CONFIG_DEBUG_SLAB_LEAK
871751e25   Al Viro   [PATCH] slab: imp...
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
  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 ...
4100
4101
  static void handle_slab(unsigned long *n, struct kmem_cache *c,
  						struct page *page)
871751e25   Al Viro   [PATCH] slab: imp...
4102
4103
  {
  	void *p;
d31676dfd   Joonsoo Kim   mm/slab: alternat...
4104
4105
  	int i, j;
  	unsigned long v;
b1cb0982b   Joonsoo Kim   slab: change the ...
4106

871751e25   Al Viro   [PATCH] slab: imp...
4107
4108
  	if (n[0] == n[1])
  		return;
8456a648c   Joonsoo Kim   slab: use struct ...
4109
  	for (i = 0, p = page->s_mem; i < c->num; i++, p += c->size) {
d31676dfd   Joonsoo Kim   mm/slab: alternat...
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
  		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...
4120
  			continue;
b1cb0982b   Joonsoo Kim   slab: change the ...
4121

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
  		/*
  		 * 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...
4132
4133
4134
4135
4136
4137
4138
  			return;
  	}
  }
  
  static void show_symbol(struct seq_file *m, unsigned long address)
  {
  #ifdef CONFIG_KALLSYMS
871751e25   Al Viro   [PATCH] slab: imp...
4139
  	unsigned long offset, size;
9281acea6   Tejun Heo   kallsyms: make KS...
4140
  	char modname[MODULE_NAME_LEN], name[KSYM_NAME_LEN];
871751e25   Al Viro   [PATCH] slab: imp...
4141

a5c43dae7   Alexey Dobriyan   Fix race between ...
4142
  	if (lookup_symbol_attrs(address, &size, &offset, modname, name) == 0) {
871751e25   Al Viro   [PATCH] slab: imp...
4143
  		seq_printf(m, "%s+%#lx/%#lx", name, offset, size);
a5c43dae7   Alexey Dobriyan   Fix race between ...
4144
  		if (modname[0])
871751e25   Al Viro   [PATCH] slab: imp...
4145
4146
4147
4148
4149
4150
4151
4152
4153
  			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...
4154
  	struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
8456a648c   Joonsoo Kim   slab: use struct ...
4155
  	struct page *page;
ce8eb6c42   Christoph Lameter   slab: Rename list...
4156
  	struct kmem_cache_node *n;
871751e25   Al Viro   [PATCH] slab: imp...
4157
  	const char *name;
db8450673   Christoph Lameter   slab: Fixup CONFI...
4158
  	unsigned long *x = m->private;
871751e25   Al Viro   [PATCH] slab: imp...
4159
4160
4161
4162
4163
4164
4165
  	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...
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
  	/*
  	 * 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...
4177

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

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

d31676dfd   Joonsoo Kim   mm/slab: alternat...
4183
4184
4185
4186
4187
4188
4189
  			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...
4190

871751e25   Al Viro   [PATCH] slab: imp...
4191
  	name = cachep->name;
db8450673   Christoph Lameter   slab: Fixup CONFI...
4192
  	if (x[0] == x[1]) {
871751e25   Al Viro   [PATCH] slab: imp...
4193
  		/* Increase the buffer size */
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4194
  		mutex_unlock(&slab_mutex);
db8450673   Christoph Lameter   slab: Fixup CONFI...
4195
  		m->private = kzalloc(x[0] * 4 * sizeof(unsigned long), GFP_KERNEL);
871751e25   Al Viro   [PATCH] slab: imp...
4196
4197
  		if (!m->private) {
  			/* Too bad, we are really out */
db8450673   Christoph Lameter   slab: Fixup CONFI...
4198
  			m->private = x;
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4199
  			mutex_lock(&slab_mutex);
871751e25   Al Viro   [PATCH] slab: imp...
4200
4201
  			return -ENOMEM;
  		}
db8450673   Christoph Lameter   slab: Fixup CONFI...
4202
4203
  		*(unsigned long *)m->private = x[0] * 2;
  		kfree(x);
18004c5d4   Christoph Lameter   mm, sl[aou]b: Use...
4204
  		mutex_lock(&slab_mutex);
871751e25   Al Viro   [PATCH] slab: imp...
4205
4206
4207
4208
  		/* Now make sure this entry will be retried */
  		m->count = m->size;
  		return 0;
  	}
db8450673   Christoph Lameter   slab: Fixup CONFI...
4209
4210
4211
  	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...
4212
4213
4214
  		seq_putc(m, '
  ');
  	}
d2e7b7d0a   Siddha, Suresh B   [PATCH] fix poten...
4215

871751e25   Al Viro   [PATCH] slab: imp...
4216
4217
  	return 0;
  }
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4218
  static const struct seq_operations slabstats_op = {
1df3b26f2   Vladimir Davydov   slab: print slabi...
4219
  	.start = slab_start,
276a2439c   Wanpeng Li   mm/slab: Give s_n...
4220
4221
  	.next = slab_next,
  	.stop = slab_stop,
871751e25   Al Viro   [PATCH] slab: imp...
4222
4223
  	.show = leaks_show,
  };
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4224
4225
4226
  
  static int slabstats_open(struct inode *inode, struct file *file)
  {
b208ce329   Rob Jones   mm/slab.c: use __...
4227
4228
4229
4230
4231
4232
4233
4234
4235
  	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/...
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
  }
  
  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...
4250
  #endif
a0ec95a8e   Alexey Dobriyan   proc: move /proc/...
4251
4252
4253
  	return 0;
  }
  module_init(slab_proc_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4254
  #endif
04385fc5e   Kees Cook   mm: SLAB hardened...
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
  #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...
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
  /**
   * 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...
4296
  size_t ksize(const void *objp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4297
  {
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4298
  	size_t size;
ef8b4520b   Christoph Lameter   Slab allocators: ...
4299
4300
  	BUG_ON(!objp);
  	if (unlikely(objp == ZERO_SIZE_PTR))
00e145b6d   Manfred Spraul   [PATCH] slab: rem...
4301
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4302

7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4303
4304
4305
4306
  	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 ...
4307
  	kasan_unpoison_shadow(objp, size);
7ed2f9e66   Alexander Potapenko   mm, kasan: SLAB s...
4308
4309
  
  	return size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4310
  }
b1aabecd5   Kirill A. Shutemov   mm: Export symbol...
4311
  EXPORT_SYMBOL(ksize);