PERFORCE change 118499 for review

Scott Long scottl at FreeBSD.org
Fri Apr 20 22:21:15 UTC 2007


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

Change 118499 by scottl at scottl-x64 on 2007/04/20 22:20:44

	IFC

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#22 integrate
.. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#14 integrate
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#60 integrate
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#34 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/cxgb/cxgb_sge.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/cxgb/sys/uipc_mvec.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/sound/pci/envy24.c#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/sound/pci/envy24ht.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/fs/devfs/devfs_vnops.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/sched_ule.c#15 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_syscalls.c#19 integrate
.. //depot/projects/scottl-camlock/src/sys/netgraph/ng_ppp.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp.h#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_input.c#19 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_output.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_syncache.c#18 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_var.h#16 integrate
.. //depot/projects/scottl-camlock/src/sys/powerpc/powerpc/nexus.c#5 integrate

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#22 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_periph.c,v 1.66 2007/04/16 19:42:23 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_periph.c,v 1.68 2007/04/19 23:34:51 scottl Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,7 +131,6 @@
 	lun_id_t	lun_id;
 	cam_status	status;
 	u_int		init_level;
-	int s;
 
 	init_level = 0;
 	/*
@@ -200,7 +199,6 @@
 	if (status != CAM_REQ_CMP)
 		goto failure;
 
-	s = splsoftcam();
 	cur_periph = TAILQ_FIRST(&(*p_drv)->units);
 	while (cur_periph != NULL
 	    && cur_periph->unit_number < periph->unit_number)
@@ -213,8 +211,6 @@
 		(*p_drv)->generation++;
 	}
 
-	splx(s);
-
 	init_level++;
 
 	status = periph_ctor(periph, arg);
@@ -228,9 +224,7 @@
 		/* Initialized successfully */
 		break;
 	case 3:
-		s = splsoftcam();
 		TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links);
-		splx(s);
 		xpt_remove_periph(periph);
 		/* FALLTHROUGH */
 	case 2:
@@ -258,24 +252,25 @@
 {
 	struct periph_driver **p_drv;
 	struct cam_periph *periph;
-	int s;
 
+	xpt_lock_buses();
 	for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) {
 
 		if (name != NULL && (strcmp((*p_drv)->driver_name, name) != 0))
 			continue;
 
-		s = splsoftcam();
 		TAILQ_FOREACH(periph, &(*p_drv)->units, unit_links) {
 			if (xpt_path_comp(periph->path, path) == 0) {
-				splx(s);
+				xpt_unlock_buses();
 				return(periph);
 			}
 		}
-		splx(s);
-		if (name != NULL)
+		if (name != NULL) {
+			xpt_unlock_buses();
 			return(NULL);
+		}
 	}
+	xpt_unlock_buses();
 	return(NULL);
 }
 
@@ -372,11 +367,9 @@
 {
 	struct	cam_periph *periph;
 	char	*periph_name;
-	int	s;
 	int	i, val, dunit, r;
 	const char *dname, *strval;
 
-	s = splsoftcam();
 	periph_name = p_drv->driver_name;
 	for (;;newunit++) {
 
@@ -422,7 +415,6 @@
 		if (r != 0)
 			break;
 	}
-	splx(s);
 	return (newunit);
 }
 
@@ -480,8 +472,7 @@
 
 	/*
 	 * We only call this routine the first time a peripheral is
-	 * invalidated.  The oninvalidate() routine is always called at
-	 * splsoftcam().
+	 * invalidated.
 	 */
 	if (((periph->flags & CAM_PERIPH_INVALID) == 0)
 	 && (periph->periph_oninval != NULL))
@@ -550,26 +541,6 @@
 }
 
 /*
- * Wait interruptibly for an exclusive lock.
- */
-void
-cam_periph_lock(struct cam_periph *periph)
-{
-
-	mtx_lock(periph->sim->mtx);
-}
-
-/*
- * Unlock and wake up any waiters.
- */
-void
-cam_periph_unlock(struct cam_periph *periph)
-{
-
-	mtx_unlock(periph->sim->mtx);
-}
-
-/*
  * Map user virtual pointers into kernel virtual address space, so we can
  * access the memory.  This won't work on physical pointers, for now it's
  * up to the caller to check for that.  (XXX KDM -- should we do that here
@@ -808,9 +779,7 @@
 {
 	struct mtx *mtx;
 	struct cam_sim *sim;
-	int s;
 
-	s = splsoftcam();
 	sim = xpt_path_sim(ccb->ccb_h.path);
 	if (sim->mtx == &Giant)
 		mtx = NULL;
@@ -819,8 +788,6 @@
 	if ((ccb->ccb_h.pinfo.index != CAM_UNQUEUED_INDEX)
 	 || ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG))
 		msleep(&ccb->ccb_h.cbfcnp, mtx, PRIBIO, "cbwait", 0);
-
-	splx(s);
 }
 
 int
@@ -1225,11 +1192,8 @@
 {
 	struct timeval delta;
 	struct timeval duration_tv;
-	int s;
 
-	s = splclock();
 	microtime(&delta);
-	splx(s);
 	timevalsub(&delta, event_time);
 	duration_tv.tv_sec = duration_ms / 1000;
 	duration_tv.tv_usec = (duration_ms % 1000) * 1000;

==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#14 (text+ko) ====

@@ -25,13 +25,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/cam/cam_periph.h,v 1.17 2007/04/15 08:49:09 scottl Exp $
+ * $FreeBSD: src/sys/cam/cam_periph.h,v 1.18 2007/04/19 22:46:26 scottl Exp $
  */
 
 #ifndef _CAM_CAM_PERIPH_H
 #define _CAM_CAM_PERIPH_H 1
 
 #include <sys/queue.h>
+#include <cam/cam_sim.h>
 
 #ifdef _KERNEL
 
@@ -138,8 +139,6 @@
 			    char *name, cam_periph_type type, struct cam_path *,
 			    ac_callback_t *, ac_code, void *arg);
 struct cam_periph *cam_periph_find(struct cam_path *path, char *name);
-void		cam_periph_lock(struct cam_periph *periph);
-void		cam_periph_unlock(struct cam_periph *periph);
 cam_status	cam_periph_acquire(struct cam_periph *periph);
 void		cam_periph_release(struct cam_periph *periph);
 int		cam_periph_hold(struct cam_periph *periph, int priority);
@@ -177,5 +176,17 @@
 int		cam_periph_error(union ccb *ccb, cam_flags camflags,
 				 u_int32_t sense_flags, union ccb *save_ccb);
 
+static __inline void
+cam_periph_lock(struct cam_periph *periph)
+{
+	mtx_lock(periph->sim->mtx);
+}
+
+static __inline void
+cam_periph_unlock(struct cam_periph *periph)
+{
+	mtx_unlock(periph->sim->mtx);
+}
+
 #endif /* _KERNEL */
 #endif /* _CAM_CAM_PERIPH_H */

==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#60 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.180 2007/04/19 14:45:37 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.182 2007/04/19 23:34:51 scottl Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1210,7 +1210,7 @@
 	 * we never return a status of CAM_GDEVLIST_LIST_CHANGED.  It is
 	 * (or rather should be) impossible for the device peripheral driver
 	 * list to change since we look at the whole thing in one pass, and
