Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
genalloc.h
Go to the documentation of this file.
1
/*
2
* Basic general purpose allocator for managing special purpose
3
* memory, for example, memory that is not managed by the regular
4
* kmalloc/kfree interface. Uses for this includes on-device special
5
* memory, uncached memory etc.
6
*
7
* It is safe to use the allocator in NMI handlers and other special
8
* unblockable contexts that could otherwise deadlock on locks. This
9
* is implemented by using atomic operations and retries on any
10
* conflicts. The disadvantage is that there may be livelocks in
11
* extreme cases. For better scalability, one allocator can be used
12
* for each CPU.
13
*
14
* The lockless operation only works if there is enough memory
15
* available. If new memory is added to the pool a lock has to be
16
* still taken. So any user relying on locklessness has to ensure
17
* that sufficient memory is preallocated.
18
*
19
* The basic atomic operation of this allocator is cmpxchg on long.
20
* On architectures that don't have NMI-safe cmpxchg implementation,
21
* the allocator can NOT be used in NMI handler. So code uses the
22
* allocator in NMI handler should depend on
23
* CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG.
24
*
25
* This source code is licensed under the GNU General Public License,
26
* Version 2. See the file COPYING for more details.
27
*/
28
29
30
#ifndef __GENALLOC_H__
31
#define __GENALLOC_H__
32
40
typedef
unsigned
long
(*
genpool_algo_t
)(
unsigned
long
*
map
,
41
unsigned
long
size
,
42
unsigned
long
start
,
43
unsigned
int
nr
,
44
void
*
data
);
45
46
/*
47
* General purpose special memory pool descriptor.
48
*/
49
struct
gen_pool
{
50
spinlock_t
lock
;
51
struct
list_head
chunks
;
/* list of chunks in this pool */
52
int
min_alloc_order
;
/* minimum allocation order */
53
54
genpool_algo_t
algo
;
/* allocation function */
55
void
*
data
;
56
};
57
58
/*
59
* General purpose special memory pool chunk descriptor.
60
*/
61
struct
gen_pool_chunk
{
62
struct
list_head
next_chunk
;
/* next chunk in pool */
63
atomic_t
avail
;
64
phys_addr_t
phys_addr
;
/* physical starting address of memory chunk */
65
unsigned
long
start_addr
;
/* starting address of memory chunk */
66
unsigned
long
end_addr
;
/* ending address of memory chunk */
67
unsigned
long
bits
[0];
/* bitmap for allocating memory chunk */
68
};
69
70
extern
struct
gen_pool
*
gen_pool_create
(
int
,
int
);
71
extern
phys_addr_t
gen_pool_virt_to_phys
(
struct
gen_pool
*
pool
,
unsigned
long
);
72
extern
int
gen_pool_add_virt
(
struct
gen_pool
*,
unsigned
long
,
phys_addr_t
,
73
size_t
,
int
);
86
static
inline
int
gen_pool_add(
struct
gen_pool
*
pool
,
unsigned
long
addr
,
87
size_t
size
,
int
nid)
88
{
89
return
gen_pool_add_virt
(pool, addr, -1, size, nid);
90
}
91
extern
void
gen_pool_destroy
(
struct
gen_pool
*);
92
extern
unsigned
long
gen_pool_alloc
(
struct
gen_pool
*,
size_t
);
93
extern
void
gen_pool_free
(
struct
gen_pool
*,
unsigned
long
,
size_t
);
94
extern
void
gen_pool_for_each_chunk
(
struct
gen_pool
*,
95
void
(*)(
struct
gen_pool
*,
struct
gen_pool_chunk
*,
void
*),
void
*);
96
extern
size_t
gen_pool_avail
(
struct
gen_pool
*);
97
extern
size_t
gen_pool_size
(
struct
gen_pool
*);
98
99
extern
void
gen_pool_set_algo
(
struct
gen_pool
*
pool
,
genpool_algo_t
algo
,
100
void
*
data
);
101
102
extern
unsigned
long
gen_pool_first_fit
(
unsigned
long
*
map
,
unsigned
long
size
,
103
unsigned
long
start
,
unsigned
int
nr
,
void
*
data
);
104
105
extern
unsigned
long
gen_pool_best_fit
(
unsigned
long
*
map
,
unsigned
long
size
,
106
unsigned
long
start
,
unsigned
int
nr
,
void
*
data
);
107
108
#endif
/* __GENALLOC_H__ */
Generated on Thu Jan 10 2013 14:51:28 for Linux Kernel by
1.8.2