PERFORCE change 132410 for review

Steve Wise swise at FreeBSD.org
Thu Jan 3 09:24:57 PST 2008


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

Change 132410 by swise at swise:vic10:iwarp on 2008/01/03 17:24:40

	iwcm: don't use condvars
	
	Since the upcalls from the driver can be on the interrupt level,
	we need to use msleep/wakeup for synchronization in the iwcm.

Affected files ...

.. //depot/projects/iwarp/sys/contrib/rdma/rdma_iwcm.c#7 edit

Differences ...

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

@@ -39,8 +39,8 @@
 #include <sys/cdefs.h>
 
 #include <sys/param.h>
-#include <sys/condvar.h>
 #include <sys/systm.h>
+#include <sys/proc.h>
 #include <sys/kernel.h>
 #include <sys/libkern.h>
 #include <sys/socket.h>
@@ -79,8 +79,8 @@
 	enum iw_cm_state state;
 	unsigned long flags;
 	struct ib_qp *qp;
-	struct cv destroy_comp;
-	struct cv connect_wait;
+	void * destroy_comp;
+	void * connect_wait;
 	TAILQ_HEAD(, iwcm_work) work_list;
 	struct mtx lock;
 	atomic_t refcount;
@@ -198,7 +198,7 @@
 	BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
 	if (atomic_dec_and_test(&cm_id_priv->refcount)) {
 		BUG_ON(!TAILQ_EMPTY(&cm_id_priv->work_list));
-		cv_broadcast(&cm_id_priv->destroy_comp);
+		wakeup(&cm_id_priv->destroy_comp);
 		mtx_unlock_spin(&cm_id_priv->lock);
 		return 1;
 	}
@@ -249,8 +249,6 @@
 	cm_id_priv->id.rem_ref = rem_ref;
 	mtx_init(&cm_id_priv->lock, "cm_id_priv", NULL, MTX_DUPOK|MTX_SPIN);
 	atomic_set(&cm_id_priv->refcount, 1);
-	cv_init(&cm_id_priv->connect_wait, "cm_id_priv connect_wait");
-	cv_init(&cm_id_priv->destroy_comp, "cm_id_priv destroy_comp");
 	TAILQ_INIT(&cm_id_priv->work_list);
 	TAILQ_INIT(&cm_id_priv->work_free_list);
 
@@ -305,7 +303,7 @@
 	/* Wait if we're currently in a connect or accept downcall */
 	mtx_lock_spin(&cm_id_priv->lock);
 	if (test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags))
-		cv_wait(&cm_id_priv->connect_wait, &cm_id_priv->lock);
+		msleep_spin(&cm_id_priv->connect_wait, &cm_id_priv->lock, "iwcm connect1", 0);
 
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_ESTABLISHED:
@@ -373,7 +371,7 @@
 	 */
 	mtx_lock_spin(&cm_id_priv->lock);
 	if (test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags))
-		cv_wait(&cm_id_priv->connect_wait, &cm_id_priv->lock);
+		msleep_spin(&cm_id_priv->connect_wait, &cm_id_priv->lock, "iwcm connect2", 0);
 
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_LISTEN:
@@ -435,7 +433,7 @@
 
 	mtx_lock_spin(&cm_id_priv->lock);
 	if (atomic_read(&cm_id_priv->refcount))
-		cv_wait(&cm_id_priv->destroy_comp, &cm_id_priv->lock);
+		msleep_spin(&cm_id_priv->destroy_comp, &cm_id_priv->lock, "iwcm destroy", 0);
 	mtx_unlock_spin(&cm_id_priv->lock);
 
 	free_cm_id(cm_id_priv);
@@ -496,7 +494,7 @@
 	mtx_lock_spin(&cm_id_priv->lock);
 	if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-		cv_broadcast(&cm_id_priv->connect_wait);
+		wakeup(&cm_id_priv->connect_wait);
 		mtx_unlock_spin(&cm_id_priv->lock);
 		return (EINVAL);
 	}
@@ -508,7 +506,7 @@
 
 	mtx_lock_spin(&cm_id_priv->lock);
 	clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-	cv_broadcast(&cm_id_priv->connect_wait);
+	wakeup(&cm_id_priv->connect_wait);
 	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
@@ -535,7 +533,7 @@
 	mtx_lock_spin(&cm_id_priv->lock);
 	if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-		cv_broadcast(&cm_id_priv->connect_wait);
+		wakeup(&cm_id_priv->connect_wait);
 		mtx_unlock_spin(&cm_id_priv->lock);
 		
 		return (EINVAL);
@@ -561,7 +559,7 @@
 			cm_id_priv->qp = NULL;
 		}
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-		cv_broadcast(&cm_id_priv->connect_wait);
+		wakeup(&cm_id_priv->connect_wait);
 		mtx_unlock_spin(&cm_id_priv->lock);
 	}
 
@@ -593,7 +591,7 @@
 
 	if (cm_id_priv->state != IW_CM_STATE_IDLE) {
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-		cv_broadcast(&cm_id_priv->connect_wait);
+		wakeup(&cm_id_priv->connect_wait);
 		mtx_unlock_spin(&cm_id_priv->lock);
 		
 		return (EINVAL);
@@ -620,7 +618,7 @@
 		BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
 		cm_id_priv->state = IW_CM_STATE_IDLE;
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-		cv_broadcast(&cm_id_priv->connect_wait);
+		wakeup(&cm_id_priv->connect_wait);
 		mtx_unlock_spin(&cm_id_priv->lock);
 		
 	}
@@ -732,7 +730,7 @@
 	BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
 	cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
 	ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
-	cv_broadcast(&cm_id_priv->connect_wait);
+	wakeup(&cm_id_priv->connect_wait);
 	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
@@ -775,7 +773,7 @@
 		free(iw_event->private_data, M_DEVBUF);
 
 	/* Wake up waiters on connect complete */
-	cv_broadcast(&cm_id_priv->connect_wait);
+	wakeup(&cm_id_priv->connect_wait);
 	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;


More information about the p4-projects mailing list