From b66f4598f4dafb6479232b20c5c521ab0da4e84a Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Sun, 24 Oct 2010 23:44:34 +0000 Subject: rpc-transport/rdma: create request_context only if message contains read chunks or write chunks. Signed-off-by: Raghavendra G Signed-off-by: Anand V. Avati BUG: 1992 (glusterd crashed while submitting a callback.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1992 --- rpc/rpc-transport/rdma/src/rdma.c | 44 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 18 deletions(-) (limited to 'rpc/rpc-transport/rdma/src/rdma.c') diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 6a95f9294..903536410 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -1000,22 +1000,25 @@ __rdma_ioq_churn_request (rdma_peer_t *peer, rdma_ioq_t *entry, goto out; } - request_ctx = mem_get (priv->device->request_ctx_pool); - if (request_ctx == NULL) { - ret = -1; - gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory"); - goto out; - } + if ((wtype != rdma_noch) || (rtype != rdma_noch)) { + request_ctx = mem_get (priv->device->request_ctx_pool); + if (request_ctx == NULL) { + ret = -1; + gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory"); + goto out; + } - memset (request_ctx, 0, sizeof (*request_ctx)); + memset (request_ctx, 0, sizeof (*request_ctx)); - request_ctx->pool = priv->device->request_ctx_pool; - request_ctx->peer = peer; + request_ctx->pool = priv->device->request_ctx_pool; + request_ctx->peer = peer; - entry->msg.request.rpc_req->conn_private = request_ctx; - if (entry->msg.request.rsp_iobref != NULL) { - request_ctx->rsp_iobref - = iobref_ref (entry->msg.request.rsp_iobref); + entry->msg.request.rpc_req->conn_private = request_ctx; + + if (entry->msg.request.rsp_iobref != NULL) { + request_ctx->rsp_iobref + = iobref_ref (entry->msg.request.rsp_iobref); + } } rpc_msg = (struct rpc_msg *) entry->rpchdr[0].iov_base; @@ -1094,7 +1097,10 @@ out: if (ret == -1) { rpc_req = entry->msg.request.rpc_req; - __rdma_request_context_destroy (rpc_req->conn_private); + if (request_ctx != NULL) { + __rdma_request_context_destroy (rpc_req->conn_private); + } + rpc_req->conn_private = NULL; } @@ -3054,11 +3060,13 @@ rdma_pollin_notify (rdma_peer_t *peer, rdma_post_t *post) rpc_req->conn_private = NULL; priv = peer->trans->private; - pthread_mutex_lock (&priv->write_mutex); - { - __rdma_request_context_destroy (request_context); + if (request_context != NULL) { + pthread_mutex_lock (&priv->write_mutex); + { + __rdma_request_context_destroy (request_context); + } + pthread_mutex_unlock (&priv->write_mutex); } - pthread_mutex_unlock (&priv->write_mutex); pollin->is_reply = 1; } -- cgit