(Work in Progress)
Note that this patch is completely untested to date.
---
 exec/totemiba.c |  388 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 211 insertions(+), 177 deletions(-)

diff --git a/exec/totemiba.c b/exec/totemiba.c
index 5aa2787..8ef52c9 100644
--- a/exec/totemiba.c
+++ b/exec/totemiba.c
@@ -59,6 +59,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netdb.h>
@@ -73,6 +74,7 @@
 #include <corosync/totem/coropoll.h>
 #define LOGSYS_UTILS_ONLY 1
 #include <corosync/engine/logsys.h>
+#include "totembuf.h"
 #include "totemiba.h"
 #include "wthread.h"
 
@@ -82,6 +84,8 @@
 
 #define MAX_MTU_SIZE 4096
 
+#define TOTEMIBA_BUFFER_MAGIC 0xbeeffeedu
+
 struct totemiba_instance {
        struct sockaddr bind_addr;
 
@@ -195,12 +199,6 @@ struct totemiba_instance {
 
        int totemiba_subsys_id;
 
-       struct list_head mcast_send_buf_free;
-
-       struct list_head token_send_buf_free;
-
-       struct list_head mcast_send_buf_head;
-
        struct list_head token_send_buf_head;
 
        struct list_head recv_token_recv_buf_head;
@@ -218,22 +216,22 @@ do {                                                      
                \
                                    LOGSYS_RECID_LOG),                  \
                 __FUNCTION__, __FILE__, __LINE__,                      \
                (const char *)format, ##args);                          \
-} while (0);
+} while (0)
 
-struct recv_buf {
-       struct list_head list_all;
-       struct ibv_recv_wr recv_wr;
-       struct ibv_sge sge;
+struct iba_buf {
+       uint32_t magic;
+       struct list_head list_active;
        struct ibv_mr *mr;
-       char buffer[MAX_MTU_SIZE];
+       union {
+               char buffer[MAX_MTU_SIZE];
+               struct {
+                       struct ibv_grh header;
+                       char packet[0];
+               } p;
+       } b;
 };
 
-struct send_buf {
-       struct list_head list_free;
-       struct list_head list_all;
-       struct ibv_mr *mr;
-       char buffer[MAX_MTU_SIZE];
-};
+#define IBA_BUF_FROM_PACKET(PACKET) (struct iba_buf *)(((char *)(PACKET)) - 
offsetof(struct iba_buf, b.p.packet))
 
 static hdb_handle_t
 void2wrid (void *v) { union u u; u.v = v; return u.wr_id; }
@@ -241,228 +239,232 @@ void2wrid (void *v) { union u u; u.v = v; return 
u.wr_id; }
 static void *
 wrid2void (uint64_t wr_id) { union u u; u.wr_id = wr_id; return u.v; }
 
+static struct totembuf_list *free_list = NULL;
+
 static void totemiba_instance_initialize (struct totemiba_instance *instance)
 {
        memset (instance, 0, sizeof (struct totemiba_instance));
-       list_init (&instance->mcast_send_buf_free);
-       list_init (&instance->token_send_buf_free);
-       list_init (&instance->mcast_send_buf_head);
        list_init (&instance->token_send_buf_head);
        list_init (&instance->recv_token_recv_buf_head);
 }
 
