libceph: allocate ceph messages with a slab allocator
Create a slab cache to manage ceph_msg structure allocation. This is part of: http://tracker.ceph.com/issues/3926 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
parent
78c2a44aae
commit
e3d5d63804
|
@ -152,6 +152,10 @@ static bool con_flag_test_and_set(struct ceph_connection *con,
|
||||||
return test_and_set_bit(con_flag, &con->flags);
|
return test_and_set_bit(con_flag, &con->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Slab caches for frequently-allocated structures */
|
||||||
|
|
||||||
|
static struct kmem_cache *ceph_msg_cache;
|
||||||
|
|
||||||
/* static tag bytes (protocol control messages) */
|
/* static tag bytes (protocol control messages) */
|
||||||
static char tag_msg = CEPH_MSGR_TAG_MSG;
|
static char tag_msg = CEPH_MSGR_TAG_MSG;
|
||||||
static char tag_ack = CEPH_MSGR_TAG_ACK;
|
static char tag_ack = CEPH_MSGR_TAG_ACK;
|
||||||
|
@ -226,6 +230,22 @@ static void encode_my_addr(struct ceph_messenger *msgr)
|
||||||
*/
|
*/
|
||||||
static struct workqueue_struct *ceph_msgr_wq;
|
static struct workqueue_struct *ceph_msgr_wq;
|
||||||
|
|
||||||
|
static int ceph_msgr_slab_init(void)
|
||||||
|
{
|
||||||
|
BUG_ON(ceph_msg_cache);
|
||||||
|
ceph_msg_cache = kmem_cache_create("ceph_msg",
|
||||||
|
sizeof (struct ceph_msg),
|
||||||
|
__alignof__(struct ceph_msg), 0, NULL);
|
||||||
|
return ceph_msg_cache ? 0 : -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ceph_msgr_slab_exit(void)
|
||||||
|
{
|
||||||
|
BUG_ON(!ceph_msg_cache);
|
||||||
|
kmem_cache_destroy(ceph_msg_cache);
|
||||||
|
ceph_msg_cache = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void _ceph_msgr_exit(void)
|
static void _ceph_msgr_exit(void)
|
||||||
{
|
{
|
||||||
if (ceph_msgr_wq) {
|
if (ceph_msgr_wq) {
|
||||||
|
@ -233,6 +253,8 @@ static void _ceph_msgr_exit(void)
|
||||||
ceph_msgr_wq = NULL;
|
ceph_msgr_wq = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ceph_msgr_slab_exit();
|
||||||
|
|
||||||
BUG_ON(zero_page == NULL);
|
BUG_ON(zero_page == NULL);
|
||||||
kunmap(zero_page);
|
kunmap(zero_page);
|
||||||
page_cache_release(zero_page);
|
page_cache_release(zero_page);
|
||||||
|
@ -245,6 +267,9 @@ int ceph_msgr_init(void)
|
||||||
zero_page = ZERO_PAGE(0);
|
zero_page = ZERO_PAGE(0);
|
||||||
page_cache_get(zero_page);
|
page_cache_get(zero_page);
|
||||||
|
|
||||||
|
if (ceph_msgr_slab_init())
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0);
|
ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0);
|
||||||
if (ceph_msgr_wq)
|
if (ceph_msgr_wq)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3068,7 +3093,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
|
||||||
{
|
{
|
||||||
struct ceph_msg *m;
|
struct ceph_msg *m;
|
||||||
|
|
||||||
m = kzalloc(sizeof(*m), flags);
|
m = kmem_cache_zalloc(ceph_msg_cache, flags);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -3215,7 +3240,7 @@ void ceph_msg_kfree(struct ceph_msg *m)
|
||||||
vfree(m->front.iov_base);
|
vfree(m->front.iov_base);
|
||||||
else
|
else
|
||||||
kfree(m->front.iov_base);
|
kfree(m->front.iov_base);
|
||||||
kfree(m);
|
kmem_cache_free(ceph_msg_cache, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue