Commit e4dc81ed authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland

fs: dlm: memory cache for lowcomms hotpath

This patch introduces a kmem cache for dlm_msg handles which are used
always if dlm sends a message out. Even if their are covered by midcomms
layer or not.
Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 3af2326c
...@@ -204,6 +204,11 @@ struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void) ...@@ -204,6 +204,11 @@ struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void)
0, 0, writequeue_entry_ctor); 0, 0, writequeue_entry_ctor);
} }
struct kmem_cache *dlm_lowcomms_msg_cache_create(void)
{
return kmem_cache_create("dlm_msg", sizeof(struct dlm_msg), 0, 0, NULL);
}
/* need to held writequeue_lock */ /* need to held writequeue_lock */
static struct writequeue_entry *con_next_wq(struct connection *con) static struct writequeue_entry *con_next_wq(struct connection *con)
{ {
...@@ -750,7 +755,7 @@ static void dlm_msg_release(struct kref *kref) ...@@ -750,7 +755,7 @@ static void dlm_msg_release(struct kref *kref)
struct dlm_msg *msg = container_of(kref, struct dlm_msg, ref); struct dlm_msg *msg = container_of(kref, struct dlm_msg, ref);
kref_put(&msg->entry->ref, dlm_page_release); kref_put(&msg->entry->ref, dlm_page_release);
kfree(msg); dlm_free_msg(msg);
} }
static void free_entry(struct writequeue_entry *e) static void free_entry(struct writequeue_entry *e)
...@@ -1259,7 +1264,7 @@ static struct dlm_msg *dlm_lowcomms_new_msg_con(struct connection *con, int len, ...@@ -1259,7 +1264,7 @@ static struct dlm_msg *dlm_lowcomms_new_msg_con(struct connection *con, int len,
struct writequeue_entry *e; struct writequeue_entry *e;
struct dlm_msg *msg; struct dlm_msg *msg;
msg = kzalloc(sizeof(*msg), allocation); msg = dlm_allocate_msg(allocation);
if (!msg) if (!msg)
return NULL; return NULL;
...@@ -1267,10 +1272,12 @@ static struct dlm_msg *dlm_lowcomms_new_msg_con(struct connection *con, int len, ...@@ -1267,10 +1272,12 @@ static struct dlm_msg *dlm_lowcomms_new_msg_con(struct connection *con, int len,
e = new_wq_entry(con, len, ppc, cb, data); e = new_wq_entry(con, len, ppc, cb, data);
if (!e) { if (!e) {
kfree(msg); dlm_free_msg(msg);
return NULL; return NULL;
} }
msg->retransmit = false;
msg->orig_msg = NULL;
msg->ppc = *ppc; msg->ppc = *ppc;
msg->len = len; msg->len = len;
msg->entry = e; msg->entry = e;
......
...@@ -48,6 +48,7 @@ int dlm_lowcomms_nodes_set_mark(int nodeid, unsigned int mark); ...@@ -48,6 +48,7 @@ int dlm_lowcomms_nodes_set_mark(int nodeid, unsigned int mark);
int dlm_lowcomms_addr(int nodeid, struct sockaddr_storage *addr, int len); int dlm_lowcomms_addr(int nodeid, struct sockaddr_storage *addr, int len);
void dlm_midcomms_receive_done(int nodeid); void dlm_midcomms_receive_done(int nodeid);
struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void); struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void);
struct kmem_cache *dlm_lowcomms_msg_cache_create(void);
#endif /* __LOWCOMMS_DOT_H__ */ #endif /* __LOWCOMMS_DOT_H__ */
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
static struct kmem_cache *writequeue_cache; static struct kmem_cache *writequeue_cache;
static struct kmem_cache *mhandle_cache; static struct kmem_cache *mhandle_cache;
static struct kmem_cache *msg_cache;
static struct kmem_cache *lkb_cache; static struct kmem_cache *lkb_cache;
static struct kmem_cache *rsb_cache; static struct kmem_cache *rsb_cache;
...@@ -36,6 +37,10 @@ int __init dlm_memory_init(void) ...@@ -36,6 +37,10 @@ int __init dlm_memory_init(void)
if (!lkb_cache) if (!lkb_cache)
goto lkb; goto lkb;
msg_cache = dlm_lowcomms_msg_cache_create();
if (!msg_cache)
goto msg;
rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb), rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb),
__alignof__(struct dlm_rsb), 0, NULL); __alignof__(struct dlm_rsb), 0, NULL);
if (!rsb_cache) if (!rsb_cache)
...@@ -44,6 +49,8 @@ int __init dlm_memory_init(void) ...@@ -44,6 +49,8 @@ int __init dlm_memory_init(void)
return 0; return 0;
rsb: rsb:
kmem_cache_destroy(msg_cache);
msg:
kmem_cache_destroy(lkb_cache); kmem_cache_destroy(lkb_cache);
lkb: lkb:
kmem_cache_destroy(mhandle_cache); kmem_cache_destroy(mhandle_cache);
...@@ -57,6 +64,7 @@ void dlm_memory_exit(void) ...@@ -57,6 +64,7 @@ void dlm_memory_exit(void)
{ {
kmem_cache_destroy(writequeue_cache); kmem_cache_destroy(writequeue_cache);
kmem_cache_destroy(mhandle_cache); kmem_cache_destroy(mhandle_cache);
kmem_cache_destroy(msg_cache);
kmem_cache_destroy(lkb_cache); kmem_cache_destroy(lkb_cache);
kmem_cache_destroy(rsb_cache); kmem_cache_destroy(rsb_cache);
} }
...@@ -129,3 +137,13 @@ void dlm_free_writequeue(struct writequeue_entry *writequeue) ...@@ -129,3 +137,13 @@ void dlm_free_writequeue(struct writequeue_entry *writequeue)
{ {
kmem_cache_free(writequeue_cache, writequeue); kmem_cache_free(writequeue_cache, writequeue);
} }
struct dlm_msg *dlm_allocate_msg(gfp_t allocation)
{
return kmem_cache_alloc(msg_cache, allocation);
}
void dlm_free_msg(struct dlm_msg *msg)
{
kmem_cache_free(msg_cache, msg);
}
...@@ -24,6 +24,8 @@ struct dlm_mhandle *dlm_allocate_mhandle(void); ...@@ -24,6 +24,8 @@ struct dlm_mhandle *dlm_allocate_mhandle(void);
void dlm_free_mhandle(struct dlm_mhandle *mhandle); void dlm_free_mhandle(struct dlm_mhandle *mhandle);
struct writequeue_entry *dlm_allocate_writequeue(void); struct writequeue_entry *dlm_allocate_writequeue(void);
void dlm_free_writequeue(struct writequeue_entry *writequeue); void dlm_free_writequeue(struct writequeue_entry *writequeue);
struct dlm_msg *dlm_allocate_msg(gfp_t allocation);
void dlm_free_msg(struct dlm_msg *msg);
#endif /* __MEMORY_DOT_H__ */ #endif /* __MEMORY_DOT_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment