usr/src/uts/common/rpc/svc.c
changeset 8695 115e6d42744b
parent 8139 ce46cce975a2
child 8778 b4169d2ab299
--- a/usr/src/uts/common/rpc/svc.c	Thu Feb 05 11:59:59 2009 -0500
+++ b/usr/src/uts/common/rpc/svc.c	Thu Feb 05 10:03:55 2009 -0800
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -2585,21 +2585,24 @@
  * to cleanup the pool and destroy the xprt in svc_queueclose()
  */
 void
-rdma_stop(rdma_xprt_group_t rdma_xprts)
+rdma_stop(rdma_xprt_group_t *rdma_xprts)
 {
 	SVCMASTERXPRT *xprt;
 	rdma_xprt_record_t *curr_rec;
 	queue_t *q;
 	mblk_t *mp;
-	int i;
+	int i, rtg_count;
 	SVCPOOL *pool;
 
-	if (rdma_xprts.rtg_count == 0)
+	if (rdma_xprts->rtg_count == 0)
 		return;
 
-	for (i = 0; i < rdma_xprts.rtg_count; i++) {
-		curr_rec = rdma_xprts.rtg_listhead;
-		rdma_xprts.rtg_listhead = curr_rec->rtr_next;
+	rtg_count = rdma_xprts->rtg_count;
+
+	for (i = 0; i < rtg_count; i++) {
+		curr_rec = rdma_xprts->rtg_listhead;
+		rdma_xprts->rtg_listhead = curr_rec->rtr_next;
+		rdma_xprts->rtg_count--;
 		curr_rec->rtr_next = NULL;
 		xprt = curr_rec->rtr_xprt_ptr;
 		q = xprt->xp_wq;
@@ -2617,8 +2620,13 @@
 			mp->b_next = (mblk_t *)0;
 			pool->p_reqs--;
 			mutex_exit(&pool->p_req_lock);
-			if (mp)
+			if (mp) {
+				rdma_recv_data_t *rdp = (rdma_recv_data_t *)
+				    mp->b_rptr;
+				RDMA_BUF_FREE(rdp->conn, &rdp->rpcmsg);
+				RDMA_REL_CONN(rdp->conn);
 				freemsg(mp);
+			}
 		}
 		mutex_exit(&xprt->xp_req_lock);
 		svc_queueclose(q);
@@ -2631,7 +2639,7 @@
 		 * based master transport handle.
 		 */
 		kmem_free(curr_rec, sizeof (rdma_xprt_record_t));
-		if (!rdma_xprts.rtg_listhead)
+		if (!rdma_xprts->rtg_listhead)
 			break;
 	}
 }