-	 * we do it with splcam protection.
+	 * we do it with lock protection.
 	 * 
 	 */
 	case CAMGETPASSTHRU: {
@@ -1222,13 +1222,12 @@
 		u_int cur_generation;
 		int base_periph_found;
 		int splbreaknum;
-		int s;
 
 		ccb = (union ccb *)addr;
 		unit = ccb->cgdl.unit_number;
 		name = ccb->cgdl.periph_name;
 		/*
-		 * Every 100 devices, we want to drop our spl protection to
+		 * Every 100 devices, we want to drop our lock protection to
 		 * give the software interrupt handler a chance to run.
 		 * Most systems won't run into this check, but this should
 		 * avoid starvation in the software interrupt handler in
@@ -1250,7 +1249,7 @@
 		}
 
 		/* Keep the list from changing while we traverse it */
-		s = splcam();
+		mtx_lock(&xsoftc.xpt_topo_lock);
 ptstartover:
 		cur_generation = xsoftc.xpt_generation;
 
@@ -1260,7 +1259,7 @@
 				break;
 
 		if (*p_drv == NULL) {
-			splx(s);
+			mtx_unlock(&xsoftc.xpt_topo_lock);
 			ccb->ccb_h.status = CAM_REQ_CMP_ERR;
 			ccb->cgdl.status = CAM_GDEVLIST_ERROR;
 			*ccb->cgdl.periph_name = '\0';
@@ -1282,8 +1281,8 @@
 			if (periph->unit_number == unit) {
 				break;
 			} else if (--splbreaknum == 0) {
-				splx(s);
-				s = splcam();
+				mtx_unlock(&xsoftc.xpt_topo_lock);
+				mtx_lock(&xsoftc.xpt_topo_lock);
 				splbreaknum = 100;
 				if (cur_generation != xsoftc.xpt_generation)
 				       goto ptstartover;
@@ -1372,7 +1371,7 @@
 				       "your kernel config file\n");
 			}
 		}
-		splx(s);
+		mtx_unlock(&xsoftc.xpt_topo_lock);
 		break;
 		}
 	default:
@@ -1428,7 +1427,7 @@
 			TAILQ_REMOVE(&queue, &ccb->ccb_h, sim_links.tqe);
 
 			sim = ccb->ccb_h.path->bus->sim;
-			mtx_lock(sim->mtx);
+			CAM_SIM_LOCK(sim);
 
 			ccb->ccb_h.func_code = XPT_SCAN_BUS;
 			ccb->ccb_h.cbfcnp = xptdone;
@@ -1436,7 +1435,7 @@
 			cam_periph_runccb(ccb, NULL, 0, 0, NULL);
 			xpt_free_path(ccb->ccb_h.path);
 			xpt_free_ccb(ccb);
-			mtx_unlock(sim->mtx);
+			CAM_SIM_UNLOCK(sim);
 		}
 	}
 }
@@ -1592,25 +1591,22 @@
 	status = CAM_REQ_CMP;
 
 	if (device != NULL) {
-		int s;
-
 		/*
 		 * Make room for this peripheral
 		 * so it will fit in the queue
 		 * when it's scheduled to run
 		 */
-		s = splsoftcam();
 		status = camq_resize(&device->drvq,
 				     device->drvq.array_size + 1);
 
 		device->generation++;
 
 		SLIST_INSERT_HEAD(periph_head, periph, periph_links);
-
-		splx(s);
 	}
 
-	atomic_add_int(&xsoftc.xpt_generation, 1);
+	mtx_lock(&xsoftc.xpt_topo_lock);
+	xsoftc.xpt_generation++;
+	mtx_unlock(&xsoftc.xpt_topo_lock);
 
 	return (status);
 }
@@ -1625,24 +1621,21 @@
 	device = periph->path->device;
 
 	if (device != NULL) {
-		int s;
 		struct periph_list *periph_head;
 
 		periph_head = &device->periphs;
 		
 		/* Release the slot for this peripheral */
-		s = splsoftcam();
 		camq_resize(&device->drvq, device->drvq.array_size - 1);
 
 		device->generation++;
 
 		SLIST_REMOVE(periph_head, periph, cam_periph, periph_links);
-
-		splx(s);
 	}
 
-	atomic_add_int(&xsoftc.xpt_generation, 1);
-
+	mtx_lock(&xsoftc.xpt_topo_lock);
+	xsoftc.xpt_generation++;
+	mtx_unlock(&xsoftc.xpt_topo_lock);
 }
 
 
@@ -1655,7 +1648,6 @@
 	u_int	speed;
 	u_int	freq;
 	u_int	mb;
-	int	s;
 
 	mtx_assert(periph->sim->mtx, MA_OWNED);
 
@@ -1664,7 +1656,6 @@
 	 * To ensure that this is printed in one piece,
 	 * mask out CAM interrupts.
 	 */
