PERFORCE change 130191 for review

Steve Wise swise at FreeBSD.org
Tue Dec 4 12:53:14 PST 2007


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

Change 130191 by swise at swise:vic10:iwarp on 2007/12/04 20:53:00

	fixed spin lock usage bugs in rdma core.

Affected files ...

.. //depot/projects/iwarp/sys/contrib/rdma/rdma_addr.c#4 edit
.. //depot/projects/iwarp/sys/contrib/rdma/rdma_cma.c#8 edit
.. //depot/projects/iwarp/sys/contrib/rdma/rdma_device.c#5 edit
.. //depot/projects/iwarp/sys/contrib/rdma/rdma_iwcm.c#5 edit

Differences ...

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

@@ -94,7 +94,7 @@
 
 void rdma_addr_register_client(struct rdma_addr_client *client)
 {
-	mtx_init(&client->lock, "rdma_addr client lock", NULL, MTX_DEF);
+	mtx_init(&client->lock, "rdma_addr client lock", NULL, MTX_DUPOK|MTX_DEF);
 	cv_init(&client->comp, "rdma_addr cv");
 	client->refcount = 1;
 }

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

@@ -216,9 +216,9 @@
 {
 	int ret;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	ret = (id_priv->state == comp);
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 	return ret;
 }
 
@@ -227,10 +227,10 @@
 {
 	int ret;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	if ((ret = (id_priv->state == comp)))
 		id_priv->state = exch;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 	return ret;
 }
 
@@ -239,10 +239,10 @@
 {
 	enum cma_state old;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	old = id_priv->state;
 	id_priv->state = exch;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 	return old;
 }
 
@@ -279,9 +279,9 @@
 static void cma_attach_to_dev(struct rdma_id_private *id_priv,
 			      struct cma_device *cma_dev)
 {
-	mtx_lock(&cma_dev->lock);
+	mtx_lock_spin(&cma_dev->lock);
 	cma_dev->refcount++;
-	mtx_unlock(&cma_dev->lock);
+	mtx_unlock_spin(&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);
@@ -289,10 +289,10 @@
 
 static inline void cma_deref_dev(struct cma_device *cma_dev)
 {
-	mtx_lock(&cma_dev->lock);
+	mtx_lock_spin(&cma_dev->lock);
 	if (--cma_dev->refcount == 0)
 		cv_broadcast(&cma_dev->comp);
-	mtx_unlock(&cma_dev->lock);
+	mtx_unlock_spin(&cma_dev->lock);
 }
 
 static void cma_detach_from_dev(struct rdma_id_private *id_priv)
@@ -366,11 +366,11 @@
 
 static void cma_deref_id(struct rdma_id_private *id_priv)
 {
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	if (--id_priv->refcount == 0) {
 		cv_broadcast(&id_priv->comp);
 	}
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 }
 
 static int cma_disable_remove(struct rdma_id_private *id_priv,
@@ -378,22 +378,22 @@
 {
 	int ret;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	if (id_priv->state == state) {
 		id_priv->dev_remove++;
 		ret = 0;
 	} else
 		ret = EINVAL;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 	return ret;
 }
 
 static void cma_enable_remove(struct rdma_id_private *id_priv)
 {
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	if (--id_priv->dev_remove == 0)
 		cv_broadcast(&id_priv->wait_remove);
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 }
 
 static int cma_has_cm_dev(struct rdma_id_private *id_priv)
@@ -415,7 +415,7 @@
 	id_priv->id.context = context;
 	id_priv->id.event_handler = event_handler;
 	id_priv->id.ps = ps;
-	mtx_init(&id_priv->lock, "rdma_cm_id_priv", NULL, MTX_DUPOK|MTX_DEF);
+	mtx_init(&id_priv->lock, "rdma_cm_id_priv", NULL, MTX_DUPOK|MTX_SPIN);
 	cv_init(&id_priv->comp, "rdma_cm_id_priv");
 	id_priv->refcount = 1;
 	cv_init(&id_priv->wait_remove, "id priv wait remove");
@@ -785,10 +785,10 @@
 	LIST_REMOVE(id_priv, listen_entry);
 
 	cma_deref_id(id_priv);
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	if (id_priv->refcount)
 		cv_wait(&id_priv->comp, &id_priv->lock);
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 
 	free(id_priv, M_DEVBUF);
 }
@@ -892,11 +892,11 @@
 	mtx_unlock(&lock);
 	cma_release_port(id_priv);
 	cma_deref_id(id_priv);
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&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);
+	mtx_unlock_spin(&id_priv->lock);
 	free(id_priv->id.route.path_rec, M_DEVBUF);
 	free(id_priv, M_DEVBUF);
 }
