Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Apr 2013 09:58:10 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r249251 - projects/camlock/sys/cam
Message-ID:  <201304080958.r389wALl020995@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Apr  8 09:58:10 2013
New Revision: 249251
URL: http://svnweb.freebsd.org/changeset/base/249251

Log:
  Make xpt_run_devq() called while holding queue lock and temporary drop it
  inside if needed.

Modified:
  projects/camlock/sys/cam/cam_xpt.c

Modified: projects/camlock/sys/cam/cam_xpt.c
==============================================================================
--- projects/camlock/sys/cam/cam_xpt.c	Mon Apr  8 08:38:55 2013	(r249250)
+++ projects/camlock/sys/cam/cam_xpt.c	Mon Apr  8 09:58:10 2013	(r249251)
@@ -2461,15 +2461,13 @@ xpt_action_default(union ccb *start_ccb)
 	case XPT_SMP_IO:
 	{
 		struct cam_devq *devq;
-		int run;
 
 		devq = path->bus->sim->devq;
 		mtx_lock(&devq->send_mtx);
-		cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb);
-		run = xpt_schedule_devq(devq, path->device);
-		mtx_unlock(&devq->send_mtx);
-		if (run)
+		if (cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb) == 0 &&
+		    xpt_schedule_devq(devq, path->device) != 0)
 			xpt_run_devq(devq);
+		mtx_unlock(&devq->send_mtx);
 		break;
 	}
 	case XPT_CALC_GEOMETRY:
@@ -3177,7 +3175,6 @@ xpt_run_devq(struct cam_devq *devq)
 
 	CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("xpt_run_devq\n"));
 
-	mtx_lock(&devq->send_mtx);
 	devq->send_queue.qfrozen_cnt++;
 	while ((devq->send_queue.entries > 0)
 	    && (devq->send_openings > 0)
@@ -3289,7 +3286,6 @@ xpt_run_devq(struct cam_devq *devq)
 		mtx_lock(&devq->send_mtx);
 	}
 	devq->send_queue.qfrozen_cnt--;
-	mtx_unlock(&devq->send_mtx);
 }
 
 /*
@@ -4123,15 +4119,13 @@ xpt_release_devq_timeout(void *arg)
 {
 	struct cam_ed *dev;
 	struct cam_devq *devq;
-	int run;
 
 	dev = (struct cam_ed *)arg;
 	devq = dev->sim->devq;
 	mtx_lock(&devq->send_mtx);
-	run = xpt_release_devq_device(dev, /*count*/1, /*run_queue*/TRUE);
-	mtx_unlock(&devq->send_mtx);
-	if (run)
+	if (xpt_release_devq_device(dev, /*count*/1, /*run_queue*/TRUE))
 		xpt_run_devq(dev->sim->devq);
+	mtx_unlock(&devq->send_mtx);
 }
 
 void
@@ -4143,10 +4137,9 @@ xpt_release_devq(struct cam_path *path, 
 	dev = path->device;
 	devq = dev->sim->devq;
 	mtx_lock(&devq->send_mtx);
-	run_queue = xpt_release_devq_device(dev, count, run_queue);
-	mtx_unlock(&devq->send_mtx);
-	if (run_queue)
+	if (xpt_release_devq_device(dev, count, run_queue))
 		xpt_run_devq(dev->sim->devq);
+	mtx_unlock(&devq->send_mtx);
 }
 
 static int
@@ -4191,7 +4184,6 @@ void
 xpt_release_simq(struct cam_sim *sim, int run_queue)
 {
 	struct cam_devq	*devq;
-	uint32_t	 freeze;
 
 	devq = sim->devq;
 	mtx_lock(&devq->send_mtx);
@@ -4202,9 +4194,7 @@ xpt_release_simq(struct cam_sim *sim, in
 #endif
 	} else
 		devq->send_queue.qfrozen_cnt--;
-	freeze = devq->send_queue.qfrozen_cnt;
-	mtx_unlock(&devq->send_mtx);
-	if (freeze == 0) {
+	if (devq->send_queue.qfrozen_cnt == 0) {
 		/*
 		 * If there is a timeout scheduled to release this
 		 * sim queue, remove it.  The queue frozen count is
@@ -4221,6 +4211,7 @@ xpt_release_simq(struct cam_sim *sim, in
 			xpt_run_devq(sim->devq);
 		}
 	}
+	mtx_unlock(&devq->send_mtx);
 }
 
 /*
@@ -5012,5 +5003,7 @@ camisr_runqueue(struct cam_sim *sim)
 	}
 	sim->sim_doneq_flags &= ~CAM_SIM_DQ_ONQ;
 	mtx_unlock(&sim->sim_doneq_mtx);
+	mtx_lock(&sim->devq->send_mtx);
 	xpt_run_devq(sim->devq);
+	mtx_unlock(&sim->devq->send_mtx);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304080958.r389wALl020995>