-	s = splsoftcam();
 	printf("%s%d at %s%d bus %d target %d lun %d\n",
 	       periph->periph_name, periph->unit_number,
 	       path->bus->sim->sim_name,
@@ -1780,7 +1771,6 @@
 	if (announce_string != NULL)
 		printf("%s%d: %s\n", periph->periph_name,
 		       periph->unit_number, announce_string);
-	splx(s);
 }
 
 static dev_match_ret
@@ -2661,9 +2651,9 @@
 		next_bus = TAILQ_NEXT(bus, links);
 
 		mtx_unlock(&xsoftc.xpt_topo_lock);
-		mtx_lock(bus->sim->mtx);
+		CAM_SIM_LOCK(bus->sim);
 		retval = tr_func(bus, arg);
-		mtx_unlock(bus->sim->mtx);
+		CAM_SIM_UNLOCK(bus->sim);
 		if (retval == 0)
 			return(retval);
 		mtx_lock(&xsoftc.xpt_topo_lock);
@@ -2984,13 +2974,11 @@
 void
 xpt_action(union ccb *start_ccb)
 {
-	int iopl;
 
 	CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_action\n"));
 
 	start_ccb->ccb_h.status = CAM_REQ_INPROG;
 
-	iopl = splsoftcam();
 	switch (start_ccb->ccb_h.func_code) {
 	case XPT_SCSI_IO:
 	{
@@ -3044,18 +3032,15 @@
 	{
 		struct cam_path *path;
 		struct cam_sim *sim;
-		int s;
 		int runq;
 
 		path = start_ccb->ccb_h.path;
-		s = splsoftcam();
 
 		sim = path->bus->sim;
 		if (SIM_DEAD(sim)) {
 			/* The SIM has gone; just execute the CCB directly. */
 			cam_ccbq_send_ccb(&path->device->ccbq, start_ccb);
 			(*(sim->sim_action))(sim, start_ccb);
-			splx(s);
 			break;
 		}
 
@@ -3064,7 +3049,6 @@
 			runq = xpt_schedule_dev_sendq(path->bus, path->device);
 		else
 			runq = 0;
-		splx(s);
 		if (runq != 0)
 			xpt_run_dev_sendq(path->bus);
 		break;
@@ -3111,7 +3095,6 @@
 	case XPT_ABORT:
 	{
 		union ccb* abort_ccb;
-		int s;				
 
 		abort_ccb = start_ccb->cab.abort_ccb;
 		if (XPT_FC_IS_DEV_QUEUED(abort_ccb)) {
@@ -3124,9 +3107,7 @@
 				abort_ccb->ccb_h.status =
 				    CAM_REQ_ABORTED|CAM_DEV_QFRZN;
 				xpt_freeze_devq(abort_ccb->ccb_h.path, 1);
-				s = splcam();
 				xpt_done(abort_ccb);
-				splx(s);
 				start_ccb->ccb_h.status = CAM_REQ_CMP;
 				break;
 			}
@@ -3189,10 +3170,8 @@
 	case XPT_GDEV_TYPE:
 	{
 		struct cam_ed *dev;
-		int s;
 
 		dev = start_ccb->ccb_h.path->device;
-		s = splcam();
 		if ((dev->flags & CAM_DEV_UNCONFIGURED) != 0) {
 			start_ccb->ccb_h.status = CAM_DEV_NOT_THERE;
 		} else {
@@ -3211,16 +3190,13 @@
 				bcopy(dev->serial_num, cgd->serial_num,
 				      dev->serial_num_len);
 		}
-		splx(s);
 		break; 
 	}
 	case XPT_GDEV_STATS:
 	{
 		struct cam_ed *dev;
-		int s;
 
 		dev = start_ccb->ccb_h.path->device;
-		s = splcam();
 		if ((dev->flags & CAM_DEV_UNCONFIGURED) != 0) {
 			start_ccb->ccb_h.status = CAM_DEV_NOT_THERE;
 		} else {
@@ -3243,7 +3219,6 @@
 				cgds->last_reset = bus->last_reset;
 			cgds->ccb_h.status = CAM_REQ_CMP;
 		}
-		splx(s);
 		break;
 	}
 	case XPT_GDEVLIST:
@@ -3252,7 +3227,6 @@
 		struct periph_list	*periph_head;
 		struct ccb_getdevlist	*cgdl;
 		u_int			i;
-		int			s;
 		struct cam_ed		*device;
 		int			found;
 
@@ -3262,7 +3236,6 @@
 		/*
 		 * Don't want anyone mucking with our data.
 		 */
-		s = splcam();
 		device = start_ccb->ccb_h.path->device;
 		periph_head = &device->periphs;
 		cgdl = &start_ccb->cgdl;
@@ -3276,7 +3249,6 @@
 		if ((cgdl->index != 0) && 
 		    (cgdl->generation != device->generation)) {
 			cgdl->status = CAM_GDEVLIST_LIST_CHANGED;
-			splx(s);
 			break;
 		}
 
@@ -3297,7 +3269,6 @@
 		}
 		if (found == 0) {
 			cgdl->status = CAM_GDEVLIST_ERROR;
-			splx(s);
 			break;
 		}
 
@@ -3309,23 +3280,17 @@
 		cgdl->index++;
 		cgdl->generation = device->generation;
 
-		splx(s);
 		cgdl->ccb_h.status = CAM_REQ_CMP;
 		break;
 	}
 	case XPT_DEV_MATCH:
 	{
-		int s;
 		dev_pos_type position_type;
 		struct ccb_dev_match *cdm;
 
 		cdm = &start_ccb->cdm;
 
 		/*
-		 * Prevent EDT changes while we traverse it.
-		 */
-		s = splcam();
-		/*
 		 * There are two ways of getting at information in the EDT.
 		 * The first way is via the primary EDT tree.  It starts
 		 * with a list of busses, then a list of targets on a bus,
@@ -3372,8 +3337,6 @@
 			break;
 		}
 
-		splx(s);
-
 		if (cdm->status == CAM_DEV_MATCH_ERROR)
 			start_ccb->ccb_h.status = CAM_REQ_CMP_ERR;
 		else
@@ -3459,7 +3422,6 @@
 	{
 		struct ccb_relsim *crs;
 		struct cam_ed *dev;
-		int s;
 
 		crs = &start_ccb->crs;
 		dev = crs->ccb_h.path->device;
@@ -3469,8 +3431,6 @@
 			break;
 		}
 
-		s = splcam();
-
 		if ((crs->release_flags & RELSIM_ADJUST_OPENINGS) != 0) {
 
  			if (INQ_DATA_TQ_ENABLED(&dev->inq_data)) {
@@ -3540,8 +3500,7 @@
 				start_ccb->ccb_h.flags |= CAM_DEV_QFREEZE;
 			}
 		}
-		splx(s);
-		
+
 		if ((start_ccb->ccb_h.flags & CAM_DEV_QFREEZE) == 0) {
 
 			xpt_release_devq(crs->ccb_h.path, /*count*/1,
@@ -3561,9 +3520,6 @@
 		break;
 	case XPT_DEBUG: {
 #ifdef CAMDEBUG
-		int s;
-		
-		s = splcam();
 #ifdef CAM_DEBUG_DELAY
 		cam_debug_delay = CAM_DEBUG_DELAY;
 #endif
@@ -3590,7 +3546,6 @@
 			cam_dpath = NULL;
 			start_ccb->ccb_h.status = CAM_REQ_CMP;
 		}
-		splx(s);
 #else /* !CAMDEBUG */
 		start_ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
 #endif /* CAMDEBUG */
@@ -3609,13 +3564,11 @@
 		start_ccb->ccb_h.status = CAM_PROVIDE_FAIL;
 		break;
 	}
-	splx(iopl);
 }
 
 void
 xpt_polled_action(union ccb *start_ccb)
 {
-	int	  s;
 	u_int32_t timeout;
 	struct	  cam_sim *sim;	
 	struct	  cam_devq *devq;
@@ -3628,7 +3581,6 @@
 	dev = start_ccb->ccb_h.path->device;
 
 	mtx_assert(sim->mtx, MA_OWNED);
-	s = splcam();
 
 	/*
 	 * Steal an opening so that no other queued requests
@@ -3669,7 +3621,6 @@
 	} else {
 		start_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
 	}
-	splx(s);
 }
 	
 /*
@@ -3681,14 +3632,12 @@
 {
 	struct cam_ed *device;
 	union ccb *work_ccb;
-	int s;
 	int runq;
 
 	mtx_assert(perph->sim->mtx, MA_OWNED);
 
 	CAM_DEBUG(perph->path, CAM_DEBUG_TRACE, ("xpt_schedule\n"));
 	device = perph->path->device;
-	s = splsoftcam();
 	if (periph_is_queued(perph)) {
 		/* Simply reorder based on new priority */
 		CAM_DEBUG(perph->path, CAM_DEBUG_SUBTRACE,
@@ -3702,7 +3651,6 @@
 	} else if (SIM_DEAD(perph->path->bus->sim)) {
 		/* The SIM is gone so just call periph_start directly. */
 		work_ccb = xpt_get_ccb(perph->path->device);
-		splx(s);
 		if (work_ccb == NULL)
 			return; /* XXX */
 		xpt_setup_ccb(&work_ccb->ccb_h, perph->path, new_priority);
@@ -3718,7 +3666,6 @@
 		camq_insert(&device->drvq, &perph->pinfo);
 		runq = xpt_schedule_dev_allocq(perph->path->bus, device);
 	}
-	splx(s);
 	if (runq != 0) {
 		CAM_DEBUG(perph->path, CAM_DEBUG_SUBTRACE,
 			  ("   calling xpt_run_devq\n"));
@@ -3733,8 +3680,7 @@
  * return 1 meaning the device queue should be run. If we
  * were already queued, implying someone else has already
  * started the queue, return 0 so the caller doesn't attempt
- * to run the queue.  Must be run at either splsoftcam
- * (or splcam since that encompases splsoftcam).
+ * to run the queue.
  */
 static int
 xpt_schedule_dev(struct camq *queue, cam_pinfo *pinfo,
@@ -3778,7 +3724,6 @@
 xpt_run_dev_allocq(struct cam_eb *bus)
 {
 	struct	cam_devq *devq;
-	int	s;
 
 	CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("xpt_run_dev_allocq\n"));
 	devq = bus->sim->devq;
@@ -3791,7 +3736,6 @@
 			 devq->alloc_openings,
 			 devq->alloc_active));
 
-	s = splsoftcam();
 	devq->alloc_queue.qfrozen_cnt++;
 	while ((devq->alloc_queue.entries > 0)
 	    && (devq->alloc_openings > 0)
@@ -3821,7 +3765,6 @@
 			devq->alloc_openings--;
 			devq->alloc_active++;
 			drv = (struct cam_periph*)camq_remove(drvq, CAMQ_HEAD);
-			splx(s);
 			xpt_setup_ccb(&work_ccb->ccb_h, drv->path,
 				      drv->pinfo.priority);
 			CAM_DEBUG_PRINT(CAM_DEBUG_XPT,
@@ -3840,43 +3783,32 @@
 			break;
 		}
 	
-		/* Raise IPL for possible insertion and test at top of loop */
-		s = splsoftcam();
-
 		if (drvq->entries > 0) {
 			/* We have more work.  Attempt to reschedule */
 			xpt_schedule_dev_allocq(bus, device);
 		}
 	}
 	devq->alloc_queue.qfrozen_cnt--;
-	splx(s);
 }
 
 static void
 xpt_run_dev_sendq(struct cam_eb *bus)
 {
 	struct	cam_devq *devq;
-	int	s;
 
 	CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("xpt_run_dev_sendq\n"));
 	
 	devq = bus->sim->devq;
 
-	s = splcam();
 	devq->send_queue.qfrozen_cnt++;
-	splx(s);
-	s = splsoftcam();
 	while ((devq->send_queue.entries > 0)
 	    && (devq->send_openings > 0)) {
 		struct	cam_ed_qinfo *qinfo;
 		struct	cam_ed *device;
 		union ccb *work_ccb;
 		struct	cam_sim *sim;
-		int	ospl;
 
-		ospl = splcam();
 	    	if (devq->send_queue.qfrozen_cnt > 1) {
-			splx(ospl);
 			break;
 		}
 
@@ -3889,7 +3821,6 @@
 		 * to run it.
 		 */
 		if (device->qfrozen_cnt > 0) {
-			splx(ospl);
 			continue;
 		}
 
@@ -3899,7 +3830,6 @@
 		work_ccb = cam_ccbq_peek_ccb(&device->ccbq, CAMQ_HEAD);
 		if (work_ccb == NULL) {
 			printf("device on run queue with no ccbs???\n");
-			splx(ospl);
 			continue;
 		}
 
@@ -3918,7 +3848,6 @@
 						   &work_ccb->ccb_h, 
 						   xpt_links.stqe);
 
-				splx(ospl);
 				continue;
 			} else {
 				/*
@@ -3933,7 +3862,6 @@
 		cam_ccbq_remove_ccb(&device->ccbq, work_ccb);
 
 		cam_ccbq_send_ccb(&device->ccbq, work_ccb);
-		splx(ospl);
 
 		devq->send_openings--;
 		devq->send_active++;		
@@ -3946,12 +3874,8 @@
 			 * The client wants to freeze the queue
 			 * after this CCB is sent.
 			 */
-			ospl = splcam();
 			device->qfrozen_cnt++;
-			splx(ospl);
 		}
-		
-		splx(s);
 
 		/* In Target mode, the peripheral driver knows best... */
 		if (work_ccb->ccb_h.func_code == XPT_SCSI_IO) {
@@ -3975,16 +3899,9 @@
 		sim = work_ccb->ccb_h.path->bus->sim;
 		(*(sim->sim_action))(sim, work_ccb);
 
-		ospl = splcam();
 		devq->active_dev = NULL;
-		splx(ospl);
-		/* Raise IPL for possible insertion and test at top of loop */
-		s = splsoftcam();
 	}
-	splx(s);
-	s = splcam();
 	devq->send_queue.qfrozen_cnt--;
-	splx(s);
 }
 
 /*
@@ -4068,12 +3985,12 @@
 		bus = xpt_find_bus(path_id);
 		if (bus != NULL) {
 			need_unlock = 1;
-			mtx_lock(bus->sim->mtx);
+			CAM_SIM_LOCK(bus->sim);
 		}
 	}
 	status = xpt_compile_path(path, periph, path_id, target_id, lun_id);
 	if (need_unlock)
-		mtx_unlock(bus->sim->mtx);
+		CAM_SIM_UNLOCK(bus->sim);
 	if (status != CAM_REQ_CMP) {
 		free(path, M_CAMXPT);
 		path = NULL;
@@ -4090,7 +4007,6 @@
 	struct	     cam_et *target;
 	struct	     cam_ed *device;
 	cam_status   status;
-	int	     s;
 
 	status = CAM_REQ_CMP;	/* Completed without error */
 	target = NULL;		/* Wildcarded */