@@ -1150,9 +1150,9 @@
 		goto out;
 	}
 
-	mtx_lock(&conn_id->lock);
+	mtx_lock_spin(&conn_id->lock);
 	conn_id->dev_remove++;
-	mtx_unlock(&conn_id->lock);
+	mtx_unlock_spin(&conn_id->lock);
 	mtx_lock(&lock);
 	ret = cma_acquire_dev(conn_id);
 	mtx_unlock(&lock);
@@ -1321,9 +1321,9 @@
 		goto out;
 	}
 	conn_id = container_of(new_cm_id, struct rdma_id_private, id);
-	mtx_lock(&conn_id->lock);
+	mtx_lock_spin(&conn_id->lock);
 	++conn_id->dev_remove;
-	mtx_unlock(&conn_id->lock);
+	mtx_unlock_spin(&conn_id->lock);
 	conn_id->state = CMA_CONNECT;
 
 	ifa = ifa_ifwithaddr((struct sockaddr *)&iw_event->local_addr);
@@ -1591,9 +1591,9 @@
 	struct rdma_id_private *id_priv = work->id;
 	int destroy = 0;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	++id_priv->dev_remove;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 	if (!cma_comp_exch(id_priv, work->old_state, work->new_state))
 		goto out;
 
@@ -1698,9 +1698,9 @@
 	if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_QUERY))
 		return (EINVAL);
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	id_priv->refcount++;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 #ifdef IB_SUPPORTED
 	switch (rdma_node_get_transport(id->device->node_type)) {
 	case RDMA_TRANSPORT_IB:
@@ -1775,9 +1775,9 @@
 	struct rdma_cm_event event;
 
 	memset(&event, 0, sizeof event);
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	++id_priv->dev_remove;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 
 	/*
 	 * Grab mutex to block rdma_destroy_id() from removing the device while
@@ -1881,9 +1881,9 @@
 	if (!cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_ADDR_QUERY))
 		return (EINVAL);
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	id_priv->refcount++;
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&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);
@@ -2740,9 +2740,9 @@
 	mc->context = context;
 	mc->id_priv = id_priv;
 
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	LIST_INSERT_HEAD(&id_priv->mc_list, mc, list);
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 
 	switch (rdma_node_get_transport(id->device->node_type)) {
 	case RDMA_TRANSPORT_IB:
@@ -2754,9 +2754,9 @@
 	}
 
 	if (ret) {
-		mtx_lock(&id_priv->lock);
+		mtx_lock_spin(&id_priv->lock);
 		list_del(&mc->list);
-		mtx_unlock(&id_priv->lock);
+		mtx_unlock_spin(&id_priv->lock);
 		free(mc, M_DEVBUF);
 	}
 	return ret;
@@ -2769,11 +2769,11 @@
 	struct cma_multicast *mc;
 
 	id_priv = container_of(id, struct rdma_id_private, id);
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	LIST_FOREACH(mc, &id_priv->mc_list, list) {
 		if (!memcmp(&mc->addr, addr, ip_addr_size(addr))) {
 			list_del(&mc->list);
-			mtx_unlock(&id_priv->lock);
+			mtx_unlock_spin(&id_priv->lock);
 
 			if (id->qp)
 				ib_detach_mcast(id->qp,
@@ -2784,7 +2784,7 @@
 			return;
 		}
 	}
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 }
 EXPORT_SYMBOL(rdma_leave_multicast);
 #endif
@@ -2794,13 +2794,14 @@
 	struct cma_device *cma_dev;
 	struct rdma_id_private *id_priv;
 
-	cma_dev = malloc(sizeof *cma_dev, M_DEVBUF, M_WAITOK);
+	cma_dev = malloc(sizeof *cma_dev, M_DEVBUF, M_WAITOK|M_ZERO);
 	if (!cma_dev)
 		return;
 
 	cma_dev->device = device;
 
 	cv_init(&cma_dev->comp, "cma_device");
+	mtx_init(&cma_dev->lock, "cma_device", NULL, MTX_DUPOK|MTX_SPIN);
 	cma_dev->refcount = 1;
 	LIST_INIT(&cma_dev->id_list);
 	ib_set_client_data(device, &cma_client, cma_dev);
@@ -2823,11 +2824,11 @@
 		return 0;
 
 	cma_cancel_operation(id_priv, state);
-	mtx_lock(&id_priv->lock);
+	mtx_lock_spin(&id_priv->lock);
 	BUG_ON(id_priv->dev_remove < 0);
 	if (id_priv->dev_remove)
 		cv_wait(&id_priv->wait_remove, &id_priv->lock);
-	mtx_unlock(&id_priv->lock);
+	mtx_unlock_spin(&id_priv->lock);
 
 	/* Check for destruction from another callback. */
 	if (!cma_comp(id_priv, CMA_DEVICE_REMOVAL))
@@ -2853,9 +2854,9 @@
 		}
 
 		LIST_REMOVE(id_priv, list);
