Subversion Repositories Kolibri OS

Rev

Rev 4103 | Rev 6082 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4103 Rev 5270
Line 9... Line 9...
9
 */
9
 */
Line 10... Line 10...
10
 
10
 
11
#ifndef _LINUX_SLAB_H
11
#ifndef _LINUX_SLAB_H
Line 12... Line 12...
12
#define	_LINUX_SLAB_H
12
#define	_LINUX_SLAB_H
-
 
13
 
-
 
14
#include 
-
 
15
#include 
-
 
16
#include 
-
 
17
 
-
 
18
 
-
 
19
/*
-
 
20
 * Flags to pass to kmem_cache_create().
-
 
21
 * The ones marked DEBUG are only valid if CONFIG_SLAB_DEBUG is set.
-
 
22
 */
-
 
23
#define SLAB_DEBUG_FREE		0x00000100UL	/* DEBUG: Perform (expensive) checks on free */
-
 
24
#define SLAB_RED_ZONE		0x00000400UL	/* DEBUG: Red zone objs in a cache */
-
 
25
#define SLAB_POISON		0x00000800UL	/* DEBUG: Poison objects */
-
 
26
#define SLAB_HWCACHE_ALIGN	0x00002000UL	/* Align objs on cache lines */
-
 
27
#define SLAB_CACHE_DMA		0x00004000UL	/* Use GFP_DMA memory */
-
 
28
#define SLAB_STORE_USER		0x00010000UL	/* DEBUG: Store the last owner for bug hunting */
-
 
29
#define SLAB_PANIC		0x00040000UL	/* Panic if kmem_cache_create() fails */
-
 
30
/*
-
 
31
 * SLAB_DESTROY_BY_RCU - **WARNING** READ THIS!
-
 
32
 *
-
 
33
 * This delays freeing the SLAB page by a grace period, it does _NOT_
-
 
34
 * delay object freeing. This means that if you do kmem_cache_free()
-
 
35
 * that memory location is free to be reused at any time. Thus it may
-
 
36
 * be possible to see another object there in the same RCU grace period.
-
 
37
 *
-
 
38
 * This feature only ensures the memory location backing the object
-
 
39
 * stays valid, the trick to using this is relying on an independent
-
 
40
 * object validation pass. Something like:
-
 
41
 *
-
 
42
 *  rcu_read_lock()
-
 
43
 * again:
-
 
44
 *  obj = lockless_lookup(key);
-
 
45
 *  if (obj) {
-
 
46
 *    if (!try_get_ref(obj)) // might fail for free objects
-
 
47
 *      goto again;
-
 
48
 *
-
 
49
 *    if (obj->key != key) { // not the object we expected
13
 
50
 *      put_ref(obj);
-
 
51
 *      goto again;
-
 
52
 *    }
-
 
53
 *  }
-
 
54
 *  rcu_read_unlock();
-
 
55
 *
-
 
56
 * This is useful if we need to approach a kernel structure obliquely,
-
 
57
 * from its address obtained without the usual locking. We can lock
-
 
58
 * the structure to stabilize it and check it's still at the given address,
-
 
59
 * only if we can be sure that the memory has not been meanwhile reused
-
 
60
 * for some other kind of object (which our subsystem's lock might corrupt).
-
 
61
 *
-
 
62
 * rcu_read_lock before reading the address, then rcu_read_unlock after
-
 
63
 * taking the spinlock within the structure expected at that address.
-
 
64
 */
-
 
65
#define SLAB_DESTROY_BY_RCU	0x00080000UL	/* Defer freeing slabs to RCU */
-
 
66
#define SLAB_MEM_SPREAD		0x00100000UL	/* Spread some memory over cpuset */
-
 
67
#define SLAB_TRACE		0x00200000UL	/* Trace allocations and frees */
-
 
68
 
-
 
69
/* Flag to prevent checks on free */
-
 
