Date: Thu, 3 Jan 2008 17:24:56 GMT From: Steve Wise <swise@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 132410 for review Message-ID: <200801031724.m03HOukw025075@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=132410 Change 132410 by swise@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;help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801031724.m03HOukw025075>
