fs: dlm: memory cache for midcomms hotpath
This patch will introduce a kmem cache for allocating message handles which are needed for midcomms layer to take track of lowcomms messages. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
be3b0400ed
commit
6c547f2640
|
@ -10,32 +10,44 @@
|
|||
******************************************************************************/
|
||||
|
||||
#include "dlm_internal.h"
|
||||
#include "midcomms.h"
|
||||
#include "config.h"
|
||||
#include "memory.h"
|
||||
|
||||
static struct kmem_cache *mhandle_cache;
|
||||
static struct kmem_cache *lkb_cache;
|
||||
static struct kmem_cache *rsb_cache;
|
||||
|
||||
|
||||
int __init dlm_memory_init(void)
|
||||
{
|
||||
mhandle_cache = dlm_midcomms_cache_create();
|
||||
if (!mhandle_cache)
|
||||
goto out;
|
||||
|
||||
lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb),
|
||||
__alignof__(struct dlm_lkb), 0, NULL);
|
||||
if (!lkb_cache)
|
||||
return -ENOMEM;
|
||||
goto lkb;
|
||||
|
||||
rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb),
|
||||
__alignof__(struct dlm_rsb), 0, NULL);
|
||||
if (!rsb_cache) {
|
||||
kmem_cache_destroy(lkb_cache);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!rsb_cache)
|
||||
goto rsb;
|
||||
|
||||
return 0;
|
||||
|
||||
rsb:
|
||||
kmem_cache_destroy(lkb_cache);
|
||||
lkb:
|
||||
kmem_cache_destroy(mhandle_cache);
|
||||
out:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void dlm_memory_exit(void)
|
||||
{
|
||||
kmem_cache_destroy(mhandle_cache);
|
||||
kmem_cache_destroy(lkb_cache);
|
||||
kmem_cache_destroy(rsb_cache);
|
||||
}
|
||||
|
@ -89,3 +101,12 @@ void dlm_free_lkb(struct dlm_lkb *lkb)
|
|||
kmem_cache_free(lkb_cache, lkb);
|
||||
}
|
||||
|
||||
struct dlm_mhandle *dlm_allocate_mhandle(void)
|
||||
{
|
||||
return kmem_cache_alloc(mhandle_cache, GFP_NOFS);
|
||||
}
|
||||
|
||||
void dlm_free_mhandle(struct dlm_mhandle *mhandle)
|
||||
{
|
||||
kmem_cache_free(mhandle_cache, mhandle);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls);
|
|||
void dlm_free_lkb(struct dlm_lkb *l);
|
||||
char *dlm_allocate_lvb(struct dlm_ls *ls);
|
||||
void dlm_free_lvb(char *l);
|
||||
struct dlm_mhandle *dlm_allocate_mhandle(void);
|
||||
void dlm_free_mhandle(struct dlm_mhandle *mhandle);
|
||||
|
||||
#endif /* __MEMORY_DOT_H__ */
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@
|
|||
#include "dlm_internal.h"
|
||||
#include "lowcomms.h"
|
||||
#include "config.h"
|
||||
#include "memory.h"
|
||||
#include "lock.h"
|
||||
#include "util.h"
|
||||
#include "midcomms.h"
|
||||
|
@ -220,6 +221,12 @@ DEFINE_STATIC_SRCU(nodes_srcu);
|
|||
*/
|
||||
static DEFINE_MUTEX(close_lock);
|
||||
|
||||
struct kmem_cache *dlm_midcomms_cache_create(void)
|
||||
{
|
||||
return kmem_cache_create("dlm_mhandle", sizeof(struct dlm_mhandle),
|
||||
0, 0, NULL);
|
||||
}
|
||||
|
||||
static inline const char *dlm_state_str(int state)
|
||||
{
|
||||
switch (state) {
|
||||
|
@ -279,7 +286,7 @@ static void dlm_mhandle_release(struct rcu_head *rcu)
|
|||
struct dlm_mhandle *mh = container_of(rcu, struct dlm_mhandle, rcu);
|
||||
|
||||
dlm_lowcomms_put_msg(mh->msg);
|
||||
kfree(mh);
|
||||
dlm_free_mhandle(mh);
|
||||
}
|
||||
|
||||
static void dlm_mhandle_delete(struct midcomms_node *node,
|
||||
|
@ -1073,10 +1080,12 @@ struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, int len,
|
|||
/* this is a bug, however we going on and hope it will be resolved */
|
||||
WARN_ON(test_bit(DLM_NODE_FLAG_STOP_TX, &node->flags));
|
||||
|
||||
mh = kzalloc(sizeof(*mh), GFP_NOFS);
|
||||
mh = dlm_allocate_mhandle();
|
||||
if (!mh)
|
||||
goto err;
|
||||
|
||||
mh->committed = false;
|
||||
mh->ack_rcv = NULL;
|
||||
mh->idx = idx;
|
||||
mh->node = node;
|
||||
|
||||
|
@ -1085,7 +1094,7 @@ struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, int len,
|
|||
msg = dlm_lowcomms_new_msg(nodeid, len, allocation, ppc,
|
||||
NULL, NULL);
|
||||
if (!msg) {
|
||||
kfree(mh);
|
||||
dlm_free_mhandle(mh);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -1094,13 +1103,13 @@ struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, int len,
|
|||
msg = dlm_midcomms_get_msg_3_2(mh, nodeid, len, allocation,
|
||||
ppc);
|
||||
if (!msg) {
|
||||
kfree(mh);
|
||||
dlm_free_mhandle(mh);
|
||||
goto err;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
kfree(mh);
|
||||
dlm_free_mhandle(mh);
|
||||
WARN_ON(1);
|
||||
goto err;
|
||||
}
|
||||
|
@ -1136,7 +1145,7 @@ void dlm_midcomms_commit_mhandle(struct dlm_mhandle *mh)
|
|||
dlm_lowcomms_commit_msg(mh->msg);
|
||||
dlm_lowcomms_put_msg(mh->msg);
|
||||
/* mh is not part of rcu list in this case */
|
||||
kfree(mh);
|
||||
dlm_free_mhandle(mh);
|
||||
break;
|
||||
case DLM_VERSION_3_2:
|
||||
dlm_midcomms_commit_msg_3_2(mh);
|
||||
|
|
|
@ -30,6 +30,7 @@ int dlm_midcomms_send_queue_cnt(struct midcomms_node *node);
|
|||
uint32_t dlm_midcomms_version(struct midcomms_node *node);
|
||||
int dlm_midcomms_rawmsg_send(struct midcomms_node *node, void *buf,
|
||||
int buflen);
|
||||
struct kmem_cache *dlm_midcomms_cache_create(void);
|
||||
|
||||
#endif /* __MIDCOMMS_DOT_H__ */
|
||||
|
||||
|
|
Loading…
Reference in New Issue