@@ -4100,7 +4016,6 @@
 	 * We will potentially modify the EDT, so block interrupts
 	 * that may attempt to create cam paths.
 	 */
-	s = splcam();
 	bus = xpt_find_bus(path_id);
 	if (bus == NULL) {
 		status = CAM_PATH_INVALID;
@@ -4134,7 +4049,6 @@
 			}
 		}
 	}
-	splx(s);
 
 	/*
 	 * Only touch the user's data if we are successful.
@@ -4359,7 +4273,6 @@
 void
 xpt_release_ccb(union ccb *free_ccb)
 {
-	int	 s;
 	struct	 cam_path *path;
 	struct	 cam_ed *device;
 	struct	 cam_eb *bus;
@@ -4370,7 +4283,6 @@
 	device = path->device;
 	bus = path->bus;
 	sim = bus->sim;
-	s = splsoftcam();
 
 	mtx_assert(sim->mtx, MA_OWNED);
 
@@ -4383,7 +4295,6 @@
 		    xpt_links.sle);
 	}
 	if (sim->devq == NULL) {
-		splx(s);
 		return;
 	}
 	sim->devq->alloc_openings++;
@@ -4393,7 +4304,6 @@
 	 && (device->drvq.entries > 0)) {
 		xpt_schedule_dev_allocq(bus, device);
 	}
-	splx(s);
 	if (dev_allocq_is_runnable(sim->devq))
 		xpt_run_dev_allocq(bus);
 }
@@ -4415,7 +4325,6 @@
 	struct cam_eb *new_bus;
 	struct cam_eb *old_bus;
 	struct ccb_pathinq cpi;
-	int s;
 
 	mtx_assert(sim->mtx, MA_OWNED);
 
@@ -4440,7 +4349,6 @@
 	new_bus->flags = 0;
 	new_bus->refcount = 1;	/* Held until a bus_deregister event */
 	new_bus->generation = 0;
