diff options
| -rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.c | 20 | ||||
| -rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.h | 1 | 
2 files changed, 18 insertions, 3 deletions
diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 7790971f867..27a64d86ead 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -2921,6 +2921,15 @@ rdma_do_reads (rdma_peer_t *peer, rdma_post_t *post, rdma_read_chunk_t *readch)                  size += readch[i].rc_target.rs_length;          } +        if (i == 0) { +                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG, +                        "message type specified as rdma-read but there are no " +                        "rdma read-chunks present"); +                goto out; +        } + +        post->ctx.rdma_reads = i; +          if (size > peer->trans->ctx->page_size) {                  gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,                          "total size of rdma-read (%lu) is greater than " @@ -3388,7 +3397,7 @@ void  rdma_handle_successful_send_completion (rdma_peer_t *peer, struct ibv_wc *wc)  {          rdma_post_t            *post     = NULL; -        int                     refcount = 0, ret = 0; +        int                     reads    = 0, ret = 0;          if (wc->opcode != IBV_WC_RDMA_READ) {                  goto out; @@ -3396,8 +3405,13 @@ rdma_handle_successful_send_completion (rdma_peer_t *peer, struct ibv_wc *wc)          post = (rdma_post_t *)(long) wc->wr_id; -        refcount = rdma_post_get_refcount (post); -        if (refcount != 1) { +        pthread_mutex_lock (&post->lock); +        { +                reads = --post->ctx.rdma_reads; +        } +        pthread_mutex_unlock (&post->lock); + +        if (reads != 0) {                  /* if it is not the last rdma read, we've got nothing to do */                  goto out;          } diff --git a/rpc/rpc-transport/rdma/src/rdma.h b/rpc/rpc-transport/rdma/src/rdma.h index 51242d6b4ad..04386a98faf 100644 --- a/rpc/rpc-transport/rdma/src/rdma.h +++ b/rpc/rpc-transport/rdma/src/rdma.h @@ -257,6 +257,7 @@ struct __rdma_post_context {          int                count;          struct iobref     *iobref;          char               is_request; +        int                rdma_reads;          rdma_reply_info_t *reply_info;  };  typedef struct __rdma_post_context rdma_post_context_t;  | 
