Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/ceph/msgpool.c
15109 views
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 *alloc_fn(gfp_t gfp_mask, void *arg)
11
{
12
struct ceph_msgpool *pool = arg;
13
void *p;
14
15
p = ceph_msg_new(0, pool->front_len, gfp_mask);
16
if (!p)
17
pr_err("msgpool %s alloc failed\n", pool->name);
18
return p;
19
}
20
21
static void free_fn(void *element, void *arg)
22
{
23
ceph_msg_put(element);
24
}
25
26
int ceph_msgpool_init(struct ceph_msgpool *pool,
27
int front_len, int size, bool blocking, const char *name)
28
{
29
pool->front_len = front_len;
30
pool->pool = mempool_create(size, alloc_fn, free_fn, pool);
31
if (!pool->pool)
32
return -ENOMEM;
33
pool->name = name;
34
return 0;
35
}
36
37
void ceph_msgpool_destroy(struct ceph_msgpool *pool)
38
{
39
mempool_destroy(pool->pool);
40
}
41
42
struct ceph_msg *ceph_msgpool_get(struct ceph_msgpool *pool,
43
int front_len)
44
{
45
if (front_len > pool->front_len) {
46
pr_err("msgpool_get pool %s need front %d, pool size is %d\n",
47
pool->name, front_len, pool->front_len);
48
WARN_ON(1);
49
50
/* try to alloc a fresh message */
51
return ceph_msg_new(0, front_len, GFP_NOFS);
52
}
53
54
return mempool_alloc(pool->pool, GFP_NOFS);
55
}
56
57
void ceph_msgpool_put(struct ceph_msgpool *pool, struct ceph_msg *msg)
58
{
59
/* reset msg front_len; user may have changed it */
60
msg->front.iov_len = pool->front_len;
61
msg->hdr.front_len = cpu_to_le32(pool->front_len);
62
63
kref_init(&msg->kref); /* retake single ref */
64
}
65
66