From owner-p4-projects@FreeBSD.ORG Thu Jan 3 17:24:57 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1D39716A419; Thu, 3 Jan 2008 17:24:57 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BE83216A417 for ; Thu, 3 Jan 2008 17:24:56 +0000 (UTC) (envelope-from swise@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id AE7C913C447 for ; Thu, 3 Jan 2008 17:24:56 +0000 (UTC) (envelope-from swise@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m03HOuWC025080 for ; Thu, 3 Jan 2008 17:24:56 GMT (envelope-from swise@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m03HOukw025075 for perforce@freebsd.org; Thu, 3 Jan 2008 17:24:56 GMT (envelope-from swise@FreeBSD.org) Date: Thu, 3 Jan 2008 17:24:56 GMT Message-Id: <200801031724.m03HOukw025075@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to swise@FreeBSD.org using -f From: Steve Wise To: Perforce Change Reviews Cc: Subject: PERFORCE change 132410 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Jan 2008 17:24:57 -0000 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 #include -#include #include +#include #include #include #include @@ -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;