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);
|
||||
}
|
||||
|
||||
/* Slab caches for frequently-allocated structures */
|
||||
|
||||
static struct kmem_cache *ceph_msg_cache;
|
||||
|
||||
/* static tag bytes (protocol control messages) */
|
||||
static char tag_msg = CEPH_MSGR_TAG_MSG;
|
||||
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 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)
|
||||
{
|
||||
if (ceph_msgr_wq) {
|
||||
|
@ -233,6 +253,8 @@ static void _ceph_msgr_exit(void)
|
|||
ceph_msgr_wq = NULL;
|
||||
}
|
||||
|
||||
ceph_msgr_slab_exit();
|
||||
|
||||
BUG_ON(zero_page == NULL);
|
||||
kunmap(zero_page);
|
||||
page_cache_release(zero_page);
|
||||
|
@ -245,6 +267,9 @@ int ceph_msgr_init(void)
|
|||
zero_page = ZERO_PAGE(0);
|
||||
page_cache_get(zero_page);
|
||||
|
||||
if (ceph_msgr_slab_init())
|
||||
return -ENOMEM;
|
||||
|
||||
ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0);
|
||||
if (ceph_msgr_wq)
|
||||
return 0;
|
||||
|
@ -3068,7 +3093,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
|
|||
{
|
||||
struct ceph_msg *m;
|
||||
|
||||
m = kzalloc(sizeof(*m), flags);
|
||||
m = kmem_cache_zalloc(ceph_msg_cache, flags);
|
||||
if (m == NULL)
|
||||
goto out;
|
||||
|
||||
|
@ -3215,7 +3240,7 @@ void ceph_msg_kfree(struct ceph_msg *m)
|
|||
vfree(m->front.iov_base);
|
||||
else
|
||||
kfree(m->front.iov_base);
|
||||
kfree(m);
|
||||
kmem_cache_free(ceph_msg_cache, m);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue