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
net
ceph
msgpool.c
Go to the documentation of this file.
1
#include <
linux/ceph/ceph_debug.h
>
2
3
#include <
linux/err.h
>
4
#include <linux/sched.h>
5
#include <linux/types.h>
6
#include <
linux/vmalloc.h
>
7
8
#include <
linux/ceph/msgpool.h
>
9
10
static
void
*msgpool_alloc(
gfp_t
gfp_mask
,
void
*
arg
)
11
{
12
struct
ceph_msgpool
*
pool
=
arg
;
13
struct
ceph_msg
*
msg
;
14
15
msg =
ceph_msg_new
(pool->
type
, pool->
front_len
, gfp_mask,
true
);
16
if
(!msg) {
17
dout
(
"msgpool_alloc %s failed\n"
, pool->
name
);
18
}
else
{
19
dout
(
"msgpool_alloc %s %p\n"
, pool->
name
, msg);
20
msg->
pool
=
pool
;
21
}
22
return
msg
;
23
}
24
25
static
void
msgpool_free(
void
*
element
,
void
*arg)
26
{
27
struct
ceph_msgpool
*pool =
arg
;
28
struct
ceph_msg
*msg =
element
;
29
30
dout
(
"msgpool_release %s %p\n"
, pool->
name
, msg);
31
msg->
pool
=
NULL
;
32
ceph_msg_put(msg);
33
}
34
35
int
ceph_msgpool_init
(
struct
ceph_msgpool
*pool,
int
type
,
36
int
front_len
,
int
size
,
bool
blocking,
const
char
*
name
)
37
{
38
dout
(
"msgpool %s init\n"
, name);
39
pool->
type
=
type
;
40
pool->
front_len
=
front_len
;
41
pool->
pool
=
mempool_create
(size, msgpool_alloc, msgpool_free, pool);
42
if
(!pool->
pool
)
43
return
-
ENOMEM
;
44
pool->
name
=
name
;
45
return
0;
46
}
47
48
void
ceph_msgpool_destroy
(
struct
ceph_msgpool
*pool)
49
{
50
dout
(
"msgpool %s destroy\n"
, pool->
name
);
51
mempool_destroy
(pool->
pool
);
52
}
53
54
struct
ceph_msg
*
ceph_msgpool_get
(
struct
ceph_msgpool
*pool,
55
int
front_len
)
56
{
57
struct
ceph_msg
*
msg
;
58
59
if
(front_len > pool->
front_len
) {
60
dout
(
"msgpool_get %s need front %d, pool size is %d\n"
,
61
pool->
name
, front_len, pool->
front_len
);
62
WARN_ON
(1);
63
64
/* try to alloc a fresh message */
65
return
ceph_msg_new
(pool->
type
, front_len,
GFP_NOFS
,
false
);
66
}
67
68
msg =
mempool_alloc
(pool->
pool
,
GFP_NOFS
);
69
dout
(
"msgpool_get %s %p\n"
, pool->
name
, msg);
70
return
msg
;
71
}
72
73
void
ceph_msgpool_put
(
struct
ceph_msgpool
*pool,
struct
ceph_msg
*msg)
74
{
75
dout
(
"msgpool_put %s %p\n"
, pool->
name
, msg);
76
77
/* reset msg front_len; user may have changed it */
78
msg->
front
.iov_len = pool->
front_len
;
79
msg->
hdr
.front_len =
cpu_to_le32
(pool->
front_len
);
80
81
kref_init(&msg->
kref
);
/* retake single ref */
82
mempool_free
(msg, pool->
pool
);
83
}
Generated on Thu Jan 10 2013 14:57:26 for Linux Kernel by
1.8.2