70
#ifdef CONFIG_DEBUG_OBJECTS
-
 
71
# define SLAB_DEBUG_OBJECTS	0x00400000UL
-
 
72
#else
-
 
73
# define SLAB_DEBUG_OBJECTS	0x00000000UL
-
 
74
#endif
-
 
75
 
-
 
76
#define SLAB_NOLEAKTRACE	0x00800000UL	/* Avoid kmemleak tracing */
-
 
77
 
-
 
78
/* Don't track use of uninitialized memory */
-
 
79
#ifdef CONFIG_KMEMCHECK
-
 
80
# define SLAB_NOTRACK		0x01000000UL
-
 
81
#else
-
 
82
# define SLAB_NOTRACK		0x00000000UL
-
 
83
#endif
-
 
84
#ifdef CONFIG_FAILSLAB
-
 
85
# define SLAB_FAILSLAB		0x02000000UL	/* Fault injection mark */
-
 
86
#else
-
 
87
# define SLAB_FAILSLAB		0x00000000UL
-
 
88
#endif
-
 
89
 
-
 
90
/* The following flags affect the page allocator grouping pages by mobility */
-
 
91
#define SLAB_RECLAIM_ACCOUNT	0x00020000UL		/* Objects are reclaimable */
-
 
92
#define SLAB_TEMPORARY		SLAB_RECLAIM_ACCOUNT	/* Objects are short-lived */
-
 
93
/*
-
 
94
 * ZERO_SIZE_PTR will be returned for zero sized kmalloc requests.
-
 
95
 *
-
 
96
 * Dereferencing ZERO_SIZE_PTR will lead to a distinct access fault.
-
 
97
 *
-
 
98
 * ZERO_SIZE_PTR can be passed to kfree though in the same way that NULL can.
-
 
99
 * Both make kfree a no-op.
-
 
100
 */
-
 
101
#define ZERO_SIZE_PTR ((void *)16)
-
 
102
 
-
 
103
#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= \
-
 
104
				(unsigned long)ZERO_SIZE_PTR)
-
 
105
 
-
 
106
void __init kmem_cache_init(void);
-
 
107
int slab_is_available(void);
-
 
108
void kmem_cache_destroy(struct kmem_cache *);
-
 
109
int kmem_cache_shrink(struct kmem_cache *);
-
 
110
void kmem_cache_free(struct kmem_cache *, void *);
-
 
111
 
-
 
112
static inline void *krealloc(void *p, size_t new_size, gfp_t flags)
-
 
113
{
-
 
114
    return __builtin_realloc(p, new_size);
-
 
115
}
-
 
116
 
-
 
117
static inline void kfree(void *p)
-
 
118
{
-
 
119
	__builtin_free(p);
-
 
120
}
-
 
121
static __always_inline void *kmalloc(size_t size, gfp_t flags)
-
 
122
{
-
 
123
    return __builtin_malloc(size);
-
 
124
}
-
 
125
 
-
 
126
/**
-
 
127
 * kzalloc - allocate memory. The memory is set to zero.
-
 
128
 * @size: how many bytes of memory are required.
-
 
129
 * @flags: the type of memory to allocate (see kmalloc).
-
 
130
 */
-
 
131
static inline void *kzalloc(size_t size, gfp_t flags)
-
 
132
{
-
 
133
    void *ret = __builtin_malloc(size);
-
 
134
    memset(ret, 0, size);
-
 
135
    return ret;
-
 
136
}
-
 
137
 
-
 
138
static inline void *kcalloc(size_t n, size_t size, uint32_t flags)
-
 
139
{
-
 
140
    return (void*)kzalloc(n * size, 0);
-
 
141
}
-
 
142
 
-
 
143
static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)
-
 
144
{
-
 
145
//    if (size != 0 && n > SIZE_MAX / size)
-
 
146
//        return NULL;
-
 
147
    return (void*)kmalloc(n * size, flags);
14
#include 
148
}