Ren [01/12] slab_common: Use proper formatting specs for unsigned size_t
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
mm/slab_common.c +1 -1
@@ -243,7 +243,7 @@ void __init create_boot_cache(struct kme err =__kmem_cache_create (s, flags);if (err) -panic ("Creation of kmalloc slab %s size=%zd failed. Reason %d\n" , +panic ("Creation of kmalloc slab %s size=%zu failed. Reason %d\n" , name, size, err); s->refcount =-1 ;/* Exempt from merging for now */
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Glauber Costa
Acked-byQuoted 2 lines · Christoph Lameter
Signed-off-by Christoph Lameter <[email protected]>
straightforward, with the need justified from a recent report.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [02/12] Move kmalloc related function defs
In reply to a message not in the archiveMove these functions higher up in slab.h so that they are grouped with other generic kmalloc related definitions.
include/linux/slab.h +9 -9
@@ -142,6 +142,15 @@ void kmem_cache_free(struct kmem_cache * (__flags), NULL)/* +* Common kmalloc functions provided by all allocators +*/ +void *__must_check __krealloc (const void *,size_t ,gfp_t ); +void *__must_check krealloc (const void *,size_t ,gfp_t ); +void kfree (const void *); +void kzfree (const void *); +size_t ksize (const void *); + +/* * The largest kmalloc size supported by the slab allocators is * 32 megabyte (2^25) or the maximum allocatable page order if that is * less than 32 MB.
@@ -177,15 +186,6 @@ void kmem_cache_free(struct kmem_cache *#endif /* -* Common kmalloc functions provided by all allocators -*/ -void *__must_check __krealloc (const void *,size_t ,gfp_t ); -void *__must_check krealloc (const void *,size_t ,gfp_t ); -void kfree (const void *); -void kzfree (const void *); -size_t ksize (const void *); - -/* * Allocator specific definitions. These are mainly used to establish optimized * ways to convert kmalloc() calls to kmem_cache_alloc() invocations by * selecting the appropriate general cache at compile time.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [10/12] stat: Use size_t for sizes instead of unsigned
In reply to a message not in the archiveOn some platforms (such as IA64) the large page size may results in slab allocations to be allowed of numbers that do not fit in 32 bit.
fs/proc/stat.c +1 -1
@@ -184,7 +184,7 @@ static int show_stat(struct seq_file *p,static int stat_open (struct inode *inode,struct file *file) { -unsigned size =1024 +128 *num_possible_cpus (); +size_t size =1024 +128 *num_possible_cpus ();char *buf;struct seq_file *m;int res;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [07/12] Common constants for kmalloc boundaries
In reply to a message not in the archiveStandardize the constants that describe the smallest and largest object kept in the kmalloc arrays for SLAB and SLUB.
Differentiate between the maximum size for which a slab cache is used (KMALLOC_MAX_CACHE_SIZE) and the maximum allocatable size (KMALLOC_MAX_SIZE, KMALLOC_MAX_ORDER).
include/linux/slab.h +24 -10
@@ -156,7 +156,12 @@ struct kmem_cache {#else /* CONFIG_SLOB */ /* -* The largest kmalloc size supported by the slab allocators is +* Kmalloc array related definitions +*/ + +#ifdef CONFIG_SLAB +/* +* The largest kmalloc size supported by the SLAB allocators is * 32 megabyte (2^25) or the maximum allocatable page order if that is * less than 32 MB. *
@@ -166,9 +171,24 @@ struct kmem_cache {*/ #define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \ (MAX_ORDER + PAGE_SHIFT - 1) : 25) +#define KMALLOC_SHIFT_MAX KMALLOC_SHIFT_HIGH +#define KMALLOC_SHIFT_LOW 5 +#else +/* +* SLUB allocates up to order 2 pages directly and otherwise +* passes the request to the page allocator. +*/ +#define KMALLOC_SHIFT_HIGH (PAGE_SHIFT + 1) +#define KMALLOC_SHIFT_MAX (MAX_ORDER + PAGE_SHIFT) +#define KMALLOC_SHIFT_LOW 3 +#endif -#define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_HIGH) -#define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT) +/* Maximum allocatable size */ +#define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_MAX) +/* Maximum size for which we actually use a slab cache */ +#define KMALLOC_MAX_CACHE_SIZE (1UL << KMALLOC_SHIFT_HIGH) +/* Maximum order allocatable via the slab allocagtor */ +#define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_MAX - PAGE_SHIFT)/* * Kmalloc subsystem.
@@ -176,15 +196,9 @@ struct kmem_cache {#if defined(ARCH_DMA_MINALIGN ) &&ARCH_DMA_MINALIGN >8 #define KMALLOC_MIN_SIZE ARCH_DMA_MINALIGN#else -#ifdef CONFIG_SLAB -#define KMALLOC_MIN_SIZE 32 -#else -#define KMALLOC_MIN_SIZE 8 -#endif +#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)#endif -#define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) -/* * Figure out which kmalloc slab an allocation of a certain size * belongs to.
include/linux/slub_def.h +3 -16
@@ -111,19 +111,6 @@ struct kmem_cache {struct kmem_cache_node *node[MAX_NUMNODES ]; }; -/* -* Maximum kmalloc object size handled by SLUB. Larger object allocations -* are passed through to the page allocator. The page allocator "fastpath" -* is relatively slow so we need this value sufficiently high so that -* performance critical objects are allocated through the SLUB fastpath. -* -* This should be dropped to PAGE_SIZE / 2 once the page allocator -* "fastpath" becomes competitive with the slab allocator fastpaths. -*/ -#define SLUB_MAX_SIZE (2 * PAGE_SIZE) - -#define SLUB_PAGE_SHIFT (PAGE_SHIFT + 2) -#ifdef CONFIG_ZONE_DMA #define SLUB_DMA __GFP_DMA#else
@@ -135,7 +122,7 @@ struct kmem_cache {* We keep the general caches in an array of slab caches that are used for * 2^x bytes of allocations. */ -extern struct kmem_cache *kmalloc_caches[SLUB_PAGE_SHIFT ]; +extern struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ];/* * Find the slab cache for a given combination of allocation flags and size.
@@ -204,7 +191,7 @@ static __always_inline void *kmalloc_lar static __always_inline void *kmalloc(size_t size, gfp_t flags) {if (__builtin_constant_p (size)) { -if (size >SLUB_MAX_SIZE ) +if (size >KMALLOC_MAX_CACHE_SIZE )return kmalloc_large (size, flags);if (!(flags &SLUB_DMA )) {
@@ -240,7 +227,7 @@ kmem_cache_alloc_node_trace(struct kmem_ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node) {if (__builtin_constant_p (size) && - size <=SLUB_MAX_SIZE && !(flags &SLUB_DMA )) { + size <=KMALLOC_MAX_CACHE_SIZE && !(flags &SLUB_DMA )) {struct kmem_cache *s =kmalloc_slab (size);if (!s)
mm/slub.c +11 -11
@@ -2776,7 +2776,7 @@ init_kmem_cache_node(struct kmem_cache_nstatic inline int alloc_kmem_cache_cpus (struct kmem_cache *s) {BUILD_BUG_ON (PERCPU_DYNAMIC_EARLY_SIZE < -SLUB_PAGE_SHIFT *sizeof (struct kmem_cache_cpu )); +KMALLOC_SHIFT_HIGH *sizeof (struct kmem_cache_cpu ));/* * Must align to double word boundary for the double cmpxchg
@@ -3164,11 +3164,11 @@ int __kmem_cache_shutdown(struct kmem_ca* Kmalloc subsystem *******************************************************************/ -struct kmem_cache *kmalloc_caches[SLUB_PAGE_SHIFT ]; +struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ];EXPORT_SYMBOL (kmalloc_caches);#ifdef CONFIG_ZONE_DMA -static struct kmem_cache *kmalloc_dma_caches[SLUB_PAGE_SHIFT ]; +static struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ];#endif static int __init setup_slub_min_order (char *str)
@@ -3270,7 +3270,7 @@ void *__kmalloc(size_t size, gfp_t flagsstruct kmem_cache *s;void *ret; -if (unlikely (size >SLUB_MAX_SIZE )) +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE ))return kmalloc_large (size, flags); s =get_slab (size, flags);
@@ -3306,7 +3306,7 @@ void *__kmalloc_node(size_t size, gfp_tstruct kmem_cache *s;void *ret; -if (unlikely (size >SLUB_MAX_SIZE )) { +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) { ret =kmalloc_large_node (size, flags, node); trace_kmalloc_node(_RET_IP_, ret,
@@ -3711,7 +3711,7 @@ void __init kmem_cache_init(void) caches++; } -for (i =KMALLOC_SHIFT_LOW ; i <SLUB_PAGE_SHIFT ; i++) { +for (i =KMALLOC_SHIFT_LOW ; i <=KMALLOC_SHIFT_HIGH ; i++) { kmalloc_caches[i] =create_kmalloc_cache ("kmalloc" ,1 << i,0 ); caches++; }
@@ -3729,7 +3729,7 @@ void __init kmem_cache_init(void)BUG_ON (!kmalloc_caches[2 ]->name); } -for (i =KMALLOC_SHIFT_LOW ; i <SLUB_PAGE_SHIFT ; i++) { +for (i =KMALLOC_SHIFT_LOW ; i <=KMALLOC_SHIFT_HIGH ; i++) {char *s =kasprintf (GFP_NOWAIT ,"kmalloc-%d" ,1 << i);BUG_ON (!s);
@@ -3741,7 +3741,7 @@ void __init kmem_cache_init(void)#endif #ifdef CONFIG_ZONE_DMA -for (i =0 ; i <SLUB_PAGE_SHIFT ; i++) { +for (i =0 ; i <=KMALLOC_SHIFT_HIGH ; i++) {struct kmem_cache *s = kmalloc_caches[i];if (s && s->size) {
@@ -3915,7 +3915,7 @@ void *__kmalloc_track_caller(size_t sizestruct kmem_cache *s;void *ret; -if (unlikely (size >SLUB_MAX_SIZE )) +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE ))return kmalloc_large (size, gfpflags); s =get_slab (size, gfpflags);
@@ -3938,7 +3938,7 @@ void *__kmalloc_node_track_caller(size_tstruct kmem_cache *s;void *ret; -if (unlikely (size >SLUB_MAX_SIZE )) { +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) { ret =kmalloc_large_node (size, gfpflags, node); trace_kmalloc_node(caller, ret,
@@ -4297,7 +4297,7 @@ static void resiliency_test(void) {u8 *p; -BUILD_BUG_ON (KMALLOC_MIN_SIZE >16 ||SLUB_PAGE_SHIFT <10 ); +BUILD_BUG_ON (KMALLOC_MIN_SIZE >16 ||KMALLOC_SHIFT_HIGH <10 );printk (KERN_ERR "SLUB resiliency testing\n" );printk (KERN_ERR "-----------------------\n" );
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [11/12] Common Kmalloc cache determination
In reply to a message not in the archiveExtract the optimized lookup functions from slub and put them into slab_common.c. Then make slab use these functions as well.
Joonsoo notes that this fixes some issues with constant folding which also reduces the code size for slub.
https://lkml.org/lkml/2012/10/20/82
mm/slab.c +3 -37
@@ -629,40 +629,6 @@ static inline struct array_cache *cpu_careturn cachep->array[smp_processor_id ()]; } -static inline struct kmem_cache *__find_general_cachep (size_t size, -gfp_t gfpflags) -{ -int i; - -#if DEBUG -/* This happens if someone tries to call -* kmem_cache_create(), or __kmalloc(), before -* the generic caches are initialized. -*/ -BUG_ON (kmalloc_caches[INDEX_AC ] ==NULL ); -#endif -if (!size) -return ZERO_SIZE_PTR ; - - i =kmalloc_index (size); - -/* -* Really subtle: The last entry with cs->cs_size==ULONG_MAX -* has cs_{dma,}cachep==NULL. Thus no special case -* for large kmalloc calls required. -*/ -#ifdef CONFIG_ZONE_DMA -if (unlikely (gfpflags &GFP_DMA )) -return kmalloc_dma_caches[i]; -#endif -return kmalloc_caches[i]; -} - -static struct kmem_cache *kmem_find_general_cachep (size_t size,gfp_t gfpflags) -{ -return __find_general_cachep (size, gfpflags); -} -static size_t slab_mgmt_size (size_t nr_objs,size_t align) {return ALIGN (sizeof (struct slab )+nr_objs*sizeof (kmem_bufctl_t), align);
@@ -2393,7 +2359,7 @@ __kmem_cache_create (struct kmem_cache * cachep->reciprocal_buffer_size =reciprocal_value (size);if (flags &CFLGS_OFF_SLAB ) { - cachep->slabp_cache =kmem_find_general_cachep (slab_size,0u ); + cachep->slabp_cache =kmalloc_slab (slab_size,0u );/* * This is a possibility for one of the malloc_sizes caches. * But since we go off slab only for object size greater than
@@ -3691,7 +3657,7 @@ __do_kmalloc_node(size_t size, gfp_t fla {struct kmem_cache *cachep; - cachep =kmem_find_general_cachep (size, flags); + cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep;return kmem_cache_alloc_node_trace (cachep, flags, node, size);
@@ -3736,7 +3702,7 @@ static __always_inline void *__do_kmallo* Then kmalloc uses the uninlined functions instead of the inline * functions. */ - cachep =__find_general_cachep (size, flags); + cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep; ret =slab_alloc (cachep, flags, caller);
mm/slab.h +3 -0
@@ -38,6 +38,9 @@ unsigned long calculate_alignment(unsign#ifndef CONFIG_SLOB /* Kmalloc array related functions */ void create_kmalloc_caches (unsigned long ); + +/* Find the kmalloc slab corresponding for a certain size */ +struct kmem_cache *kmalloc_slab (size_t ,gfp_t );#endif
mm/slab_common.c +103 -2
123 lines not on this page · raw message
mm/slub.c +5 -103
156 lines not on this page · raw message
include/linux/slub_def.h +10 -31
65 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [08/12] Common definition for the array of kmalloc caches
In reply to a message not in the archiveHave a common definition fo the kmalloc cache arrays in SLAB and SLUB
mm/slab_common.c +8 -0
@@ -263,6 +263,14 @@ struct kmem_cache *__init create_kmalloc return s; } +struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; +EXPORT_SYMBOL (kmalloc_caches); + +#ifdef CONFIG_ZONE_DMA +struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ]; +EXPORT_SYMBOL (kmalloc_dma_caches); +#endif +#endif /* !CONFIG_SLOB */
include/linux/slub_def.h +0 -6
@@ -119,12 +119,6 @@ struct kmem_cache {#endif /* -* We keep the general caches in an array of slab caches that are used for -* 2^x bytes of allocations. -*/ -extern struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; - -/* * Find the slab cache for a given combination of allocation flags and size. * * This ought to end up with a global pointer to the right cache
mm/slub.c +0 -7
@@ -3164,13 +3164,6 @@ int __kmem_cache_shutdown(struct kmem_ca* Kmalloc subsystem *******************************************************************/ -struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; -EXPORT_SYMBOL (kmalloc_caches); - -#ifdef CONFIG_ZONE_DMA -static struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ]; -#endif -static int __init setup_slub_min_order (char *str) {get_option (&str, &slub_min_order);
include/linux/slab.h +5 -0
@@ -199,6 +199,11 @@ struct kmem_cache {#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)#endif +extern struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; +#ifdef CONFIG_ZONE_DMA +extern struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ]; +#endif +/* * Figure out which kmalloc slab an allocation of a certain size * belongs to.
mm/slab.c +0 -8
@@ -317,14 +317,6 @@ static void free_block(struct kmem_cachestatic int enable_cpucache (struct kmem_cache *cachep,gfp_t gfp);static void cache_reap (struct work_struct *unused); -struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; -EXPORT_SYMBOL (kmalloc_caches); - -#ifdef CONFIG_ZONE_DMA -struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ]; -EXPORT_SYMBOL (kmalloc_dma_caches); -#endif -static int slab_early_init =1 ;#define INDEX_AC kmalloc_index(sizeof(struct arraycache_init))
include/linux/slab_def.h +0 -3
@@ -99,9 +99,6 @@ struct kmem_cache {*/ }; -extern struct kmem_cache *kmalloc_caches[PAGE_SHIFT +MAX_ORDER ]; -extern struct kmem_cache *kmalloc_dma_caches[PAGE_SHIFT +MAX_ORDER ]; -void *kmem_cache_alloc (struct kmem_cache *,gfp_t );void *__kmalloc (size_t size,gfp_t flags);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [04/12] slab: Use common kmalloc_index/kmalloc_size functions
In reply to a message not in the archiveMake slab use the common functions. We can get rid of a lot of old ugly stuff as a results. Among them the sizes array and the weird include/linux/kmalloc_sizes file and some pretty bad #include statements in slab_def.h.
The one thing that is different in slab is that the 32 byte cache will also be created for arches that have page sizes larger than 4K. There are numerous smaller allocations that SLOB and SLUB can handle better because of their support for smaller allocation sizes so lets keep the 32 byte slab also for arches with > 4K pages.
mm/slab.c +76 -93
@@ -317,34 +317,18 @@ static void free_block(struct kmem_cachestatic int enable_cpucache (struct kmem_cache *cachep,gfp_t gfp);static void cache_reap (struct work_struct *unused); -/* -* This function must be completely optimized away if a constant is passed to -* it. Mostly the same as what is in linux/slab.h except it returns an index. -*/ -static __always_inline int index_of(const size_t size) -{ -extern void __bad_size (void ); +struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +1 ]; +EXPORT_SYMBOL (kmalloc_caches); -if (__builtin_constant_p (size)) { -int i =0 ; - -#define CACHE (x) \ - if (size <=x) \ - return i; \ - else \ - i++; -#include <linux/kmalloc_sizes.h> -#undef CACHE -__bad_size (); - }else -__bad_size (); -return 0 ; -} +#ifdef CONFIG_ZONE_DMA +struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH +1 ]; +EXPORT_SYMBOL (kmalloc_dma_caches); +#endif static int slab_early_init =1 ; -#define INDEX_AC index_of(sizeof(struct arraycache_init)) -#define INDEX_L3 index_of(sizeof(struct kmem_list3)) +#define INDEX_AC kmalloc_index(sizeof(struct arraycache_init)) +#define INDEX_L3 kmalloc_index(sizeof(struct kmem_list3))static void kmem_list3_init (struct kmem_list3 *parent) {
@@ -523,30 +507,6 @@ static inline unsigned int obj_to_index(return reciprocal_divide (offset, cache->reciprocal_buffer_size); } -/* -* These are the default caches for kmalloc. Custom caches can have other sizes. -*/ -struct cache_sizes malloc_sizes[] = { -#define CACHE(x) { .cs_size = (x) }, -#include <linux/kmalloc_sizes.h> -CACHE (ULONG_MAX ) -#undef CACHE -}; -EXPORT_SYMBOL (malloc_sizes); - -/* Must match cache_sizes above. Out of line to keep cache footprint low. */ -struct cache_names { -char *name; -char *name_dma; -}; - -static struct cache_names __initdata cache_names[] = { -#define CACHE(x) { .name = "size-" #x, .name_dma = "size-" #x "(DMA)" }, -#include <linux/kmalloc_sizes.h> - {NULL,} -#undef CACHE -}; -static struct arraycache_init initarray_generic = { {0 ,BOOT_CPUCACHE_ENTRIES ,1 ,0 } };
@@ -624,19 +584,23 @@ static void slab_set_debugobj_lock_classstatic void init_node_lock_keys (int q) { -struct cache_sizes *s = malloc_sizes; +int i;if (slab_state <UP )return ; -for (s = malloc_sizes; s->cs_size !=ULONG_MAX ; s++) { +for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) {struct kmem_list3 *l3; +struct kmem_cache *cache = kmalloc_caches[i]; + +if (!cache) +continue ; - l3 = s->cs_cachep->nodelists[q]; -if (!l3 ||OFF_SLAB (s->cs_cachep)) + l3 = cache->nodelists[q]; +if (!l3 ||OFF_SLAB (cache))continue ; -slab_set_lock_classes (s->cs_cachep, &on_slab_l3_key, +slab_set_lock_classes (cache, &on_slab_l3_key, &on_slab_alc_key, q); } }
@@ -676,20 +640,19 @@ static inline struct array_cache *cpu_castatic inline struct kmem_cache *__find_general_cachep (size_t size,gfp_t gfpflags) { -struct cache_sizes *csizep = malloc_sizes; +int i;#if DEBUG /* This happens if someone tries to call * kmem_cache_create(), or __kmalloc(), before * the generic caches are initialized. */ -BUG_ON (malloc_sizes[INDEX_AC ].cs_cachep ==NULL ); +BUG_ON (kmalloc_caches[INDEX_AC ] ==NULL );#endif if (!size)return ZERO_SIZE_PTR ; -while (size > csizep->cs_size) - csizep++; + i =kmalloc_index (size);/* * Really subtle: The last entry with cs->cs_size==ULONG_MAX
@@ -698,9 +661,9 @@ static inline struct kmem_cache *__find_*/ #ifdef CONFIG_ZONE_DMA if (unlikely (gfpflags &GFP_DMA )) -return csizep->cs_dmacachep; +return kmalloc_dma_caches[i];#endif -return csizep->cs_cachep; +return kmalloc_caches[i]; }static struct kmem_cache *kmem_find_general_cachep (size_t size,gfp_t gfpflags)
@@ -1570,8 +1533,6 @@ static void setup_nodelists_pointer(stru*/ void __init kmem_cache_init (void ) { -struct cache_sizes *sizes; -struct cache_names *names;int i; kmem_cache = &kmem_cache_boot;
@@ -1625,8 +1586,6 @@ void __init kmem_cache_init(void)list_add (&kmem_cache->list, &slab_caches);/* 2+3) create the kmalloc caches */ - sizes = malloc_sizes; - names = cache_names;/* * Initialize the caches that provide memory for the array cache and the
@@ -1634,35 +1593,39 @@ void __init kmem_cache_init(void)* bug. */ - sizes[INDEX_AC ].cs_cachep =create_kmalloc_cache (names[INDEX_AC ].name, - sizes[INDEX_AC ].cs_size,ARCH_KMALLOC_FLAGS ); + kmalloc_caches[INDEX_AC ] =create_kmalloc_cache ("kmalloc-ac" , +kmalloc_size (INDEX_AC ),ARCH_KMALLOC_FLAGS );if (INDEX_AC !=INDEX_L3 ) - sizes[INDEX_L3 ].cs_cachep = -create_kmalloc_cache (names[INDEX_L3 ].name, - sizes[INDEX_L3 ].cs_size,ARCH_KMALLOC_FLAGS ); + kmalloc_caches[INDEX_L3 ] = +create_kmalloc_cache ("kmalloc-l3" , +kmalloc_size (INDEX_L3 ),ARCH_KMALLOC_FLAGS ); slab_early_init =0 ; -while (sizes->cs_size !=ULONG_MAX ) { -/* -* For performance, all the general caches are L1 aligned. -* This should be particularly beneficial on SMP boxes, as it -* eliminates "false sharing". -* Note for systems short on memory removing the alignment will -* allow tighter packing of the smaller caches. -*/ -if (!sizes->cs_cachep) - sizes->cs_cachep =create_kmalloc_cache (names->name, - sizes->cs_size,ARCH_KMALLOC_FLAGS ); +for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) { +size_t cs_size =kmalloc_size (i); + +if (cs_size <KMALLOC_MIN_SIZE ) +continue ; + +if (!kmalloc_caches[i]) { +/* +* For performance, all the general caches are L1 aligned. +* This should be particularly beneficial on SMP boxes, as it +* eliminates "false sharing". +* Note for systems short on memory removing the alignment will +* allow tighter packing of the smaller caches. +*/ + kmalloc_caches[i] =create_kmalloc_cache ("kmalloc" , + cs_size,ARCH_KMALLOC_FLAGS ); + }#ifdef CONFIG_ZONE_DMA - sizes->cs_dmacachep =create_kmalloc_cache ( - names->name_dma, sizes->cs_size, + kmalloc_dma_caches[i] =create_kmalloc_cache ( +"kmalloc-dma" , cs_size,SLAB_CACHE_DMA |ARCH_KMALLOC_FLAGS );#endif - sizes++; - names++; }/* 4) Replace the bootstrap head arrays */ {
@@ -1681,17 +1644,16 @@ void __init kmem_cache_init(void) ptr =kmalloc (sizeof (struct arraycache_init ),GFP_NOWAIT ); -BUG_ON (cpu_cache_get (malloc_sizes[INDEX_AC ].cs_cachep) +BUG_ON (cpu_cache_get (kmalloc_caches[INDEX_AC ]) != &initarray_generic.cache); -memcpy (ptr,cpu_cache_get (malloc_sizes[INDEX_AC ].cs_cachep), +memcpy (ptr,cpu_cache_get (kmalloc_caches[INDEX_AC ]),sizeof (struct arraycache_init ));/* * Do not assume that spinlocks can be initialized via memcpy: */ spin_lock_init (&ptr->lock); - malloc_sizes[INDEX_AC ].cs_cachep->array[smp_processor_id ()] = - ptr; + kmalloc_caches[INDEX_AC ]->array[smp_processor_id ()] = ptr; }/* 5) Replace the bootstrap kmem_list3's */ {
@@ -1700,17 +1662,39 @@ void __init kmem_cache_init(void)for_each_online_node (nid) {init_list (kmem_cache, &initkmem_list3[CACHE_CACHE + nid], nid); -init_list (malloc_sizes[INDEX_AC ].cs_cachep, +init_list (kmalloc_caches[INDEX_AC ], &initkmem_list3[SIZE_AC + nid], nid);if (INDEX_AC !=INDEX_L3 ) { -init_list (malloc_sizes[INDEX_L3 ].cs_cachep, +init_list (kmalloc_caches[INDEX_L3 ], &initkmem_list3[SIZE_L3 + nid], nid); } } } slab_state =UP ; + +/* Create the proper names */ +for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) { +char *s; +struct kmem_cache *c = kmalloc_caches[i]; + +if (!c) +continue ; + + s =kasprintf (GFP_NOWAIT ,"kmalloc-%d" ,kmalloc_size (i)); + +BUG_ON (!s); + c->name = s; + +#ifdef CONFIG_ZONE_DMA + c = kmalloc_dma_caches[i]; +BUG_ON (!c); + s =kasprintf (GFP_NOWAIT ,"dma-kmalloc-%d" ,kmalloc_size (i)); +BUG_ON (!s); + c->name = s; +#endif + } }void __init kmem_cache_init_late (void )
@@ -2396,10 +2380,9 @@ __kmem_cache_create (struct kmem_cache * size +=BYTES_PER_WORD ; }#if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC ) -if (size >= malloc_sizes[INDEX_L3 +1 ].cs_size - && cachep->object_size >cache_line_size () - &&ALIGN (size, cachep->align) <PAGE_SIZE ) { - cachep->obj_offset +=PAGE_SIZE -ALIGN (size, cachep->align); +if (size >=kmalloc_size (INDEX_L3 +1 ) + && cachep->object_size >cache_line_size () &&ALIGN (size, align) <PAGE_SIZE ) { + cachep->obj_offset +=PAGE_SIZE -ALIGN (size, align); size =PAGE_SIZE ; }#endif
include/linux/kmalloc_sizes.h deleted +0 -45
45 lines not on this page · raw message
include/linux/slab_def.h +12 -35
87 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [05/12] slab: Common name for the per node structures
In reply to a message not in the archiveRename the structure used for the per node structures in slab to have a name that expresses that fact.
include/linux/slab_def.h +1 -1
@@ -92,7 +92,7 @@ struct kmem_cache {* pointer for each node since "nodelists" uses the remainder of * available pointers. */ -struct kmem_list3 **nodelists; +struct kmem_cache_node **nodelists;struct array_cache *array[NR_CPUS +MAX_NUMNODES ];/* * Do not add fields after array[]
mm/slab.c +41 -41
303 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [09/12] Common function to create the kmalloc array
In reply to a message not in the archiveThe kmalloc array is created in similar ways in both SLAB and SLUB. Create a common function and have both allocators call that function.
V1->V2:
Whitespace cleanup
mm/slab.c +1 -47
@@ -1595,30 +1595,6 @@ void __init kmem_cache_init(void) slab_early_init =0 ; -for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) { -size_t cs_size =kmalloc_size (i); - -if (cs_size <KMALLOC_MIN_SIZE ) -continue ; - -if (!kmalloc_caches[i]) { -/* -* For performance, all the general caches are L1 aligned. -* This should be particularly beneficial on SMP boxes, as it -* eliminates "false sharing". -* Note for systems short on memory removing the alignment will -* allow tighter packing of the smaller caches. -*/ - kmalloc_caches[i] =create_kmalloc_cache ("kmalloc" , - cs_size,ARCH_KMALLOC_FLAGS ); - } - -#ifdef CONFIG_ZONE_DMA - kmalloc_dma_caches[i] =create_kmalloc_cache ( -"kmalloc-dma" , cs_size, -SLAB_CACHE_DMA |ARCH_KMALLOC_FLAGS ); -#endif - }/* 4) Replace the bootstrap head arrays */ {struct array_cache *ptr;
@@ -1664,29 +1640,7 @@ void __init kmem_cache_init(void) } } - slab_state =UP ; - -/* Create the proper names */ -for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) { -char *s; -struct kmem_cache *c = kmalloc_caches[i]; - -if (!c) -continue ; - - s =kasprintf (GFP_NOWAIT ,"kmalloc-%d" ,kmalloc_size (i)); - -BUG_ON (!s); - c->name = s; - -#ifdef CONFIG_ZONE_DMA - c = kmalloc_dma_caches[i]; -BUG_ON (!c); - s =kasprintf (GFP_NOWAIT ,"dma-kmalloc-%d" ,kmalloc_size (i)); -BUG_ON (!s); - c->name = s; -#endif - } +create_kmalloc_caches (ARCH_KMALLOC_FLAGS ); }void __init kmem_cache_init_late (void )
mm/slab.h +6 -0
@@ -35,6 +35,12 @@ extern struct kmem_cache *kmem_cache;unsigned long calculate_alignment (unsigned long flags,unsigned long align,unsigned long size); +#ifndef CONFIG_SLOB +/* Kmalloc array related functions */ +void create_kmalloc_caches (unsigned long ); +#endif + +/* Functions provided by the slab allocators */ extern int __kmem_cache_create (struct kmem_cache *,unsigned long flags);
mm/slab_common.c +54 -0
60 lines not on this page · raw message
mm/slub.c +3 -52
74 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [12/12] slab: Rename list3/l3 to node
In reply to a message not in the archiveThe list3 or l3 pointers are pointing to per node structures. Reflect that in the names of variables used.
mm/slab.c +258 -258
@@ -305,13 +305,13 @@ struct kmem_cache_node {* Need this for bootstrapping a per node allocator. */ #define NUM_INIT_LISTS (3 * MAX_NUMNODES) -static struct kmem_cache_node __initdata initkmem_list3[NUM_INIT_LISTS ]; +static struct kmem_cache_node __initdata init_kmem_cache_node[NUM_INIT_LISTS ];#define CACHE_CACHE 0#define SIZE_AC MAX_NUMNODES -#define SIZE_L3 (2 * MAX_NUMNODES) +#define SIZE_NODE (2 * MAX_NUMNODES)static int drain_freelist (struct kmem_cache *cache, -struct kmem_cache_node *l3,int tofree); +struct kmem_cache_node *n,int tofree);static void free_block (struct kmem_cache *cachep,void **objpp,int len,int node);static int enable_cpucache (struct kmem_cache *cachep,gfp_t gfp);
@@ -320,9 +320,9 @@ static void cache_reap(struct work_strucstatic int slab_early_init =1 ;#define INDEX_AC kmalloc_index(sizeof(struct arraycache_init)) -#define INDEX_L3 kmalloc_index(sizeof(struct kmem_cache_node)) +#define INDEX_NODE kmalloc_index(sizeof(struct kmem_cache_node)) -static void kmem_list3_init (struct kmem_cache_node *parent) +static void kmem_cache_node_init (struct kmem_cache_node *parent) {INIT_LIST_HEAD (&parent->slabs_full);INIT_LIST_HEAD (&parent->slabs_partial);
@@ -537,15 +537,15 @@ static void slab_set_lock_classes(struct int q) {struct array_cache **alc; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;int r; - l3 = cachep->node[q]; -if (!l3) + n = cachep->node[q]; +if (!n)return ; -lockdep_set_class (&l3->list_lock, l3_key); - alc = l3->alien; +lockdep_set_class (&n->list_lock, l3_key); + alc = n->alien;/* * FIXME: This check for BAD_ALIEN_MAGIC * should go away when common slab code is taught to
@@ -582,14 +582,14 @@ static void init_node_lock_keys(int q)return ;for (i =1 ; i <PAGE_SHIFT +MAX_ORDER ; i++) { -struct kmem_cache_node *l3; +struct kmem_cache_node *n;struct kmem_cache *cache = kmalloc_caches[i];if (!cache)continue ; - l3 = cache->node[q]; -if (!l3 ||OFF_SLAB (cache)) + n = cache->node[q]; +if (!n ||OFF_SLAB (cache))continue ; slab_set_lock_classes(cache, &on_slab_l3_key,
@@ -830,29 +830,29 @@ static inline bool is_slab_pfmemalloc(ststatic void recheck_pfmemalloc_active (struct kmem_cache *cachep,struct array_cache *ac) { -struct kmem_cache_node *l3 = cachep->node[numa_mem_id ()]; +struct kmem_cache_node *n = cachep->node[numa_mem_id ()];struct slab *slabp;unsigned long flags;if (!pfmemalloc_active)return ; -spin_lock_irqsave (&l3->list_lock, flags); -list_for_each_entry (slabp, &l3->slabs_full, list) +spin_lock_irqsave (&n->list_lock, flags); +list_for_each_entry (slabp, &n->slabs_full, list)if (is_slab_pfmemalloc (slabp)) goto out; -list_for_each_entry (slabp, &l3->slabs_partial, list) +list_for_each_entry (slabp, &n->slabs_partial, list)if (is_slab_pfmemalloc (slabp)) goto out; -list_for_each_entry (slabp, &l3->slabs_free, list) +list_for_each_entry (slabp, &n->slabs_free, list)if (is_slab_pfmemalloc (slabp)) goto out; pfmemalloc_active = false; out: -spin_unlock_irqrestore (&l3->list_lock, flags); +spin_unlock_irqrestore (&n->list_lock, flags); } static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
@@ -863,7 +863,7 @@ static void *__ac_get_obj(struct kmem_ca/* Ensure the caller is allowed to use objects from PFMEMALLOC slab */ if (unlikely (is_obj_pfmemalloc (objp))) { -struct kmem_cache_node *l3; +struct kmem_cache_node *n;if (gfp_pfmemalloc_allowed (flags)) {clear_obj_pfmemalloc (&objp);
@@ -885,8 +885,8 @@ static void *__ac_get_obj(struct kmem_ca* If there are empty slabs on the slabs_free list and we are * being forced to refill the cache, mark this one !pfmemalloc. */ - l3 = cachep->node[numa_mem_id ()]; -if (!list_empty (&l3->slabs_free) && force_refill) { + n = cachep->node[numa_mem_id ()]; +if (!list_empty (&n->slabs_free) && force_refill) {struct slab *slabp =virt_to_slab (objp);ClearPageSlabPfmemalloc (virt_to_head_page (slabp->s_mem));clear_obj_pfmemalloc (&objp);
@@ -963,7 +963,7 @@ static int transfer_objects(struct array#ifndef CONFIG_NUMA #define drain_alien_cache (cachep, alien) do { } while (0) -#define reap_alien (cachep, l3) do { } while (0) +#define reap_alien (cachep, n) do { } while (0)static inline struct array_cache **alloc_alien_cache (int node,int limit,gfp_t gfp) {
@@ -1035,33 +1035,33 @@ static void free_alien_cache(struct arrastatic void __drain_alien_cache (struct kmem_cache *cachep,struct array_cache *ac,int node) { -struct kmem_cache_node *rl3 = cachep->node[node]; +struct kmem_cache_node *n = cachep->node[node];if (ac->avail) { -spin_lock (&rl3->list_lock); +spin_lock (&n->list_lock);/* * 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. */ -if (rl3->shared) -transfer_objects (rl3->shared, ac, ac->limit); +if (n->shared) +transfer_objects (n->shared, ac, ac->limit);free_block (cachep, ac->entry, ac->avail, node); ac->avail =0 ; -spin_unlock (&rl3->list_lock); +spin_unlock (&n->list_lock); } }/* * Called from cache_reap() to regularly drain alien caches round robin. */ -static void reap_alien (struct kmem_cache *cachep,struct kmem_cache_node *l3) +static void reap_alien (struct kmem_cache *cachep,struct kmem_cache_node *n) {int node =__this_cpu_read (slab_reap_node); -if (l3->alien) { -struct array_cache *ac = l3->alien[node]; +if (n->alien) { +struct array_cache *ac = n->alien[node];if (ac && ac->avail &&spin_trylock_irq (&ac->lock)) {__drain_alien_cache (cachep, ac, node);
@@ -1091,7 +1091,7 @@ static inline int cache_free_alien(struc {struct slab *slabp =virt_to_slab (objp);int nodeid = slabp->nodeid; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;struct array_cache *alien =NULL ;int node;
@@ -1104,10 +1104,10 @@ static inline int cache_free_alien(strucif (likely (slabp->nodeid == node))return 0 ; - l3 = cachep->node[node]; + n = cachep->node[node];STATS_INC_NODEFREES (cachep); -if (l3->alien && l3->alien[nodeid]) { - alien = l3->alien[nodeid]; +if (n->alien && n->alien[nodeid]) { + alien = n->alien[nodeid];spin_lock (&alien->lock);if (unlikely (alien->avail == alien->limit)) {STATS_INC_ACOVERFLOW (cachep);
@@ -1126,7 +1126,7 @@ static inline int cache_free_alien(struc/* * Allocates and initializes node for a node on each slab cache, used for -* either memory or cpu hotplug. If memory is being hot-added, the kmem_list3 +* either memory or cpu hotplug. If memory is being hot-added, the kmem_cache_node * will be allocated off-node since memory is not yet online for the new node. * When hotplugging memory or a cpu, existing node are not replaced if * already in use.
@@ -1136,7 +1136,7 @@ static inline int cache_free_alien(strucstatic int init_cache_node_node (int node) {struct kmem_cache *cachep; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;const int memsize =sizeof (struct kmem_cache_node );list_for_each_entry (cachep, &slab_caches, list) {
@@ -1146,11 +1146,11 @@ static int init_cache_node_node(int node* node has not already allocated this */ if (!cachep->node[node]) { - l3 =kmalloc_node (memsize,GFP_KERNEL , node); -if (!l3) + n =kmalloc_node (memsize,GFP_KERNEL , node); +if (!n)return -ENOMEM ; -kmem_list3_init (l3); - l3->next_reap = jiffies +REAPTIMEOUT_LIST3 + +kmem_cache_node_init (n); + n->next_reap = jiffies +REAPTIMEOUT_LIST3 + ((unsigned long )cachep) %REAPTIMEOUT_LIST3 ;/*
@@ -1158,7 +1158,7 @@ static int init_cache_node_node(int node* go. slab_mutex is sufficient * protection here. */ - cachep->node[node] = l3; + cachep->node[node] = n; }spin_lock_irq (&cachep->node[node]->list_lock);
@@ -1173,7 +1173,7 @@ static int init_cache_node_node(int nodestatic void __cpuinit cpuup_canceled (long cpu) {struct kmem_cache *cachep; -struct kmem_cache_node *l3 =NULL ; +struct kmem_cache_node *n =NULL ;int node =cpu_to_mem (cpu);const struct cpumask *mask =cpumask_of_node (node);
@@ -1185,34 +1185,34 @@ static void __cpuinit cpuup_canceled(lon/* cpu is dead; no one can alloc from it. */ nc = cachep->array[cpu]; cachep->array[cpu] =NULL ; - l3 = cachep->node[node]; + n = cachep->node[node]; -if (!l3) +if (!n) goto free_array_cache; -spin_lock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock); -/* Free limit for this kmem_list3 */ - l3->free_limit -= cachep->batchcount; +/* Free limit for this kmem_cache_node */ + n->free_limit -= cachep->batchcount;if (nc)free_block (cachep, nc->entry, nc->avail, node);if (!cpumask_empty (mask)) { -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock); goto free_array_cache; } - shared = l3->shared; + shared = n->shared;if (shared) {free_block (cachep, shared->entry, shared->avail, node); - l3->shared =NULL ; + n->shared =NULL ; } - alien = l3->alien; - l3->alien =NULL ; + alien = n->alien; + n->alien =NULL ; -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock);kfree (shared);if (alien) {
@@ -1228,17 +1228,17 @@ free_array_cache:* shrink each nodelist to its limit. */ list_for_each_entry (cachep, &slab_caches, list) { - l3 = cachep->node[node]; -if (!l3) + n = cachep->node[node]; +if (!n)continue ; -drain_freelist (cachep, l3, l3->free_objects); +drain_freelist (cachep, n, n->free_objects); } }static int __cpuinit cpuup_prepare (long cpu) {struct kmem_cache *cachep; -struct kmem_cache_node *l3 =NULL ; +struct kmem_cache_node *n =NULL ;int node =cpu_to_mem (cpu);int err;
@@ -1246,7 +1246,7 @@ static int __cpuinit cpuup_prepare(long* 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 -* kmem_list3 and not this cpu's kmem_list3 +* kmem_cache_node and not this cpu's kmem_cache_node */ err =init_cache_node_node (node);if (err <0 )
@@ -1283,25 +1283,25 @@ static int __cpuinit cpuup_prepare(long } } cachep->array[cpu] = nc; - l3 = cachep->node[node]; -BUG_ON (!l3); + n = cachep->node[node]; +BUG_ON (!n); -spin_lock_irq (&l3->list_lock); -if (!l3->shared) { +spin_lock_irq (&n->list_lock); +if (!n->shared) {/* * We are serialised from CPU_DEAD or * CPU_UP_CANCELLED by the cpucontrol lock */ - l3->shared = shared; + n->shared = shared; shared =NULL ; }#ifdef CONFIG_NUMA -if (!l3->alien) { - l3->alien = alien; +if (!n->alien) { + n->alien = alien; alien =NULL ; }#endif -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock);kfree (shared);free_alien_cache (alien);if (cachep->flags &SLAB_DEBUG_OBJECTS )
@@ -1353,9 +1353,9 @@ static int __cpuinit cpuup_callback(strucase CPU_DEAD_FROZEN :/* * 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 +* kmem_cache_node 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 +* memory from the node of the cpu going down. The node * structure is usually allocated from kmem_cache_create() and * gets destroyed at kmem_cache_destroy(). */
@@ -1389,16 +1389,16 @@ static int __meminit drain_cache_node_noint ret =0 ;list_for_each_entry (cachep, &slab_caches, list) { -struct kmem_cache_node *l3; +struct kmem_cache_node *n; - l3 = cachep->node[node]; -if (!l3) + n = cachep->node[node]; +if (!n)continue ; -drain_freelist (cachep, l3, l3->free_objects); +drain_freelist (cachep, n, n->free_objects); -if (!list_empty (&l3->slabs_full) || - !list_empty (&l3->slabs_partial)) { +if (!list_empty (&n->slabs_full) || + !list_empty (&n->slabs_partial)) { ret = -EBUSY ;break ; }
@@ -1440,7 +1440,7 @@ out:#endif /* CONFIG_NUMA && CONFIG_MEMORY_HOTPLUG */ /* -* swap the static kmem_list3 with kmalloced memory +* swap the static kmem_cache_node with kmalloced memory */ static void __init init_list (struct kmem_cache *cachep,struct kmem_cache_node *list,int nodeid)
@@ -1461,15 +1461,15 @@ static void __init init_list(struct kmem }/* -* For setting up all the kmem_list3s for cache whose buffer_size is same as -* size of kmem_list3. +* For setting up all the kmem_cache_node for cache whose buffer_size is same as +* size of kmem_cache_node. */ -static void __init set_up_list3s (struct kmem_cache *cachep,int index) +static void __init set_up_node (struct kmem_cache *cachep,int index) {int node;for_each_online_node (node) { - cachep->node[node] = &initkmem_list3[index + node]; + cachep->node[node] = &init_kmem_cache_node[index + node]; cachep->node[node]->next_reap = jiffies +REAPTIMEOUT_LIST3 + ((unsigned long )cachep) %REAPTIMEOUT_LIST3 ;
@@ -1500,9 +1500,9 @@ void __init kmem_cache_init(void) use_alien_caches =0 ;for (i =0 ; i <NUM_INIT_LISTS ; i++) -kmem_list3_init (&initkmem_list3[i]); +kmem_cache_node_init (&init_kmem_cache_node[i]); -set_up_list3s (kmem_cache,CACHE_CACHE ); +set_up_node (kmem_cache,CACHE_CACHE );/* * Fragmentation resistance on low memory - only use bigger
@@ -1518,7 +1518,7 @@ void __init kmem_cache_init(void)* kmem_cache structures of all caches, except kmem_cache itself: * kmem_cache is statically allocated. * Initially an __init data area is used for the head array and the -* kmem_list3 structures, it's replaced with a kmalloc allocated +* kmem_cache_node structures, it's replaced with a kmalloc allocated * array at the end of the bootstrap. * 2) Create the first kmalloc cache. * The struct kmem_cache for the new cache is allocated normally.
@@ -1527,7 +1527,7 @@ void __init kmem_cache_init(void)* head arrays. * 4) Replace the __init data head arrays for kmem_cache and the first * kmalloc cache with kmalloc allocated arrays. -* 5) Replace the __init data for kmem_list3 for kmem_cache and +* 5) Replace the __init data for kmem_cache_node for kmem_cache and * the other cache's with kmalloc allocated memory. * 6) Resize the head arrays of the kmalloc caches to their final sizes. */
@@ -1547,17 +1547,17 @@ void __init kmem_cache_init(void)/* * Initialize the caches that provide memory for the array cache and the -* kmem_list3 structures first. Without this, further allocations will +* kmem_cache_node structures first. Without this, further allocations will * bug. */ kmalloc_caches[INDEX_AC ] =create_kmalloc_cache ("kmalloc-ac" ,kmalloc_size (INDEX_AC ),ARCH_KMALLOC_FLAGS ); -if (INDEX_AC !=INDEX_L3 ) - kmalloc_caches[INDEX_L3 ] = -create_kmalloc_cache ("kmalloc-l3" , -kmalloc_size (INDEX_L3 ),ARCH_KMALLOC_FLAGS ); +if (INDEX_AC !=INDEX_NODE ) + kmalloc_caches[INDEX_NODE ] = +create_kmalloc_cache ("kmalloc-node" , +kmalloc_size (INDEX_NODE ),ARCH_KMALLOC_FLAGS ); slab_early_init =0 ;
@@ -1589,19 +1589,19 @@ void __init kmem_cache_init(void) kmalloc_caches[INDEX_AC ]->array[smp_processor_id ()] = ptr; } -/* 5) Replace the bootstrap kmem_list3's */ +/* 5) Replace the bootstrap kmem_cache_node */ {int nid;for_each_online_node (nid) { -init_list (kmem_cache, &initkmem_list3[CACHE_CACHE + nid], nid); +init_list (kmem_cache, &init_kmem_cache_node[CACHE_CACHE + nid], nid);init_list (kmalloc_caches[INDEX_AC ], - &initkmem_list3[SIZE_AC + nid], nid); + &init_kmem_cache_node[SIZE_AC + nid], nid); -if (INDEX_AC !=INDEX_L3 ) { -init_list (kmalloc_caches[INDEX_L3 ], - &initkmem_list3[SIZE_L3 + nid], nid); +if (INDEX_AC !=INDEX_NODE ) { +init_list (kmalloc_caches[INDEX_NODE ], + &init_kmem_cache_node[SIZE_NODE + nid], nid); } } }
@@ -1667,7 +1667,7 @@ __initcall(cpucache_init); static noinline voidslab_out_of_memory (struct kmem_cache *cachep,gfp_t gfpflags,int nodeid) { -struct kmem_cache_node *l3; +struct kmem_cache_node *n;struct slab *slabp;unsigned long flags;int node;
@@ -1682,24 +1682,24 @@ slab_out_of_memory(struct kmem_cache *caunsigned long active_objs =0 , num_objs =0 , free_objects =0 ;unsigned long active_slabs =0 , num_slabs =0 ; - l3 = cachep->node[node]; -if (!l3) + n = cachep->node[node]; +if (!n)continue ; -spin_lock_irqsave (&l3->list_lock, flags); -list_for_each_entry (slabp, &l3->slabs_full, list) { +spin_lock_irqsave (&n->list_lock, flags); +list_for_each_entry (slabp, &n->slabs_full, list) { active_objs += cachep->num; active_slabs++; } -list_for_each_entry (slabp, &l3->slabs_partial, list) { +list_for_each_entry (slabp, &n->slabs_partial, list) { active_objs += slabp->inuse; active_slabs++; } -list_for_each_entry (slabp, &l3->slabs_free, list) +list_for_each_entry (slabp, &n->slabs_free, list) num_slabs++; - free_objects += l3->free_objects; -spin_unlock_irqrestore (&l3->list_lock, flags); + free_objects += n->free_objects; +spin_unlock_irqrestore (&n->list_lock, flags); num_slabs += active_slabs; num_objs = num_slabs * cachep->num;
@@ -2121,7 +2121,7 @@ static int __init_refok setup_cpu_cache(if (slab_state ==DOWN ) {/* * Note: Creation of first cache (kmem_cache). -* The setup_list3s is taken care +* The setup_node is taken care * of by the caller of __kmem_cache_create */ cachep->array[smp_processor_id ()] = &initarray_generic.cache;
@@ -2135,13 +2135,13 @@ static int __init_refok setup_cpu_cache( cachep->array[smp_processor_id ()] = &initarray_generic.cache;/* -* If the cache that's used by kmalloc(sizeof(kmem_list3)) is -* the second cache, then we need to set up all its list3s, +* If the cache that's used by kmalloc(sizeof(kmem_cache_node)) is +* the second cache, then we need to set up all its node/, * otherwise the creation of further caches will BUG(). */ -set_up_list3s (cachep,SIZE_AC ); -if (INDEX_AC ==INDEX_L3 ) - slab_state =PARTIAL_L3 ; +set_up_node (cachep,SIZE_AC ); +if (INDEX_AC ==INDEX_NODE ) + slab_state =PARTIAL_NODE ;else slab_state =PARTIAL_ARRAYCACHE ; }else {
@@ -2150,8 +2150,8 @@ static int __init_refok setup_cpu_cache(kmalloc (sizeof (struct arraycache_init ), gfp);if (slab_state ==PARTIAL_ARRAYCACHE ) { -set_up_list3s (cachep,SIZE_L3 ); - slab_state =PARTIAL_L3 ; +set_up_node (cachep,SIZE_NODE ); + slab_state =PARTIAL_NODE ; }else {int node;for_each_online_node (node) {
@@ -2159,7 +2159,7 @@ static int __init_refok setup_cpu_cache(kmalloc_node (sizeof (struct kmem_cache_node ), gfp, node);BUG_ON (!cachep->node[node]); -kmem_list3_init (cachep->node[node]); +kmem_cache_node_init (cachep->node[node]); } } }
@@ -2289,7 +2289,7 @@ __kmem_cache_create (struct kmem_cache * size +=BYTES_PER_WORD ; }#if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC ) -if (size >=kmalloc_size (INDEX_L3 +1 ) +if (size >=kmalloc_size (INDEX_NODE +1 ) && cachep->object_size >cache_line_size () &&ALIGN (size, align) <PAGE_SIZE ) { cachep->obj_offset +=PAGE_SIZE -ALIGN (size, align); size =PAGE_SIZE ;
@@ -2423,7 +2423,7 @@ static void check_spinlock_acquired_node#define check_spinlock_acquired_node (x, y) do { } while(0)#endif -static void drain_array (struct kmem_cache *cachep,struct kmem_cache_node *l3, +static void drain_array (struct kmem_cache *cachep,struct kmem_cache_node *n,struct array_cache *ac,int force,int node);
@@ -2443,21 +2443,21 @@ static void do_drain(void *arg)static void drain_cpu_caches (struct kmem_cache *cachep) { -struct kmem_cache_node *l3; +struct kmem_cache_node *n;int node;on_each_cpu (do_drain, cachep,1 );check_irq_on ();for_each_online_node (node) { - l3 = cachep->node[node]; -if (l3 && l3->alien) -drain_alien_cache (cachep, l3->alien); + n = cachep->node[node]; +if (n && n->alien) +drain_alien_cache (cachep, n->alien); }for_each_online_node (node) { - l3 = cachep->node[node]; -if (l3) -drain_array (cachep, l3, l3->shared,1 , node); + n = cachep->node[node]; +if (n) +drain_array (cachep, n, n->shared,1 , node); } }
@@ -2468,19 +2468,19 @@ static void drain_cpu_caches(struct kmem* Returns the actual number of slabs released. */ static int drain_freelist (struct kmem_cache *cache, -struct kmem_cache_node *l3,int tofree) +struct kmem_cache_node *n,int tofree) {struct list_head *p;int nr_freed;struct slab *slabp; nr_freed =0 ; -while (nr_freed < tofree && !list_empty (&l3->slabs_free)) { +while (nr_freed < tofree && !list_empty (&n->slabs_free)) { -spin_lock_irq (&l3->list_lock); - p = l3->slabs_free.prev; -if (p == &l3->slabs_free) { -spin_unlock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock); + p = n->slabs_free.prev; +if (p == &n->slabs_free) { +spin_unlock_irq (&n->list_lock); goto out; }
@@ -2493,8 +2493,8 @@ static int drain_freelist(struct kmem_ca* Safe to drop the lock. The slab is no longer linked * to the cache. */ - l3->free_objects -= cache->num; -spin_unlock_irq (&l3->list_lock); + n->free_objects -= cache->num; +spin_unlock_irq (&n->list_lock);slab_destroy (cache, slabp); nr_freed++; }
@@ -2506,20 +2506,20 @@ out:static int __cache_shrink (struct kmem_cache *cachep) {int ret =0 , i =0 ; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;drain_cpu_caches (cachep);check_irq_on ();for_each_online_node (i) { - l3 = cachep->node[i]; -if (!l3) + n = cachep->node[i]; +if (!n)continue ; -drain_freelist (cachep, l3, l3->free_objects); +drain_freelist (cachep, n, n->free_objects); - ret += !list_empty (&l3->slabs_full) || - !list_empty (&l3->slabs_partial); + ret += !list_empty (&n->slabs_full) || + !list_empty (&n->slabs_partial); }return (ret ?1 :0 ); }
@@ -2548,7 +2548,7 @@ EXPORT_SYMBOL(kmem_cache_shrink);int __kmem_cache_shutdown (struct kmem_cache *cachep) {int i; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;int rc =__cache_shrink (cachep);if (rc)
@@ -2557,13 +2557,13 @@ int __kmem_cache_shutdown(struct kmem_cafor_each_online_cpu (i)kfree (cachep->array[i]); -/* NUMA: free the list3 structures */ +/* NUMA: free the node structures */ for_each_online_node (i) { - l3 = cachep->node[i]; -if (l3) { -kfree (l3->shared); -free_alien_cache (l3->alien); -kfree (l3); + n = cachep->node[i]; +if (n) { +kfree (n->shared); +free_alien_cache (n->alien); +kfree (n); } }return 0 ;
@@ -2745,7 +2745,7 @@ static int cache_grow(struct kmem_cachestruct slab *slabp;size_t offset;gfp_t local_flags; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;/* * Be lazy and only check for valid flags here, keeping it out of the
@@ -2754,17 +2754,17 @@ static int cache_grow(struct kmem_cacheBUG_ON (flags &GFP_SLAB_BUG_MASK ); local_flags = flags & (GFP_CONSTRAINT_MASK |GFP_RECLAIM_MASK ); -/* Take the l3 list lock to change the colour_next on this node */ +/* Take the node list lock to change the colour_next on this node */ check_irq_off (); - l3 = cachep->node[nodeid]; -spin_lock (&l3->list_lock); + n = cachep->node[nodeid]; +spin_lock (&n->list_lock);/* Get colour for the slab, and cal the next value. */ - offset = l3->colour_next; - l3->colour_next++; -if (l3->colour_next >= cachep->colour) - l3->colour_next =0 ; -spin_unlock (&l3->list_lock); + offset = n->colour_next; + n->colour_next++; +if (n->colour_next >= cachep->colour) + n->colour_next =0 ; +spin_unlock (&n->list_lock); offset *= cachep->colour_off;
@@ -2801,13 +2801,13 @@ static int cache_grow(struct kmem_cacheif (local_flags & __GFP_WAIT)local_irq_disable ();check_irq_off (); -spin_lock (&l3->list_lock); +spin_lock (&n->list_lock);/* Make slab active. */ -list_add_tail (&slabp->list, &(l3->slabs_free)); +list_add_tail (&slabp->list, &(n->slabs_free));STATS_INC_GROWN (cachep); - l3->free_objects += cachep->num; -spin_unlock (&l3->list_lock); + n->free_objects += cachep->num; +spin_unlock (&n->list_lock);return 1 ; opps1:kmem_freepages (cachep, objp);
@@ -2935,7 +2935,7 @@ static void *cache_alloc_refill(struct k bool force_refill) {int batchcount; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;struct array_cache *ac;int node;
@@ -2954,14 +2954,14 @@ retry:*/ batchcount =BATCHREFILL_LIMIT ; } - l3 = cachep->node[node]; + n = cachep->node[node]; -BUG_ON (ac->avail >0 || !l3); -spin_lock (&l3->list_lock); +BUG_ON (ac->avail >0 || !n); +spin_lock (&n->list_lock);/* See if we can refill from the shared array */ -if (l3->shared &&transfer_objects (ac, l3->shared, batchcount)) { - l3->shared->touched =1 ; +if (n->shared &&transfer_objects (ac, n->shared, batchcount)) { + n->shared->touched =1 ; goto alloc_done; }
@@ -2969,11 +2969,11 @@ retry:struct list_head *entry;struct slab *slabp;/* Get slab alloc is to come from. */ - entry = l3->slabs_partial.next; -if (entry == &l3->slabs_partial) { - l3->free_touched =1 ; - entry = l3->slabs_free.next; -if (entry == &l3->slabs_free) + entry = n->slabs_partial.next; +if (entry == &n->slabs_partial) { + n->free_touched =1 ; + entry = n->slabs_free.next; +if (entry == &n->slabs_free) goto must_grow; }
@@ -3001,15 +3001,15 @@ retry:/* move slabp to correct slabp list: */ list_del (&slabp->list);if (slabp->free ==BUFCTL_END ) -list_add (&slabp->list, &l3->slabs_full); +list_add (&slabp->list, &n->slabs_full);else -list_add (&slabp->list, &l3->slabs_partial); +list_add (&slabp->list, &n->slabs_partial); } must_grow: - l3->free_objects -= ac->avail; + n->free_objects -= ac->avail; alloc_done: -spin_unlock (&l3->list_lock); +spin_unlock (&n->list_lock);if (unlikely (!ac->avail)) {int x;
@@ -3267,21 +3267,21 @@ static void *____cache_alloc_node(struct {struct list_head *entry;struct slab *slabp; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;void *obj;int x; - l3 = cachep->node[nodeid]; -BUG_ON (!l3); + n = cachep->node[nodeid]; +BUG_ON (!n); retry:check_irq_off (); -spin_lock (&l3->list_lock); - entry = l3->slabs_partial.next; -if (entry == &l3->slabs_partial) { - l3->free_touched =1 ; - entry = l3->slabs_free.next; -if (entry == &l3->slabs_free) +spin_lock (&n->list_lock); + entry = n->slabs_partial.next; +if (entry == &n->slabs_partial) { + n->free_touched =1 ; + entry = n->slabs_free.next; +if (entry == &n->slabs_free) goto must_grow; }
@@ -3297,20 +3297,20 @@ retry: obj =slab_get_obj (cachep, slabp, nodeid);check_slabp (cachep, slabp); - l3->free_objects--; + n->free_objects--;/* move slabp to correct slabp list: */ list_del (&slabp->list);if (slabp->free ==BUFCTL_END ) -list_add (&slabp->list, &l3->slabs_full); +list_add (&slabp->list, &n->slabs_full);else -list_add (&slabp->list, &l3->slabs_partial); +list_add (&slabp->list, &n->slabs_partial); -spin_unlock (&l3->list_lock); +spin_unlock (&n->list_lock); goto done; must_grow: -spin_unlock (&l3->list_lock); +spin_unlock (&n->list_lock); x =cache_grow (cachep, flags |GFP_THISNODE , nodeid,NULL );if (x) goto retry;
@@ -3458,7 +3458,7 @@ static void free_block(struct kmem_cache int node) {int i; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;for (i =0 ; i < nr_objects; i++) {void *objp;
@@ -3468,19 +3468,19 @@ static void free_block(struct kmem_cache objp = objpp[i]; slabp =virt_to_slab (objp); - l3 = cachep->node[node]; + n = cachep->node[node];list_del (&slabp->list);check_spinlock_acquired_node (cachep, node);check_slabp (cachep, slabp);slab_put_obj (cachep, slabp, objp, node);STATS_DEC_ACTIVE (cachep); - l3->free_objects++; + n->free_objects++;check_slabp (cachep, slabp);/* fixup slab chains */ if (slabp->inuse ==0 ) { -if (l3->free_objects > l3->free_limit) { - l3->free_objects -= cachep->num; +if (n->free_objects > n->free_limit) { + n->free_objects -= cachep->num;/* No need to drop any previously held * lock here, even if we have a off-slab slab * descriptor it is guaranteed to come from
@@ -3489,14 +3489,14 @@ static void free_block(struct kmem_cache*/ slab_destroy (cachep, slabp); }else { -list_add (&slabp->list, &l3->slabs_free); +list_add (&slabp->list, &n->slabs_free); } }else {/* Unconditionally move a slab to the end of the * partial list on free - maximum time for the * other objects to be freed, too. */ -list_add_tail (&slabp->list, &l3->slabs_partial); +list_add_tail (&slabp->list, &n->slabs_partial); } } }
@@ -3504,7 +3504,7 @@ static void free_block(struct kmem_cachestatic void cache_flusharray (struct kmem_cache *cachep,struct array_cache *ac) {int batchcount; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;int node =numa_mem_id (); batchcount = ac->batchcount;
@@ -3512,10 +3512,10 @@ static void cache_flusharray(struct kmemBUG_ON (!batchcount || batchcount > ac->avail);#endif check_irq_off (); - l3 = cachep->node[node]; -spin_lock (&l3->list_lock); -if (l3->shared) { -struct array_cache *shared_array = l3->shared; + n = cachep->node[node]; +spin_lock (&n->list_lock); +if (n->shared) { +struct array_cache *shared_array = n->shared;int max = shared_array->limit - shared_array->avail;if (max) {if (batchcount > max)
@@ -3534,8 +3534,8 @@ free_done:int i =0 ;struct list_head *p; - p = l3->slabs_free.next; -while (p != &(l3->slabs_free)) { + p = n->slabs_free.next; +while (p != &(n->slabs_free)) {struct slab *slabp; slabp = list_entry(p, struct slab, list);
@@ -3547,7 +3547,7 @@ free_done: STATS_SET_FREEABLE(cachep, i); }#endif -spin_unlock (&l3->list_lock); +spin_unlock (&n->list_lock); ac->avail -= batchcount;memmove (ac->entry, &(ac->entry[batchcount]),sizeof (void *)*ac->avail); }
@@ -3788,12 +3788,12 @@ void kfree(const void *objp)EXPORT_SYMBOL (kfree);/* -* This initializes kmem_list3 or resizes various caches for all nodes. +* This initializes kmem_cache_node or resizes various caches for all nodes. */ static int alloc_kmemlist (struct kmem_cache *cachep,gfp_t gfp) {int node; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;struct array_cache *new_shared;struct array_cache **new_alien =NULL ;
@@ -3816,43 +3816,43 @@ static int alloc_kmemlist(struct kmem_ca } } - l3 = cachep->node[node]; -if (l3) { -struct array_cache *shared = l3->shared; + n = cachep->node[node]; +if (n) { +struct array_cache *shared = n->shared; -spin_lock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock);if (shared)free_block (cachep, shared->entry, shared->avail, node); - l3->shared = new_shared; -if (!l3->alien) { - l3->alien = new_alien; + n->shared = new_shared; +if (!n->alien) { + n->alien = new_alien; new_alien =NULL ; } - l3->free_limit = (1 +nr_cpus_node (node)) * + n->free_limit = (1 +nr_cpus_node (node)) * cachep->batchcount + cachep->num; -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock);kfree (shared);free_alien_cache (new_alien);continue ; } - l3 =kmalloc_node (sizeof (struct kmem_cache_node ), gfp, node); -if (!l3) { + n =kmalloc_node (sizeof (struct kmem_cache_node ), gfp, node); +if (!n) {free_alien_cache (new_alien);kfree (new_shared); goto fail; } -kmem_list3_init (l3); - l3->next_reap = jiffies +REAPTIMEOUT_LIST3 + +kmem_cache_node_init (n); + n->next_reap = jiffies +REAPTIMEOUT_LIST3 + ((unsigned long )cachep) %REAPTIMEOUT_LIST3 ; - l3->shared = new_shared; - l3->alien = new_alien; - l3->free_limit = (1 +nr_cpus_node (node)) * + n->shared = new_shared; + n->alien = new_alien; + n->free_limit = (1 +nr_cpus_node (node)) * cachep->batchcount + cachep->num; - cachep->node[node] = l3; + cachep->node[node] = n; }return 0 ;
@@ -3862,11 +3862,11 @@ fail: node--;while (node >=0 ) {if (cachep->node[node]) { - l3 = cachep->node[node]; + n = cachep->node[node]; -kfree (l3->shared); -free_alien_cache (l3->alien); -kfree (l3); +kfree (n->shared); +free_alien_cache (n->alien); +kfree (n); cachep->node[node] =NULL ; } node--;
@@ -3991,11 +3991,11 @@ static int enable_cpucache(struct kmem_c }/* -* Drain an array if it contains any elements taking the l3 lock only if -* necessary. Note that the l3 listlock also protects the array_cache +* 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 * if drain_array() is used on the shared array. */ -static void drain_array (struct kmem_cache *cachep,struct kmem_cache_node *l3, +static void drain_array (struct kmem_cache *cachep,struct kmem_cache_node *n,struct array_cache *ac,int force,int node) {int tofree;
@@ -4005,7 +4005,7 @@ static void drain_array(struct kmem_cachif (ac->touched && !force) { ac->touched =0 ; }else { -spin_lock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock);if (ac->avail) { tofree = force ? ac->avail : (ac->limit +4 ) /5 ;if (tofree > ac->avail)
@@ -4015,7 +4015,7 @@ static void drain_array(struct kmem_cachmemmove (ac->entry, &(ac->entry[tofree]),sizeof (void *) * ac->avail); } -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock); } }
@@ -4034,7 +4034,7 @@ static void drain_array(struct kmem_cachstatic void cache_reap (struct work_struct *w) {struct kmem_cache *searchp; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;int node =numa_mem_id ();struct delayed_work *work =to_delayed_work (w);
@@ -4046,33 +4046,33 @@ static void cache_reap(struct work_struccheck_irq_on ();/* -* We only take the l3 lock if absolutely necessary and we +* We only take the node lock if absolutely necessary and we * have established with reasonable certainty that * we can do some work if the lock was obtained. */ - l3 = searchp->node[node]; + n = searchp->node[node]; -reap_alien (searchp, l3); +reap_alien (searchp, n); -drain_array (searchp, l3,cpu_cache_get (searchp),0 , node); +drain_array (searchp, n,cpu_cache_get (searchp),0 , node);/* * These are racy checks but it does not matter * if we skip one check or scan twice. */ -if (time_after (l3->next_reap, jiffies)) +if (time_after (n->next_reap, jiffies)) goto next; - l3->next_reap = jiffies +REAPTIMEOUT_LIST3 ; + n->next_reap = jiffies +REAPTIMEOUT_LIST3 ; -drain_array (searchp, l3, l3->shared,0 , node); +drain_array (searchp, n, n->shared,0 , node); -if (l3->free_touched) - l3->free_touched =0 ; +if (n->free_touched) + n->free_touched =0 ;else {int freed; - freed =drain_freelist (searchp, l3, (l3->free_limit + + freed =drain_freelist (searchp, n, (n->free_limit +5 * searchp->num -1 ) / (5 * searchp->num));STATS_ADD_REAPED (searchp, freed); }
@@ -4098,25 +4098,25 @@ void get_slabinfo(struct kmem_cache *cacconst char *name;char *error =NULL ;int node; -struct kmem_cache_node *l3; +struct kmem_cache_node *n; active_objs =0 ; num_slabs =0 ;for_each_online_node (node) { - l3 = cachep->node[node]; -if (!l3) + n = cachep->node[node]; +if (!n)continue ;check_irq_on (); -spin_lock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock); -list_for_each_entry (slabp, &l3->slabs_full, list) { +list_for_each_entry (slabp, &n->slabs_full, list) {if (slabp->inuse != cachep->num && !error) error ="slabs_full accounting error" ; active_objs += cachep->num; active_slabs++; } -list_for_each_entry (slabp, &l3->slabs_partial, list) { +list_for_each_entry (slabp, &n->slabs_partial, list) {if (slabp->inuse == cachep->num && !error) error ="slabs_partial inuse accounting error" ;if (!slabp->inuse && !error)
@@ -4124,16 +4124,16 @@ void get_slabinfo(struct kmem_cache *cac active_objs += slabp->inuse; active_slabs++; } -list_for_each_entry (slabp, &l3->slabs_free, list) { +list_for_each_entry (slabp, &n->slabs_free, list) {if (slabp->inuse && !error) error ="slabs_free/inuse accounting error" ; num_slabs++; } - free_objects += l3->free_objects; -if (l3->shared) - shared_avail += l3->shared->avail; + free_objects += n->free_objects; +if (n->shared) + shared_avail += n->shared->avail; -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock); } num_slabs += active_slabs; num_objs = num_slabs * cachep->num;
@@ -4159,7 +4159,7 @@ void get_slabinfo(struct kmem_cache *cacvoid slabinfo_show_stats (struct seq_file *m,struct kmem_cache *cachep) {#if STATS - {/* list3 stats */ + {/* node stats */ unsigned long high = cachep->high_mark;unsigned long allocs = cachep->num_allocations;unsigned long grown = cachep->grown;
@@ -4312,7 +4312,7 @@ static int leaks_show(struct seq_file *m { struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);struct slab *slabp; -struct kmem_cache_node *l3; +struct kmem_cache_node *n;const char *name;unsigned long *n = m->private;int node;
@@ -4328,18 +4328,18 @@ static int leaks_show(struct seq_file *m n[1 ] =0 ;for_each_online_node (node) { - l3 = cachep->node[node]; -if (!l3) + n = cachep->node[node]; +if (!n)continue ;check_irq_on (); -spin_lock_irq (&l3->list_lock); +spin_lock_irq (&n->list_lock); -list_for_each_entry (slabp, &l3->slabs_full, list) +list_for_each_entry (slabp, &n->slabs_full, list)handle_slab (n, cachep, slabp); -list_for_each_entry (slabp, &l3->slabs_partial, list) +list_for_each_entry (slabp, &n->slabs_partial, list)handle_slab (n, cachep, slabp); -spin_unlock_irq (&l3->list_lock); +spin_unlock_irq (&n->list_lock); } name = cachep->name;if (n[0 ] == n[1 ]) {
mm/slab.h +1 -1
@@ -16,7 +16,7 @@ enum slab_state {DOWN ,/* No slab functionality yet */ PARTIAL ,/* SLUB: kmem_cache_node available */ PARTIAL_ARRAYCACHE ,/* SLAB: kmalloc size for arraycache available */ -PARTIAL_L3 ,/* SLAB: kmalloc size for l3 struct available */ +PARTIAL_NODE ,/* SLAB: kmalloc size for node struct available */ UP ,/* Slab caches usable but not all extras yet */ FULL /* Everything is working */ };
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [06/12] slab: rename nodelists to node
In reply to a message not in the archiveHave a common naming between both slab caches for future changes.
include/linux/slab_def.h +1 -1
@@ -92,7 +92,7 @@ struct kmem_cache {* pointer for each node since "nodelists" uses the remainder of * available pointers. */ -struct kmem_cache_node **nodelists; +struct kmem_cache_node **node;struct array_cache *array[NR_CPUS +MAX_NUMNODES ];/* * Do not add fields after array[]
mm/slab.c +66 -66
447 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Ren [03/12] Common kmalloc slab index determination
In reply to a message not in the archiveExtract the function to determine the index of the slab within the array of kmalloc caches as well as a function to determine maximum object size from the nr of the kmalloc slab.
This is used here only to simplify slub bootstrap but will be used later also for SLAB.
include/linux/slab.h +122 -51
@@ -93,30 +93,6 @@ (unsigned long)ZERO_SIZE_PTR)/* -* Common fields provided in kmem_cache by all slab allocators -* This struct is either used directly by the allocator (SLOB) -* or the allocator must include definitions for all fields -* provided in kmem_cache_common in their definition of kmem_cache. -* -* Once we can do anonymous structs (C11 standard) we could put a -* anonymous struct definition in these allocators so that the -* separate allocations in the kmem_cache structure of SLAB and -* SLUB is no longer needed. -*/ -#ifdef CONFIG_SLOB -struct kmem_cache { -unsigned int object_size;/* The original size of the object */ -unsigned int size;/* The aligned/padded/added on size */ -unsigned int align;/* Alignment as calculated */ -unsigned long flags;/* Active flags on the slab */ -const char *name;/* Slab name for sysfs */ -int refcount;/* Use counter */ -void (*ctor)(void *);/* Called on object slot creation */ -struct list_head list;/* List of all slab caches on the system */ -}; -#endif - -/* * struct kmem_cache related prototypes */ void __init kmem_cache_init (void );
@@ -150,6 +126,35 @@ void kfree(const void *);void kzfree (const void *);size_t ksize (const void *); +#ifdef CONFIG_SLOB +/* +* Common fields provided in kmem_cache by all slab allocators +* This struct is either used directly by the allocator (SLOB) +* or the allocator must include definitions for all fields +* provided in kmem_cache_common in their definition of kmem_cache. +* +* Once we can do anonymous structs (C11 standard) we could put a +* anonymous struct definition in these allocators so that the +* separate allocations in the kmem_cache structure of SLAB and +* SLUB is no longer needed. +*/ +struct kmem_cache { +unsigned int object_size;/* The original size of the object */ +unsigned int size;/* The aligned/padded/added on size */ +unsigned int align;/* Alignment as calculated */ +unsigned long flags;/* Active flags on the slab */ +const char *name;/* Slab name for sysfs */ +int refcount;/* Use counter */ +void (*ctor)(void *);/* Called on object slot creation */ +struct list_head list;/* List of all slab caches on the system */ +}; + +#define KMALLOC_MAX_SIZE (1UL << 30) + +#include <linux/slob_def.h> + +#else /* CONFIG_SLOB */ +/* * The largest kmalloc size supported by the slab allocators is * 32 megabyte (2^25) or the maximum allocatable page order if that is
@@ -166,6 +171,99 @@ size_t ksize(const void *);#define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT)/* +* Kmalloc subsystem. +*/ +#if defined(ARCH_DMA_MINALIGN ) &&ARCH_DMA_MINALIGN >8 +#define KMALLOC_MIN_SIZE ARCH_DMA_MINALIGN +#else +#ifdef CONFIG_SLAB +#define KMALLOC_MIN_SIZE 32 +#else +#define KMALLOC_MIN_SIZE 8 +#endif +#endif + +#define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) + +/* +* Figure out which kmalloc slab an allocation of a certain size +* belongs to. +* 0 = zero alloc +* 1 = 65 .. 96 bytes +* 2 = 120 .. 192 bytes +* n = 2^(n-1) .. 2^n -1 +*/ +static __always_inline int kmalloc_index(size_t size) +{ +if (!size) +return 0 ; + +if (size <=KMALLOC_MIN_SIZE ) +return KMALLOC_SHIFT_LOW ; + +if (KMALLOC_MIN_SIZE <=32 && size >64 && size <=96 ) +return 1 ; +if (KMALLOC_MIN_SIZE <=64 && size >128 && size <=192 ) +return 2 ; +if (size <=8 )return 3 ; +if (size <=16 )return 4 ; +if (size <=32 )return 5 ; +if (size <=64 )return 6 ; +if (size <=128 )return 7 ; +if (size <=256 )return 8 ; +if (size <=512 )return 9 ; +if (size <=1024 )return 10 ; +if (size <=2 *1024 )return 11 ; +if (size <=4 *1024 )return 12 ; +if (size <=8 *1024 )return 13 ; +if (size <=16 *1024 )return 14 ; +if (size <=32 *1024 )return 15 ; +if (size <=64 *1024 )return 16 ; +if (size <=128 *1024 )return 17 ; +if (size <=256 *1024 )return 18 ; +if (size <=512 *1024 )return 19 ; +if (size <=1024 *1024 )return 20 ; +if (size <=2 *1024 *1024 )return 21 ; +if (size <=4 *1024 *1024 )return 22 ; +if (size <=8 *1024 *1024 )return 23 ; +if (size <=16 *1024 *1024 )return 24 ; +if (size <=32 *1024 *1024 )return 25 ; +if (size <=64 *1024 *1024 )return 26 ; +BUG (); + +/* Will never be reached. Needed because the compiler may complain */ +return -1 ; +} + +#ifdef CONFIG_SLAB +#include <linux/slab_def.h> +#elif defined(CONFIG_SLUB ) +#include <linux/slub_def.h> +#else +#error "Unknown slab allocator" +#endif + +/* +* Determine size used for the nth kmalloc cache. +* return size or 0 if a kmalloc cache for that +* size does not exist +*/ +static __always_inline int kmalloc_size(int n) +{ +if (n >2 ) +return 1 << n; + +if (n ==1 &&KMALLOC_MIN_SIZE <=32 ) +return 96 ; + +if (n ==2 &&KMALLOC_MIN_SIZE <=64 ) +return 192 ; + +return 0 ; +} +#endif /* !CONFIG_SLOB */ + +/* * Some archs want to perform DMA into kmalloc caches and need a guaranteed * alignment larger than the alignment of a 64-bit integer. * Setting ARCH_KMALLOC_MINALIGN in arch headers allows that.
@@ -185,33 +283,6 @@ size_t ksize(const void *);#define ARCH_SLAB_MINALIGN __alignof__(unsigned long long)#endif -/* -* Allocator specific definitions. These are mainly used to establish optimized -* ways to convert kmalloc() calls to kmem_cache_alloc() invocations by -* selecting the appropriate general cache at compile time. -* -* Allocators must define at least: -* -* kmem_cache_alloc() -* __kmalloc() -* kmalloc() -* -* Those wishing to support NUMA must also define: -* -* kmem_cache_alloc_node() -* kmalloc_node() -* -* See each allocator definition file for additional comments and -* implementation notes. -*/ -#ifdef CONFIG_SLUB -#include <linux/slub_def.h> -#elif defined(CONFIG_SLOB ) -#include <linux/slob_def.h> -#else -#include <linux/slab_def.h> -#endif -/** * kmalloc_array - allocate memory for an array. * @n: number of elements.
include/linux/slub_def.h +0 -63
75 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: Ren [03/12] Common kmalloc slab index determination
Quoted 8 lines · Christoph Lameter
Extract the function to determine the index of the slab within the array of kmalloc caches as well as a function to determine maximum object size from the nr of the kmalloc slab.
This is used here only to simplify slub bootstrap but will be used later also for SLAB.
Signed-off-by Christoph Lameter <[email protected]>
I remember having acked this already?
In any case, I scanned for changes since your last submission, and I don't see anything significant.
So Acked-by: Glauber Costa <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>