-static inline struct send_buf *mcast_send_buf_get (
-       struct totemiba_instance *instance)
+static struct iba_buf *iba_buf_alloc (void)
 {
-       struct send_buf *send_buf;
-
-       if (list_empty (&instance->mcast_send_buf_free) == 0) {
-               send_buf = list_entry (instance->mcast_send_buf_free.next, 
struct send_buf, list_free);
-               list_del (&send_buf->list_free);
-               return (send_buf);
-       }
+       struct iba_buf *new_buf = totembuf_alloc (free_list);
 
-       send_buf = malloc (sizeof (struct send_buf));
-       if (send_buf == NULL) {
+       if (new_buf == NULL) {
                return (NULL);
        }
-       send_buf->mr = ibv_reg_mr (instance->mcast_pd,
-               send_buf->buffer,
+
+       new_buf->magic = TOTEMIBA_BUFFER_MAGIC;
+       list_init (&new_buf->list_active);
+       new_buf->mr = NULL;
+
+       return (new_buf);
+}
+
+static int iba_buf_register (
+       struct totemiba_instance *instance,
+       struct iba_buf *buf,
+       struct ibv_pd *pd)
+{
+       buf->mr = ibv_reg_mr (pd, buf->b.buffer,
                2048, IBV_ACCESS_LOCAL_WRITE);
-       if (send_buf->mr == NULL) {
+       if (buf->mr == NULL) {
                log_printf (LOGSYS_LEVEL_ERROR, "couldn't register memory 
range\n");
-               return (NULL);
+               if (!totembuf_is_retained (buf)) {
+                       totembuf_dealloc (buf);
+               }
+               return (-1);
        }
-       list_init (&send_buf->list_all);
-       list_add_tail (&send_buf->list_all, &instance->mcast_send_buf_head);
-               
-       return (send_buf);
+       return (0);
 }
 
-static inline void mcast_send_buf_put (
+static inline struct iba_buf *send_buf_new (
        struct totemiba_instance *instance,
-       struct send_buf *send_buf)
+       const void *data,
+       size_t length)
 {
-       list_init (&send_buf->list_free);
-       list_add_tail (&send_buf->list_free, &instance->mcast_send_buf_free);
+       struct iba_buf *new_buf = iba_buf_alloc();
+
+       if (new_buf == NULL) {
+               return (NULL);
+       }
+
+       assert (length <= (sizeof (new_buf->b.buffer) - sizeof 
(new_buf->b.p.header)));
+       memcpy (new_buf->b.p.packet, data, length);
+
+       return (new_buf);
 }
 
-static inline struct send_buf *token_send_buf_get (
-       struct totemiba_instance *instance)
+static inline struct iba_buf *mcast_send_buf_get (
+       struct totemiba_instance *instance,
+       const void *ms,
+       size_t length)
 {
-       struct send_buf *send_buf;
+       struct iba_buf *send_buf = IBA_BUF_FROM_PACKET(ms);
+       assert (send_buf->magic == TOTEMIBA_BUFFER_MAGIC);
 
-       if (list_empty (&instance->token_send_buf_free) == 0) {
-               send_buf = list_entry (instance->token_send_buf_free.next, 
struct send_buf, list_free);
-               list_del (&send_buf->list_free);
-               return (send_buf);
+       if (send_buf->mr) {
+               /* Buffer is already enqueued. Make a copy. */
+               send_buf = send_buf_new (instance, send_buf->b.p.packet, 
length);
        }
 
-       send_buf = malloc (sizeof (struct send_buf));
-       if (send_buf == NULL) {
+       if (iba_buf_register (instance, send_buf, instance->mcast_pd)) {
                return (NULL);
        }
-       send_buf->mr = ibv_reg_mr (instance->send_token_pd,
-               send_buf->buffer,
-               2048, IBV_ACCESS_LOCAL_WRITE);
-       if (send_buf->mr == NULL) {
-               log_printf (LOGSYS_LEVEL_ERROR, "couldn't register memory 
range\n");
-               return (NULL);
-       }
-       list_init (&send_buf->list_all);
-       list_add_tail (&send_buf->list_all, &instance->token_send_buf_head);
-               
+
        return (send_buf);
 }
 
-static inline void token_send_buf_destroy (struct totemiba_instance *instance)
+static void iba_buf_put (struct iba_buf *iba_buf)
 {
-       struct list_head *list;
-       struct send_buf *send_buf;
-
-        for (list = instance->token_send_buf_head.next; list != 
&instance->token_send_buf_head;) {
-                send_buf = list_entry (list, struct send_buf, list_all);
-               list = list->next;
-               ibv_dereg_mr (send_buf->mr);
-               free (send_buf);
+       list_del (&iba_buf->list_active);
+       list_init (&iba_buf->list_active);
+       ibv_dereg_mr (iba_buf->mr);
+       iba_buf->mr = NULL;
+       if (!totembuf_is_retained (iba_buf)) {
+               totembuf_dealloc (iba_buf);
        }
-
-       list_init (&instance->token_send_buf_free);
-       list_init (&instance->token_send_buf_head);
 }
 
-static inline void token_send_buf_put (
+static inline struct iba_buf *token_send_buf_get (
        struct totemiba_instance *instance,
-       struct send_buf *send_buf)
+       const void *ms,
+       size_t length)
 {
-       list_init (&send_buf->list_free);
-       list_add_tail (&send_buf->list_free, &instance->token_send_buf_free);
+       struct iba_buf *send_buf;
+
+       send_buf = send_buf_new (instance, ms, length);
+
+       if (iba_buf_register (instance, send_buf, instance->send_token_pd)) {
+               return (NULL);
+       }
+
+       list_add_tail (&send_buf->list_active, &instance->token_send_buf_head);
+
+       return (send_buf);
 }
 
-static inline struct recv_buf *recv_token_recv_buf_create (
+static inline struct iba_buf *recv_token_recv_buf_get (
        struct totemiba_instance *instance)
 {
-       struct recv_buf *recv_buf;
+       struct iba_buf *recv_buf;
 
-       recv_buf = malloc (sizeof (struct recv_buf));
+       recv_buf = iba_buf_alloc();
        if (recv_buf == NULL) {
                return (NULL);
        }
 
-       recv_buf->mr = ibv_reg_mr (instance->recv_token_pd, &recv_buf->buffer,
-               2048,
-               IBV_ACCESS_LOCAL_WRITE);
-
-       recv_buf->recv_wr.next = NULL;
-       recv_buf->recv_wr.sg_list = &recv_buf->sge;
-       recv_buf->recv_wr.num_sge = 1;
-       recv_buf->recv_wr.wr_id = (uintptr_t)recv_buf;
+       if (iba_buf_register (instance, recv_buf, instance->recv_token_pd)) {
+               return (NULL);
+       }
 
-       recv_buf->sge.length = 2048;
-       recv_buf->sge.lkey = recv_buf->mr->lkey;
-       recv_buf->sge.addr = (uintptr_t)recv_buf->buffer;
+       list_add (&recv_buf->list_active, &instance->recv_token_recv_buf_head);
 
-       list_init (&recv_buf->list_all);
-       list_add (&recv_buf->list_all, &instance->recv_token_recv_buf_head);
        return (recv_buf);
 }
 
-static inline int recv_token_recv_buf_post (struct totemiba_instance 
*instance, struct recv_buf *recv_buf)
+static inline int recv_token_recv_buf_post (struct totemiba_instance 
*instance, struct iba_buf *recv_buf)
 {
-       struct ibv_recv_wr *fail_recv;
+       struct ibv_recv_wr recv_wr, *fail_recv;
+       struct ibv_sge sge;
        int res;
 
-       res = ibv_post_recv (instance->recv_token_cma_id->qp, 
&recv_buf->recv_wr, &fail_recv);
+       recv_wr.next = NULL;
+       recv_wr.sg_list = &sge;
+       recv_wr.num_sge = 1;
+       recv_wr.wr_id = (uintptr_t)recv_buf;
+
+       sge.length = 2048;
+       sge.lkey = recv_buf->mr->lkey;
+       sge.addr = (uintptr_t)recv_buf->b.buffer;
+
+       res = ibv_post_recv (instance->recv_token_cma_id->qp, &recv_wr, 
&fail_recv);
 
        return (res);
 }
 
 static inline void recv_token_recv_buf_post_initial (struct totemiba_instance 
*instance)
 {
-       struct recv_buf *recv_buf;
+       struct iba_buf *recv_buf;
        unsigned int i;
 
        for (i = 0; i < TOTAL_READ_POSTS; i++) {
-               recv_buf = recv_token_recv_buf_create (instance);
+               recv_buf = recv_token_recv_buf_get (instance);
 
-               recv_token_recv_buf_post (instance, recv_buf);
+               if (recv_buf) {
+                       recv_token_recv_buf_post (instance, recv_buf);
+               }
        }
 }
 
-static inline void recv_token_recv_buf_post_destroy (
-       struct totemiba_instance *instance)
+static inline void buf_list_destroy (struct list_head *head)
 {
-       struct recv_buf *recv_buf;
-       struct list_head *list;
+       struct list_head *list = head->next;
 
-       for (list = instance->recv_token_recv_buf_head.next;
-               list != &instance->recv_token_recv_buf_head;) {
-
-               recv_buf = list_entry (list, struct recv_buf, list_all);
+       while (list != head) {
+               struct iba_buf *iba_buf = list_entry (list, struct iba_buf, 
list_active);
                list = list->next;
-               ibv_dereg_mr (recv_buf->mr);
-               free (recv_buf);
+               iba_buf_put (iba_buf);
        }
-       list_init (&instance->recv_token_recv_buf_head);
 }
 
-static inline struct recv_buf *mcast_recv_buf_create (struct totemiba_instance 
*instance)
+static inline struct iba_buf *mcast_recv_buf_get (
+       struct totemiba_instance *instance)
 {
-       struct recv_buf *recv_buf;
-       struct ibv_mr *mr;
+       struct iba_buf *recv_buf;
 
-       recv_buf = malloc (sizeof (struct recv_buf));
+       recv_buf = iba_buf_alloc();
        if (recv_buf == NULL) {
                return (NULL);
        }
 
-       mr = ibv_reg_mr (instance->mcast_pd, &recv_buf->buffer,
-               2048,
-               IBV_ACCESS_LOCAL_WRITE);
-
-       recv_buf->recv_wr.next = NULL;
-       recv_buf->recv_wr.sg_list = &recv_buf->sge;
-       recv_buf->recv_wr.num_sge = 1;
-       recv_buf->recv_wr.wr_id = (uintptr_t)recv_buf;
-
-       recv_buf->sge.length = 2048;
-       recv_buf->sge.lkey = mr->lkey;
-       recv_buf->sge.addr = (uintptr_t)recv_buf->buffer;
+       if (iba_buf_register (instance, recv_buf, instance->mcast_pd)) {
+               return (NULL);
+       }
 
        return (recv_buf);
 }
 
-static inline int mcast_recv_buf_post (struct totemiba_instance *instance, 
struct recv_buf *recv_buf)
+static inline int mcast_recv_buf_post (struct totemiba_instance *instance, 
struct iba_buf *recv_buf)
 {
-       struct ibv_recv_wr *fail_recv;
+       struct ibv_recv_wr recv_wr, *fail_recv;
+       struct ibv_sge sge;
        int res;
 
-       res = ibv_post_recv (instance->mcast_cma_id->qp, &recv_buf->recv_wr, 
&fail_recv);
+       recv_wr.next = NULL;
+       recv_wr.sg_list = &sge;
+       recv_wr.num_sge = 1;
+       recv_wr.wr_id = (uintptr_t)recv_buf;
+
+       sge.length = 2048;
+       sge.lkey = recv_buf->mr->lkey;
+       sge.addr = (uintptr_t)recv_buf->b.buffer;
+
+       res = ibv_post_recv (instance->mcast_cma_id->qp, &recv_wr, &fail_recv);
 
        return (res);
 }
 
 static inline void mcast_recv_buf_post_initial (struct totemiba_instance 
*instance)
 {
-       struct recv_buf *recv_buf;
+       struct iba_buf *recv_buf;
        unsigned int i;
 
        for (i = 0; i < TOTAL_READ_POSTS; i++) {
-               recv_buf = mcast_recv_buf_create (instance);
+               recv_buf = mcast_recv_buf_get (instance);
 
                mcast_recv_buf_post (instance, recv_buf);
        }
 }
 
-static inline void iba_deliver_fn (struct totemiba_instance *instance, 
uint64_t wr_id, uint32_t bytes)
+static inline void iba_deliver_fn (
+       struct totemiba_instance *instance,
+       const struct iba_buf *recv_buf,
+       uint32_t bytes)
 {
-       const char *addr;
-       const struct recv_buf *recv_buf;
-
-       recv_buf = wrid2void(wr_id);
-       addr = &recv_buf->buffer[sizeof (struct ibv_grh)];
-
-       instance->totemiba_deliver_fn (instance->rrp_context, addr, bytes);
+       instance->totemiba_deliver_fn (instance->rrp_context, 
recv_buf->b.p.packet, bytes);
 }
 
 static int mcast_cq_send_event_fn (hdb_handle_t poll_handle,  int events,  int 
suck,  void *context)
@@ -481,7 +483,7 @@ static int mcast_cq_send_event_fn (hdb_handle_t 
poll_handle,  int events,  int s
        res = ibv_poll_cq (instance->mcast_send_cq, 32, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       mcast_send_buf_put (instance, wrid2void(wc[i].wr_id));
+                       iba_buf_put (wrid2void (wc[i].wr_id));
                }
        }
 
@@ -504,8 +506,17 @@ static int mcast_cq_recv_event_fn (hdb_handle_t 
poll_handle,  int events,  int s
        res = ibv_poll_cq (instance->mcast_recv_cq, 64, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       iba_deliver_fn (instance, wc[i].wr_id, wc[i].byte_len);
-                       mcast_recv_buf_post (instance, wrid2void(wc[i].wr_id));
+                       struct iba_buf *recv_buf = wrid2void (wc[i].wr_id);
+                       iba_deliver_fn (instance, recv_buf, wc[i].byte_len);
+
+                       if (totembuf_is_retained (recv_buf)) {
+                               /* Buffer has been added to the send queue */
+                               iba_buf_put (recv_buf);
+
+                               /* Get a new receive buffer to post to the 
receive queue */
+                               recv_buf = mcast_recv_buf_get (instance);
+                       }
+                       mcast_recv_buf_post (instance, recv_buf);
                }
        }
 
@@ -573,8 +584,9 @@ static int recv_token_cq_send_event_fn (hdb_handle_t 
poll_handle,  int events,
        res = ibv_poll_cq (instance->recv_token_send_cq, 32, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       iba_deliver_fn (instance, wc[i].wr_id, wc[i].byte_len);
-                       ibv_dereg_mr (wrid2void(wc[i].wr_id));
+                       struct iba_buf *send_buf = wrid2void (wc[i].wr_id);
+                       iba_deliver_fn (instance, send_buf, wc[i].byte_len);
+                       iba_buf_put (send_buf);
                }
        }
 
@@ -597,8 +609,17 @@ static int recv_token_cq_recv_event_fn (hdb_handle_t 
poll_handle,  int events,
        res = ibv_poll_cq (instance->recv_token_recv_cq, 32, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       iba_deliver_fn (instance, wc[i].wr_id, wc[i].byte_len);
-                       recv_token_recv_buf_post (instance, 
wrid2void(wc[i].wr_id));
+                       struct iba_buf *recv_buf = wrid2void (wc[i].wr_id);
+                       iba_deliver_fn (instance, recv_buf, wc[i].byte_len);
+
+                       if (totembuf_is_retained (recv_buf)) {
+                               /* Buffer has been added to the send queue */
+                               iba_buf_put (recv_buf);
+
+                               /* Get a new receive buffer to post to the 
receive queue */
+                               recv_buf = recv_token_recv_buf_get (instance);
+                       }
+                       recv_token_recv_buf_post (instance, recv_buf);
                }
        }
 
@@ -613,7 +634,7 @@ static int recv_token_accept_destroy (struct 
totemiba_instance *instance)
 
        rdma_destroy_qp (instance->recv_token_cma_id);
 
-       recv_token_recv_buf_post_destroy (instance);
+       buf_list_destroy (&instance->recv_token_recv_buf_head);
 
        ibv_destroy_cq (instance->recv_token_send_cq);
 
@@ -779,7 +800,7 @@ static int send_token_cq_send_event_fn (hdb_handle_t 
poll_handle,  int events,
        res = ibv_poll_cq (instance->send_token_send_cq, 32, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       token_send_buf_put (instance, wrid2void(wc[i].wr_id));
+                       iba_buf_put (wrid2void (wc[i].wr_id));
                }
        }
 
@@ -802,7 +823,9 @@ static int send_token_cq_recv_event_fn (hdb_handle_t 
poll_handle,  int events,
        res = ibv_poll_cq (instance->send_token_recv_cq, 32, wc);
        if (res > 0) {
                for (i = 0; i < res; i++) {
-                       iba_deliver_fn (instance, wc[i].wr_id, wc[i].byte_len);
+                       struct iba_buf *recv_buf = wrid2void (wc[i].wr_id);
+                       iba_deliver_fn (instance, recv_buf, wc[i].byte_len);
+                       iba_buf_put (recv_buf);
                }
        }
 
@@ -1020,7 +1043,7 @@ static int send_token_unbind (struct totemiba_instance 
*instance)
        ibv_destroy_cq (instance->send_token_recv_cq);
        ibv_destroy_comp_channel (instance->send_token_send_completion_channel);
        ibv_destroy_comp_channel (instance->send_token_recv_completion_channel);
-       token_send_buf_destroy (instance);
+       buf_list_destroy (&instance->token_send_buf_head);
        ibv_dealloc_pd (instance->send_token_pd);
        rdma_destroy_id (instance->send_token_cma_id);
        rdma_destroy_event_channel (instance->send_token_channel);
@@ -1283,6 +1306,10 @@ int totemiba_initialize (
        struct totemiba_instance *instance;
        int res = 0;
 
+       if (!free_list) {
+               free_list = totembuf_list_init (sizeof (struct iba_buf));
+       }
+
        instance = malloc (sizeof (struct totemiba_instance));
        if (instance == NULL) {
                return (-1);
@@ -1319,21 +1346,36 @@ int totemiba_initialize (
 
 void *totemiba_buffer_alloc (void)
 {
-       return malloc (MAX_MTU_SIZE);
+       struct iba_buf *send_buf = iba_buf_alloc();
+       if (send_buf == NULL) {
+               return (NULL);
+       }
+       return (send_buf->b.p.packet);
 }
 
 void *totemiba_buffer_retain (void *ptr)
 {
-       void *new_buf = totemiba_buffer_alloc();
-       if (new_buf) {
-               memcpy (new_buf, ptr, FRAME_SIZE_MAX);
+       struct iba_buf *send_buf = IBA_BUF_FROM_PACKET(ptr);
+       assert (send_buf->magic == TOTEMIBA_BUFFER_MAGIC);
+
+       send_buf = totembuf_retain (send_buf);
+       if (send_buf == NULL) {
+               return (NULL);
        }
-       return new_buf;
+       return (send_buf->b.p.packet);
 }
 
 void totemiba_buffer_release (void *ptr)
 {
-       return free (ptr);
+       struct iba_buf *send_buf = IBA_BUF_FROM_PACKET(ptr);
+       assert (send_buf->magic == TOTEMIBA_BUFFER_MAGIC);
+
+       if (send_buf->mr) {
+               /* Still awaiting transmission */
+               totembuf_release (send_buf);
+       } else {
+               totembuf_dealloc (send_buf);
+       }
 }
 
 int totemiba_processor_count_set (
@@ -1367,15 +1409,12 @@ int totemiba_token_send (
        int res = 0;
        struct ibv_send_wr send_wr, *failed_send_wr;
        struct ibv_sge sge;
-       void *msg;
-       struct send_buf *send_buf;
+       struct iba_buf *send_buf;
 
-       send_buf = token_send_buf_get (instance);
+       send_buf = token_send_buf_get (instance, ms, msg_len);
        if (send_buf == NULL) {
                return (-1);
        }
-       msg = send_buf->buffer;
-       memcpy (msg, ms, msg_len);
 
        send_wr.next = NULL;
        send_wr.sg_list = &sge;
@@ -1390,7 +1429,7 @@ int totemiba_token_send (
 
        sge.length = msg_len;
        sge.lkey = send_buf->mr->lkey;
-       sge.addr = (uintptr_t)msg;
+       sge.addr = (uintptr_t)send_buf->b.p.packet;
 
        res = ibv_post_send (instance->send_token_cma_id->qp, &send_wr, 
&failed_send_wr);
 
@@ -1406,16 +1445,14 @@ int totemiba_mcast_flush_send (
        int res = 0;
        struct ibv_send_wr send_wr, *failed_send_wr;
        struct ibv_sge sge;
-       void *msg;
-       struct send_buf *send_buf;
+       struct iba_buf *send_buf;
 
-       send_buf = mcast_send_buf_get (instance);
-       if (send_buf == NULL) {
+       send_buf = send_buf_new (instance, ms, msg_len);
+       if (send_buf == NULL ||
+           iba_buf_register (instance, send_buf, instance->mcast_pd)) {
                return (-1);
        }
 
-       msg = send_buf->buffer;
-       memcpy (msg, ms, msg_len);
        send_wr.next = NULL;
        send_wr.sg_list = &sge;
        send_wr.num_sge = 1;
@@ -1429,7 +1466,7 @@ int totemiba_mcast_flush_send (
 
        sge.length = msg_len;
        sge.lkey = send_buf->mr->lkey;
-       sge.addr = (uintptr_t)msg;
+       sge.addr = (uintptr_t)send_buf->b.p.packet;
 
        res = ibv_post_send (instance->mcast_cma_id->qp, &send_wr, 
&failed_send_wr);
        return (res);
@@ -1444,16 +1481,13 @@ int totemiba_mcast_noflush_send (
        int res = 0;
        struct ibv_send_wr send_wr, *failed_send_wr;
        struct ibv_sge sge;
-       void *msg;
-       struct send_buf *send_buf;
+       struct iba_buf *send_buf;
 
-       send_buf = mcast_send_buf_get (instance);
+       send_buf = mcast_send_buf_get (instance, ms, msg_len);
        if (send_buf == NULL) {
                return (-1);
        }
 
-       msg = send_buf->buffer;
-       memcpy (msg, ms, msg_len);
        send_wr.next = NULL;
        send_wr.sg_list = &sge;
        send_wr.num_sge = 1;
@@ -1467,7 +1501,7 @@ int totemiba_mcast_noflush_send (
 
        sge.length = msg_len;
        sge.lkey = send_buf->mr->lkey;
-       sge.addr = (uintptr_t)msg;
+       sge.addr = (uintptr_t)send_buf->b.p.packet;
 
        res = ibv_post_send (instance->mcast_cma_id->qp, &send_wr, 
&failed_send_wr);
        return (res);

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to