Files
kernel/include/linux/slub_def.h
T

186 lines
5.6 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0 */
2007-05-06 14:49:36 -07:00
#ifndef _LINUX_SLUB_DEF_H
#define _LINUX_SLUB_DEF_H
/*
* SLUB : A Slab allocator without object queues.
*
2008-07-04 09:59:22 -07:00
* (C) 2007 SGI, Christoph Lameter
2007-05-06 14:49:36 -07:00
*/
#include <linux/kobject.h>
2008-02-07 17:47:41 -08:00
enum stat_item {
ALLOC_FASTPATH, /* Allocation from cpu slab */
ALLOC_SLOWPATH, /* Allocation by getting a new cpu slab */
FREE_FASTPATH, /* Free to cpu slab */
2008-02-07 17:47:41 -08:00
FREE_SLOWPATH, /* Freeing not to cpu slab */
FREE_FROZEN, /* Freeing to frozen slab */
FREE_ADD_PARTIAL, /* Freeing moves slab to partial list */
FREE_REMOVE_PARTIAL, /* Freeing removes last object */
2012-02-03 23:34:56 +08:00
ALLOC_FROM_PARTIAL, /* Cpu slab acquired from node partial list */
2008-02-07 17:47:41 -08:00
ALLOC_SLAB, /* Cpu slab acquired from page allocator */
ALLOC_REFILL, /* Refill cpu slab from slab freelist */
ALLOC_NODE_MISMATCH, /* Switching cpu slab */
2008-02-07 17:47:41 -08:00
FREE_SLAB, /* Slab freed to the page allocator */
CPUSLAB_FLUSH, /* Abandoning of the cpu slab */
DEACTIVATE_FULL, /* Cpu slab was full when deactivated */
DEACTIVATE_EMPTY, /* Cpu slab was empty when deactivated */
DEACTIVATE_TO_HEAD, /* Cpu slab was moved to the head of partials */
DEACTIVATE_TO_TAIL, /* Cpu slab was moved to the tail of partials */
DEACTIVATE_REMOTE_FREES,/* Slab contained remotely freed objects */
2011-06-01 12:25:58 -05:00
DEACTIVATE_BYPASS, /* Implicit deactivation */
ORDER_FALLBACK, /* Number of times fallback was necessary */
CMPXCHG_DOUBLE_CPU_FAIL,/* Failure of this_cpu_cmpxchg_double */
2011-06-01 12:25:49 -05:00
CMPXCHG_DOUBLE_FAIL, /* Number of times that cmpxchg double did not match */
2011-08-09 16:12:27 -05:00
CPU_PARTIAL_ALLOC, /* Used cpu partial on alloc */
2012-02-03 23:34:56 +08:00
CPU_PARTIAL_FREE, /* Refill cpu partial on free */
CPU_PARTIAL_NODE, /* Refill cpu partial from node partial */
CPU_PARTIAL_DRAIN, /* Drain cpu partial to node partial */
2008-02-07 17:47:41 -08:00
NR_SLUB_STAT_ITEMS };
struct kmem_cache_cpu {
void **freelist; /* Pointer to next available object */
unsigned long tid; /* Globally unique transaction id */
2008-01-07 23:20:31 -08:00
struct page *page; /* The slab from which we are allocating */
#ifdef CONFIG_SLUB_CPU_PARTIAL
2011-08-09 16:12:27 -05:00
struct page *partial; /* Partially allocated frozen slabs */
#endif
2008-02-07 17:47:41 -08:00
#ifdef CONFIG_SLUB_STATS
unsigned stat[NR_SLUB_STAT_ITEMS];
#endif
};
#ifdef CONFIG_SLUB_CPU_PARTIAL
#define slub_percpu_partial(c) ((c)->partial)
#define slub_set_percpu_partial(c, p) \
({ \
slub_percpu_partial(c) = (p)->next; \
})
#define slub_percpu_partial_read_once(c) READ_ONCE(slub_percpu_partial(c))
#else
#define slub_percpu_partial(c) NULL
#define slub_set_percpu_partial(c, p)
#define slub_percpu_partial_read_once(c) NULL
#endif // CONFIG_SLUB_CPU_PARTIAL
2008-04-14 19:11:31 +03:00
/*
* Word size structure that can be atomically updated or read and that
* contains both the order and the number of objects that a slab of the
* given order would contain.
*/
struct kmem_cache_order_objects {
unsigned int x;
2008-04-14 19:11:31 +03:00
};
2007-05-06 14:49:36 -07:00
/*
* Slab cache management.
*/
struct kmem_cache {
struct kmem_cache_cpu __percpu *cpu_slab;
2019-03-05 15:42:07 -08:00
/* Used for retrieving partial slabs, etc. */
2017-11-15 17:32:18 -08:00
slab_flags_t flags;
unsigned long min_partial;
2019-03-05 15:42:07 -08:00
unsigned int size; /* The size of an object including metadata */
unsigned int object_size;/* The size of an object without metadata */
unsigned int offset; /* Free pointer offset */
#ifdef CONFIG_SLUB_CPU_PARTIAL
2018-04-05 16:21:10 -07:00
/* Number of per cpu partial objects to keep around */
unsigned int cpu_partial;
#endif
2008-04-14 19:11:31 +03:00
struct kmem_cache_order_objects oo;
2007-05-06 14:49:36 -07:00
/* Allocation and freeing of slabs */
struct kmem_cache_order_objects max;
struct kmem_cache_order_objects min;
gfp_t allocflags; /* gfp flags to use on each alloc */
2007-05-06 14:49:36 -07:00
int refcount; /* Refcount for slab cache destroy */
void (*ctor)(void *);
2018-04-05 16:21:06 -07:00
unsigned int inuse; /* Offset to metadata */
2018-04-05 16:21:02 -07:00
unsigned int align; /* Alignment */
2018-04-05 16:20:55 -07:00
unsigned int red_left_pad; /* Left redzone padding size */
2007-05-06 14:49:36 -07:00
const char *name; /* Name (only for display!) */
struct list_head list; /* List of slab caches */
#ifdef CONFIG_SYSFS
2007-05-06 14:49:36 -07:00
struct kobject kobj; /* For sysfs */
2017-06-23 15:08:52 -07:00
struct work_struct kobj_remove_work;
#endif
#ifdef CONFIG_MEMCG
struct memcg_cache_params memcg_params;
2019-03-05 15:42:07 -08:00
/* For propagation, maximum size of a stored attr */
2018-04-05 16:20:51 -07:00
unsigned int max_attr_size;
2014-04-07 15:39:31 -07:00
#ifdef CONFIG_SYSFS
struct kset *memcg_kset;
#endif
2012-12-18 14:22:27 -08:00
#endif
2007-05-06 14:49:36 -07:00
2017-09-06 16:19:18 -07:00
#ifdef CONFIG_SLAB_FREELIST_HARDENED
unsigned long random;
#endif
2007-05-06 14:49:36 -07:00
#ifdef CONFIG_NUMA
/*
* Defragmentation by allocating from a remote node.
*/
unsigned int remote_node_defrag_ratio;
2007-05-06 14:49:36 -07:00
#endif
2016-07-26 15:21:59 -07:00
#ifdef CONFIG_SLAB_FREELIST_RANDOM
unsigned int *random_seq;
#endif
#ifdef CONFIG_KASAN
struct kasan_cache kasan_info;
#endif
2018-04-05 16:21:31 -07:00
unsigned int useroffset; /* Usercopy region offset */
unsigned int usersize; /* Usercopy region size */
2017-06-10 22:50:28 -04:00
struct kmem_cache_node *node[MAX_NUMNODES];
2007-05-06 14:49:36 -07:00
};
#ifdef CONFIG_SLUB_CPU_PARTIAL
#define slub_cpu_partial(s) ((s)->cpu_partial)
#define slub_set_cpu_partial(s, n) \
({ \
slub_cpu_partial(s) = (n); \
})
#else
#define slub_cpu_partial(s) (0)
#define slub_set_cpu_partial(s, n)
2019-03-05 15:42:07 -08:00
#endif /* CONFIG_SLUB_CPU_PARTIAL */
#ifdef CONFIG_SYSFS
#define SLAB_SUPPORTS_SYSFS
void sysfs_slab_unlink(struct kmem_cache *);
void sysfs_slab_release(struct kmem_cache *);
#else
static inline void sysfs_slab_unlink(struct kmem_cache *s)
{
}
static inline void sysfs_slab_release(struct kmem_cache *s)
{
}
#endif
2015-02-13 14:39:35 -08:00
void object_err(struct kmem_cache *s, struct page *page,
u8 *object, char *reason);
void *fixup_red_left(struct kmem_cache *s, void *p);
2016-03-25 14:21:59 -07:00
static inline void *nearest_obj(struct kmem_cache *cache, struct page *page,
void *x) {
void *object = x - (x - page_address(page)) % cache->size;
void *last_object = page_address(page) +
(page->objects - 1) * cache->size;
void *result = (unlikely(object > last_object)) ? last_object : object;
result = fixup_red_left(cache, result);
return result;
2016-03-25 14:21:59 -07:00
}
2007-05-06 14:49:36 -07:00
#endif /* _LINUX_SLUB_DEF_H */