summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorFaramarz Jalalian - Sun Microsystems - Irvine United States <Faramarz.Jalalian@Sun.COM>2010-02-01 14:47:31 -0800
committerFaramarz Jalalian - Sun Microsystems - Irvine United States <Faramarz.Jalalian@Sun.COM>2010-02-01 14:47:31 -0800
commit59c5abfe9386b29302c15715915e36bfd1969cf1 (patch)
treed3b7013d14172b4b3c8fff5d98a3724d8014de46 /usr/src
parent914d7362e7da089c86db1d24a546fe0ccbccac44 (diff)
downloadillumos-joyent-59c5abfe9386b29302c15715915e36bfd1969cf1.tar.gz
6919008 server panic at: rdma_svc_postrecv
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/rpc/rpcib.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/usr/src/uts/common/rpc/rpcib.c b/usr/src/uts/common/rpc/rpcib.c
index c40a61603b..fe0596250c 100644
--- a/usr/src/uts/common/rpc/rpcib.c
+++ b/usr/src/uts/common/rpc/rpcib.c
@@ -1397,7 +1397,11 @@ rib_svc_rcq_handler(ibt_cq_hdl_t cq_hdl, void *arg)
}
mutex_enter(&plugin_state_lock);
- if (plugin_state == ACCEPT) {
+ mutex_enter(&conn->c_lock);
+ if ((plugin_state == ACCEPT) &&
+ (conn->c_state == C_CONNECTED)) {
+ conn->c_ref++;
+ mutex_exit(&conn->c_lock);
while ((mp = allocb(sizeof (*rdp), BPRI_LO))
== NULL)
(void) strwaitbuf(
@@ -1415,9 +1419,6 @@ rib_svc_rcq_handler(ibt_cq_hdl_t cq_hdl, void *arg)
rdp->rpcmsg.type = RECV_BUFFER;
rdp->rpcmsg.len = wc.wc_bytes_xfer;
rdp->status = wc.wc_status;
- mutex_enter(&conn->c_lock);
- conn->c_ref++;
- mutex_exit(&conn->c_lock);
mp->b_wptr += sizeof (*rdp);
svc_queuereq((queue_t *)rib_stat->q, mp);
mutex_exit(&plugin_state_lock);
@@ -1428,6 +1429,7 @@ rib_svc_rcq_handler(ibt_cq_hdl_t cq_hdl, void *arg)
* requests for krpc, so don't do anything, just
* free the msg.
*/
+ mutex_exit(&conn->c_lock);
mutex_exit(&plugin_state_lock);
rib_rbuf_free(conn, RECV_BUFFER,
(void *)(uintptr_t)s_recvp->vaddr);