-	s = splcam();
 	mtx_lock(&xsoftc.xpt_topo_lock);
 	old_bus = TAILQ_FIRST(&xsoftc.xpt_busses);
 	while (old_bus != NULL
@@ -4452,7 +4360,6 @@
 		TAILQ_INSERT_TAIL(&xsoftc.xpt_busses, new_bus, links);
 	xsoftc.bus_generation++;
 	mtx_unlock(&xsoftc.xpt_topo_lock);
-	splx(s);
 
 	/* Notify interested parties */
 	if (sim->path_id != CAM_XPT_PATH_ID) {
@@ -4614,7 +4521,6 @@
 	struct cam_eb *bus;
 	struct cam_et *target, *next_target;
 	struct cam_ed *device, *next_device;
-	int s;
 
 	mtx_assert(path->bus->sim->mtx, MA_OWNED);
 
@@ -4624,20 +4530,14 @@
 	 * Most async events come from a CAM interrupt context.  In
 	 * a few cases, the error recovery code at the peripheral layer,
 	 * which may run from our SWI or a process context, may signal
-	 * deferred events with a call to xpt_async. Ensure async
-	 * notifications are serialized by blocking cam interrupts.
+	 * deferred events with a call to xpt_async.
 	 */
-	s = splcam();
 
 	bus = path->bus;
 
 	if (async_code == AC_BUS_RESET) { 
-		int s;
-
-		s = splclock();
 		/* Update our notion of when the last reset occurred */
 		microtime(&bus->last_reset);
-		splx(s);
 	}
 
 	for (target = TAILQ_FIRST(&bus->et_entries);
@@ -4652,12 +4552,8 @@
 			continue;
 
 		if (async_code == AC_SENT_BDR) {
-			int s;
-
 			/* Update our notion of when the last reset occurred */
-			s = splclock();
 			microtime(&path->target->last_reset);
-			splx(s);
 		}
 
 		for (device = TAILQ_FIRST(&target->ed_entries);
@@ -4686,7 +4582,6 @@
 	if (bus != xpt_periph->path->bus)
 		xpt_async_bcast(&xpt_periph->path->device->asyncs, async_code,
 				path, async_arg);
-	splx(s);
 }
 
 static void
@@ -4780,12 +4675,10 @@
 u_int32_t
 xpt_freeze_devq(struct cam_path *path, u_int count)
 {
-	int s;
 	struct ccb_hdr *ccbh;
 
 	mtx_assert(path->bus->sim->mtx, MA_OWNED);
 
-	s = splcam();
 	path->device->qfrozen_cnt += count;
 
 	/*
@@ -4797,14 +4690,13 @@
 	 * freezes the queue.  To completly close the
 	 * hole, controller drives must check to see
 	 * if a ccb's status is still CAM_REQ_INPROG
-	 * under spl protection just before they queue
+	 * just before they queue
 	 * the CCB.  See ahc_action/ahc_freeze_devq for
 	 * an example.
 	 */
 	ccbh = TAILQ_LAST(&path->device->ccbq.active_ccbs, ccb_hdr_tailq);
 	if (ccbh && ccbh->status == CAM_REQ_INPROG)
 		ccbh->status = CAM_REQUEUE_REQ;

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list