moving some of slab allocator declarations to header files
PATCH 1/1 moving some of slab allocator declarations to header files
[PATCH] moving some of slab allocator declarations to header files
This patch moves most part of generic slab allocator declarations to new header files kmem_cache.h and kmem_slab.h, which can be usefull for debuging and making code more splitted from decls. It doesn't change any functionality.
Signed-off-by Kirill Korotaev <[email protected]>
Kirill
include/linux/kmem_cache.h renamed from include/linux/kmem_cache.h.slabh +146 -0
@@ -0,0 +1,146 @@ +#ifndef __KMEM_CACHE_H__ +#define __KMEM_CACHE_H__ + +#include <linux/threads.h> +#include <linux/smp.h> +#include <linux/spinlock.h> +#include <linux/list.h> +#include <linux/mm.h> +#include <asm/atomic.h> + +/* +* struct array_cache +* +* Per cpu structures +* 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; +}; + +/* bootstrap: The caches do not work without cpuarrays anymore, +* but the cpuarrays are allocated from the generic caches... +*/ +#define BOOT_CPUCACHE_ENTRIES 1 +struct arraycache_init { +struct array_cache cache; +void * entries[BOOT_CPUCACHE_ENTRIES ]; +}; + +/* +* The slab lists of all objects. +* Hopefully reduce the internal fragmentation +* NUMA: The spinlock could be moved from the kmem_cache_t +* into this structure, too. Figure out what causes +* fewer cross-node spinlock operations. +*/ +struct kmem_list3 { +struct list_head slabs_partial;/* partial list first, better asm code */ +struct list_head slabs_full; +struct list_head slabs_free; +unsigned long free_objects; +int free_touched; +unsigned long next_reap; +struct array_cache *shared; +}; + +#define LIST3_INIT (parent) \ + { \ + .slabs_full = LIST_HEAD_INIT(parent.slabs_full), \ + .slabs_partial = LIST_HEAD_INIT(parent.slabs_partial), \ + .slabs_free = LIST_HEAD_INIT(parent.slabs_free) \ + } +#define list3_data (cachep) \ + (&(cachep)->lists) + +/* NUMA: per-node */ +#define list3_data_ptr (cachep, ptr) \ + list3_data(cachep) + +/* +* kmem_cache_t +* +* manages a cache. +*/ + +struct kmem_cache_s { +/* 1) per-cpu data, touched during every alloc/free */ +struct array_cache *array[NR_CPUS ]; +unsigned int batchcount; +unsigned int limit; +/* 2) touched by every alloc & free from the backend */ +struct kmem_list3 lists; +/* NUMA: kmem_3list_t *nodelists[MAX_NUMNODES] */ +unsigned int objsize; +unsigned int flags;/* constant flags */ +unsigned int num;/* # of objs per slab */ +unsigned int free_limit;/* upper limit of objects in the lists */ +spinlock_t spinlock; + +/* 3) cache_grow/shrink */ +/* order of pgs per slab (2^n) */ +unsigned int gfporder; + +/* force GFP flags, e.g. GFP_DMA */ +unsigned int gfpflags; + +size_t colour;/* cache colouring range */ +unsigned int colour_off;/* colour offset */ +unsigned int colour_next;/* cache colouring */ +kmem_cache_t *slabp_cache; +unsigned int slab_size; +unsigned int dflags;/* dynamic flags */ + +/* constructor func */ +void (*ctor)(void *,kmem_cache_t *,unsigned long ); + +/* de-constructor func */ +void (*dtor)(void *,kmem_cache_t *,unsigned long ); + +/* 4) cache creation/removal */ +const char *name; +struct list_head next; + +/* 5) statistics */ +#if STATS +unsigned long num_active; +unsigned long num_allocations; +unsigned long high_mark; +unsigned long grown; +unsigned long reaped; +unsigned long errors; +unsigned long max_freeable; +atomic_t allochit; +atomic_t allocmiss; +atomic_t freehit; +atomic_t freemiss; +#endif +#if DEBUG +int dbghead; +int reallen; +#endif +}; + +#define CFLGS_OFF_SLAB (0x80000000UL) +#define OFF_SLAB (x) ((x)->flags & CFLGS_OFF_SLAB) + +/* Macros for storing/retrieving the cachep and or slab from the +* global 'mem_map'. These are used to find the slab an obj belongs to. +* With kfree(), these are used to find the cache which an obj belongs to. +*/ +#define SET_PAGE_CACHE (pg,x) ((pg)->lru.next = (struct list_head *)(x)) +#define GET_PAGE_CACHE (pg) ((kmem_cache_t *)(pg)->lru.next) +#define SET_PAGE_SLAB (pg,x) ((pg)->lru.prev = (struct list_head *)(x)) +#define GET_PAGE_SLAB (pg) ((struct slab *)(pg)->lru.prev) + +#endif /* __KMEM_CACHE_H__ */
include/linux/kmem_slab.h renamed from include/linux/kmem_slab.h.slabh +69 -0
69 lines not on this page · raw message
mm/slab.c renamed from mm/slab.c.slabh +2 -200
231 lines not on this page · raw message