-		mtx_lock(&id_priv->lock);
+		mtx_lock_spin(&id_priv->lock);
 		id_priv->refcount++;
-		mtx_unlock(&id_priv->lock);
+		mtx_unlock_spin(&id_priv->lock);
 		mtx_unlock(&lock);
 
 		ret = cma_remove_id_dev(id_priv);
@@ -2868,11 +2869,11 @@
 	mtx_unlock(&lock);
 
 	cma_deref_dev(cma_dev);
-	mtx_lock(&cma_dev->lock);
+	mtx_lock_spin(&cma_dev->lock);
 	BUG_ON(cma_dev->refcount < 0);
 	if (cma_dev->refcount)
 		cv_wait(&cma_dev->comp, &cma_dev->lock);
-	mtx_unlock(&cma_dev->lock);
+	mtx_unlock_spin(&cma_dev->lock);
 }
 
 static void cma_remove_one(struct ib_device *device)
@@ -2897,7 +2898,7 @@
 
 	LIST_INIT(&listen_any_list);
 	TAILQ_INIT(&dev_list);
-	mtx_init(&lock, "cma_device", NULL, MTX_DEF);
+	mtx_init(&lock, "cma_device list", NULL, MTX_DEF);
 
 	arc4rand(&next_port, sizeof next_port, 0);
 	next_port = ((unsigned int) next_port %

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

@@ -731,7 +731,7 @@
 		log(LOG_WARNING, "Couldn't create InfiniBand device class\n");
 #endif
 
-	mtx_init(&device_mutex, "rdma_device mutex", NULL, MTX_DUPOK|MTX_DEF);
+	mtx_init(&device_mutex, "rdma_device mutex", NULL, MTX_DEF);
 	TAILQ_INIT(&client_list);
 	TAILQ_INIT(&device_list);
 	ret = ib_cache_setup();

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

@@ -194,15 +194,15 @@
  */
 static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv)
 {
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	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);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		return 1;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return 0;
 }
@@ -211,9 +211,9 @@
 {
 	struct iwcm_id_private *cm_id_priv;
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	atomic_inc(&cm_id_priv->refcount);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 }
 
 static void rem_ref(struct iw_cm_id *cm_id)
@@ -303,7 +303,7 @@
 
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
 	/* Wait if we're currently in a connect or accept downcall */
-	mtx_lock(&cm_id_priv->lock);
+	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);
 
@@ -336,7 +336,7 @@
 	default:
 		BUG();
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	if (qp) {
 		if (abrupt)
@@ -371,24 +371,24 @@
 	 * Wait if we're currently in a connect or accept downcall. A
 	 * listening endpoint should never block here.
 	 */
-	mtx_lock(&cm_id_priv->lock);
+	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);
 
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_LISTEN:
 		cm_id_priv->state = IW_CM_STATE_DESTROYING;
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		/* destroy the listening endpoint */
 		ret = cm_id->device->iwcm->destroy_listen(cm_id);
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		break;
 	case IW_CM_STATE_ESTABLISHED:
 		cm_id_priv->state = IW_CM_STATE_DESTROYING;
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		/* Abrupt close of the connection */
 		(void)iwcm_modify_qp_err(cm_id_priv->qp);
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		break;
 	case IW_CM_STATE_IDLE:
 	case IW_CM_STATE_CLOSING:
@@ -413,7 +413,7 @@
 		cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
 		cm_id_priv->qp = NULL;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	(void)iwcm_deref_id(cm_id_priv);
 }
@@ -433,10 +433,10 @@
 
 	destroy_cm_id(cm_id);
 
-	mtx_lock(&cm_id_priv->lock);
+	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);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	free_cm_id(cm_id_priv);
 }
@@ -459,20 +459,20 @@
 	if (ret)
 		return ret;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_IDLE:
 		cm_id_priv->state = IW_CM_STATE_LISTEN;
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		ret = cm_id->device->iwcm->create_listen(cm_id, backlog);
 		if (ret)
 			cm_id_priv->state = IW_CM_STATE_IDLE;
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		break;
 	default:
 		ret = EINVAL;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
 }
@@ -493,23 +493,23 @@
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
 	set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
 
-	mtx_lock(&cm_id_priv->lock);
+	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);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		return (EINVAL);
 	}
 	cm_id_priv->state = IW_CM_STATE_IDLE;
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	ret = cm_id->device->iwcm->reject(cm_id, private_data,
 					  private_data_len);
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
 	cv_broadcast(&cm_id_priv->connect_wait);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
 }
@@ -532,37 +532,37 @@
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
 	set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
 
-	mtx_lock(&cm_id_priv->lock);
+	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);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		
 		return (EINVAL);
 	}
 	/* Get the ib_qp given the QPN */
 	qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn);
 	if (!qp) {
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		return (EINVAL);
 	}
 	cm_id->device->iwcm->add_ref(qp);
 	cm_id_priv->qp = qp;
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	ret = cm_id->device->iwcm->accept(cm_id, iw_param);
 	if (ret) {
 		/* An error on accept precludes provider events */
 		BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
 		cm_id_priv->state = IW_CM_STATE_IDLE;
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		if (cm_id_priv->qp) {
 			cm_id->device->iwcm->rem_ref(qp);
 			cm_id_priv->qp = NULL;
 		}
 		clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
 		cv_broadcast(&cm_id_priv->connect_wait);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 	}
 
 	return ret;
@@ -589,12 +589,12 @@
 		return ret;
 
 	set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 
 	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);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		
 		return (EINVAL);
 	}
@@ -602,17 +602,17 @@
 	/* Get the ib_qp given the QPN */
 	qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn);
 	if (!qp) {
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		return (EINVAL);
 	}
 	cm_id->device->iwcm->add_ref(qp);
 	cm_id_priv->qp = qp;
 	cm_id_priv->state = IW_CM_STATE_CONN_SENT;
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	ret = cm_id->device->iwcm->connect(cm_id, iw_param);
 	if (ret) {
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		if (cm_id_priv->qp) {
 			cm_id->device->iwcm->rem_ref(qp);
 			cm_id_priv->qp = NULL;
@@ -621,7 +621,7 @@
 		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);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		
 	}
 
@@ -661,12 +661,12 @@
 	 * We could be destroying the listening id. If so, ignore this
 	 * upcall.
 	 */
-	mtx_lock(&listen_id_priv->lock);
+	mtx_lock_spin(&listen_id_priv->lock);
 	if (listen_id_priv->state != IW_CM_STATE_LISTEN) {
-		mtx_unlock(&listen_id_priv->lock);
+		mtx_unlock_spin(&listen_id_priv->lock);
 		goto out;
 	}
-	mtx_unlock(&listen_id_priv->lock);
+	mtx_unlock_spin(&listen_id_priv->lock);
 
 	cm_id = iw_create_cm_id(listen_id_priv->id.device,
 				listen_id_priv->id.cm_handler,
@@ -721,7 +721,7 @@
 {
 	int ret;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 
 	/*
 	 * We clear the CONNECT_WAIT bit here to allow the callback
@@ -733,7 +733,7 @@
 	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);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
 }
@@ -750,7 +750,7 @@
 {
 	int ret;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	/*
 	 * Clear the connect wait bit so a callback function calling
 	 * iw_cm_disconnect will not wait and deadlock this thread
@@ -767,16 +767,16 @@
 		cm_id_priv->qp = NULL;
 		cm_id_priv->state = IW_CM_STATE_IDLE;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 	ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	if (iw_event->private_data_len)
 		free(iw_event->private_data, M_DEVBUF);
 
 	/* Wake up waiters on connect complete */
 	cv_broadcast(&cm_id_priv->connect_wait);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
 }
@@ -790,10 +790,10 @@
 				  struct iw_cm_event *iw_event)
 {
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	if (cm_id_priv->state == IW_CM_STATE_ESTABLISHED)
 		cm_id_priv->state = IW_CM_STATE_CLOSING;
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 }
 
 /*
@@ -811,7 +811,7 @@
 				  struct iw_cm_event *iw_event)
 {
 	int ret = 0;
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 
 	if (cm_id_priv->qp) {
 		cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
@@ -821,16 +821,16 @@
 	case IW_CM_STATE_ESTABLISHED:
 	case IW_CM_STATE_CLOSING:
 		cm_id_priv->state = IW_CM_STATE_IDLE;
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 		ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 		break;
 	case IW_CM_STATE_DESTROYING:
 		break;
 	default:
 		BUG();
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 
 	return ret;
 }
@@ -880,7 +880,7 @@
 	int empty;
 	int ret = 0;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	empty = TAILQ_EMPTY(&cm_id_priv->work_list);
 	while (!empty) {
 		work = TAILQ_FIRST(&cm_id_priv->work_list);
@@ -888,7 +888,7 @@
 		empty = TAILQ_EMPTY(&cm_id_priv->work_list);
 		levent = work->event;
 		put_work(work);
-		mtx_unlock(&cm_id_priv->lock);
+		mtx_unlock_spin(&cm_id_priv->lock);
 
 		ret = process_event(cm_id_priv, &levent);
 		if (ret) {
@@ -904,9 +904,9 @@
 			}
 			return;
 		}
-		mtx_lock(&cm_id_priv->lock);
+		mtx_lock_spin(&cm_id_priv->lock);
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 }
 
 /*
@@ -933,7 +933,7 @@
 
 	cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	work = get_work(cm_id_priv);
 	if (!work) {
 		ret = ENOMEM;
@@ -954,16 +954,16 @@
 		}
 	}
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	atomic_inc(&cm_id_priv->refcount);
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 	if (TAILQ_EMPTY(&cm_id_priv->work_list)) {
 		TAILQ_INSERT_TAIL(&cm_id_priv->work_list, work, list);
 		taskqueue_enqueue(iwcm_wq, &work->task);
 	} else
 		TAILQ_INSERT_TAIL(&cm_id_priv->work_list, work, list);
 out:
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 	return ret;
 }
 
@@ -973,7 +973,7 @@
 {
 	int ret;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_IDLE:
 	case IW_CM_STATE_CONN_SENT:
@@ -989,7 +989,7 @@
 		ret = EINVAL;
 		break;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 	return ret;
 }
 
@@ -999,7 +999,7 @@
 {
 	int ret;
 
-	mtx_lock(&cm_id_priv->lock);
+	mtx_lock_spin(&cm_id_priv->lock);
 	switch (cm_id_priv->state) {
 	case IW_CM_STATE_IDLE:
 	case IW_CM_STATE_CONN_SENT:
@@ -1012,7 +1012,7 @@
 		ret = EINVAL;
 		break;
 	}
-	mtx_unlock(&cm_id_priv->lock);
+	mtx_unlock_spin(&cm_id_priv->lock);
 	return ret;
 }
 


More information about the p4-projects mailing list