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