PERFORCE change 129704 for review

Steve Wise swise at FreeBSD.org
Wed Nov 28 06:56:35 PST 2007


http://perforce.freebsd.org/chv.cgi?CH=129704

Change 129704 by swise at swise:vic10:iwarp on 2007/11/28 14:56:30

	Fixed cm_id refcounts to correctly work with the cv.

Affected files ...

.. //depot/projects/iwarp/sys/contrib/rdma/rdma_cma.c#6 edit

Differences ...

==== //depot/projects/iwarp/sys/contrib/rdma/rdma_cma.c#6 (text+ko) ====

@@ -89,7 +89,7 @@
 	struct ib_device	*device;
 	struct mtx		lock;
 	struct cv		comp;
-	atomic_t		refcount;
+	int			refcount;
 
 	LIST_HEAD(, rdma_id_private) id_list;
 	TAILQ_ENTRY(cma_device) list;
@@ -136,7 +136,7 @@
 	enum cma_state		state;
 	struct mtx		lock;
 	struct cv		comp;
-	atomic_t		refcount;
+	int			refcount;
 	struct cv		wait_remove;
 	atomic_t		dev_remove;
 
@@ -279,7 +279,9 @@
 static void cma_attach_to_dev(struct rdma_id_private *id_priv,
 			      struct cma_device *cma_dev)
 {
-	atomic_inc(&cma_dev->refcount);
+	mtx_lock(&cma_dev->lock);
+	cma_dev->refcount++;
+	mtx_unlock(&cma_dev->lock);
 	id_priv->cma_dev = cma_dev;
 	id_priv->id.device = cma_dev->device;
 	LIST_INSERT_HEAD(&cma_dev->id_list, id_priv, list);
@@ -288,7 +290,7 @@
 static inline void cma_deref_dev(struct cma_device *cma_dev)
 {
 	mtx_lock(&cma_dev->lock);
-	if (atomic_dec_and_test(&cma_dev->refcount))
+	if (--cma_dev->refcount == 0)
 		cv_broadcast(&cma_dev->comp);
 	mtx_unlock(&cma_dev->lock);
 }
@@ -365,8 +367,11 @@
 static void cma_deref_id(struct rdma_id_private *id_priv)
 {
 	mtx_lock(&id_priv->lock);
-	if (atomic_dec_and_test(&id_priv->refcount))
+	printf("%s id %p refcount %d\n", __FUNCTION__, id_priv, id_priv->refcount);
+	if (--id_priv->refcount == 0) {
+		printf("%s cv_bcast %p \n", __FUNCTION__, id_priv);
 		cv_broadcast(&id_priv->comp);
+	}
 	mtx_unlock(&id_priv->lock);
 }
 
@@ -414,7 +419,8 @@
 	id_priv->id.ps = ps;
 	mtx_init(&id_priv->lock, "rdma_cm_id_priv", NULL, MTX_DUPOK|MTX_DEF);
 	cv_init(&id_priv->comp, "rdma_cm_id_priv");
-	atomic_set(&id_priv->refcount, 1);
+	id_priv->refcount = 1;
+	printf("%s id %p refcount %d\n", __FUNCTION__, id_priv, id_priv->refcount);
 	cv_init(&id_priv->wait_remove, "id priv wait remove");
 	atomic_set(&id_priv->dev_remove, 0);
 	LIST_INIT(&id_priv->listen_list);
@@ -784,7 +790,8 @@
 
 	cma_deref_id(id_priv);
 	mtx_lock(&id_priv->lock);
-	cv_wait(&id_priv->comp, &id_priv->lock);
+	if (id_priv->refcount)
+		cv_wait_unlock(&id_priv->comp, &id_priv->lock);
 
 	free(id_priv, M_DEVBUF);
 }
@@ -886,12 +893,13 @@
 		cma_detach_from_dev(id_priv);
 	}
 	mtx_unlock(&lock);
-
 	cma_release_port(id_priv);
 	cma_deref_id(id_priv);
 	mtx_lock(&id_priv->lock);
-	cv_wait(&id_priv->comp, &id_priv->lock);
-
+	BUG_ON(id_priv->refcount < 0);
+	if (id_priv->refcount)
+		cv_wait(&id_priv->comp, &id_priv->lock);
+	mtx_unlock(&id_priv->lock);
 	free(id_priv->id.route.path_rec, M_DEVBUF);
 	free(id_priv, M_DEVBUF);
 }
@@ -1687,7 +1695,10 @@
 	if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_QUERY))
 		return (EINVAL);
 
-	atomic_inc(&id_priv->refcount);
+	mtx_lock(&id_priv->lock);
+	id_priv->refcount++;
+	printf("%s id %p refcount %d\n", __FUNCTION__, id_priv, id_priv->refcount);
+	mtx_unlock(&id_priv->lock);
 #ifdef IB_SUPPORTED
 	switch (rdma_node_get_transport(id->device->node_type)) {
 	case RDMA_TRANSPORT_IB:
@@ -1866,7 +1877,10 @@
 	if (!cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_ADDR_QUERY))
 		return (EINVAL);
 
-	atomic_inc(&id_priv->refcount);
+	mtx_lock(&id_priv->lock);
+	id_priv->refcount++;
+	printf("%s id %p refcount %d\n", __FUNCTION__, id_priv, id_priv->refcount);
+	mtx_unlock(&id_priv->lock);
 	memcpy(&id->route.addr.dst_addr, dst_addr, ip_addr_size(dst_addr));
 	if (cma_any_addr(dst_addr))
 		ret = cma_resolve_loopback(id_priv);
@@ -2783,9 +2797,8 @@
 
 	cma_dev->device = device;
 
-	mtx_init(&lock, "cma_device", NULL, MTX_DEF);
 	cv_init(&cma_dev->comp, "cma_device");
-	atomic_set(&cma_dev->refcount, 1);
+	cma_dev->refcount = 1;
 	LIST_INIT(&cma_dev->id_list);
 	ib_set_client_data(device, &cma_client, cma_dev);
 
@@ -2834,7 +2847,10 @@
 		}
 
 		LIST_REMOVE(id_priv, list);
-		atomic_inc(&id_priv->refcount);
+		mtx_lock(&id_priv->lock);
+		id_priv->refcount++;
+	printf("%s id %p refcount %d\n", __FUNCTION__, id_priv, id_priv->refcount);
+		mtx_unlock(&id_priv->lock);
 		mtx_unlock(&lock);
 
 		ret = cma_remove_id_dev(id_priv);
@@ -2872,6 +2888,7 @@
 
 	LIST_INIT(&listen_any_list);
 	TAILQ_INIT(&dev_list);
+	mtx_init(&lock, "cma_device", NULL, MTX_DEF);
 
 	arc4rand(&next_port, sizeof next_port, 0);
 	next_port = ((unsigned int) next_port %


More information about the p4-projects mailing list