fs: dlm: memory cache for midcomms hotpath
authorAlexander Aring <aahringo@redhat.com>
Tue, 30 Nov 2021 19:47:18 +0000 (14:47 -0500)
committerDavid Teigland <teigland@redhat.com>
Tue, 7 Dec 2021 18:42:26 +0000 (12:42 -0600)
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>
fs/dlm/memory.c
fs/dlm/memory.h
fs/dlm/midcomms.c
fs/dlm/midcomms.h

index 5918f4d..8996c64 100644 (file)
 ******************************************************************************/
 
 #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);
+}
index 4f218ea..c4d46be 100644 (file)
@@ -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__ */
 
index 74b4308..3635e42 100644 (file)
 #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);
index bc63cf7..82bcd96 100644 (file)
@@ -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__ */