Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Mar 2007 07:50:36 GMT
From:      Scott Long <scottl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 116907 for review
Message-ID:  <200703300750.l2U7oaup014490@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=116907

Change 116907 by scottl@scottl-x64 on 2007/03/30 07:50:04

	Keep from breaking the userland ABI by not including a callout
	struct in the ccb_hdr.  MPSAFE SIMs are now required to provide
	storage for and initialize their own callouts.  Non-MPSAFE SIMs
	can continue to use the callout_handle that is already in the
	ccb_hdr.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#14 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#54 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx.c#7 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx.h#6 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx_osm.c#14 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx.c#7 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx.h#4 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx_osm.c#12 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic_osm_lib.c#6 edit
.. //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic_osm_lib.h#7 edit
.. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt.h#18 edit
.. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_cam.c#21 edit
.. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_raid.c#12 edit

Differences ...

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

@@ -275,13 +275,10 @@
 	u_int32_t	timeout;	/* Timeout value */
 
 	/*
-	 * CAM does not manage CCB timeouts itself, but provides convenient
-	 * storage for drivers to use for their own management of timeouts.
-	 * Drivers that are not yet MPSAFE should use the timeout_ch.
-	 * Drivers that are MPSAFE should use the callout.
+	 * Deprecated, only for use by non-MPSAFE SIMs.  All others must
+	 * allocate and initialize their own callout storage.
 	 */
 	struct		callout_handle timeout_ch;
-	struct		callout	callout;
 };
 
 /* Get Device Information CCB */

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

@@ -5032,10 +5032,8 @@
 	union ccb *new_ccb;
 
 	new_ccb = malloc(sizeof(*new_ccb), M_CAMXPT, M_WAITOK);
-	if (sim != NULL) {
+	if ((sim != NULL) && ((sim->flags & CAM_SIM_MPSAFE) == 0)) {
 		callout_handle_init(&new_ccb->ccb_h.timeout_ch);
-		callout_init(&new_ccb->ccb_h.callout,
-		    (sim->flags & CAM_SIM_MPSAFE) ? 1 : 0);
 	}
 	return (new_ccb);
 }
@@ -5046,9 +5044,9 @@
 	union ccb *new_ccb;
 
 	new_ccb = malloc(sizeof(*new_ccb), M_CAMXPT, M_NOWAIT);
-	callout_handle_init(&new_ccb->ccb_h.timeout_ch);
-	callout_init(&new_ccb->ccb_h.callout,
-	    (sim->flags & CAM_SIM_MPSAFE) ? 1 : 0);
+	if ((sim != NULL) && ((sim->flags & CAM_SIM_MPSAFE) == 0)) {
+		callout_handle_init(&new_ccb->ccb_h.timeout_ch);
+	}
 	return (new_ccb);
 }
 

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx.c#7 (text+ko) ====

@@ -6215,6 +6215,7 @@
 		next_scb->col_scb = ahd_find_scb_by_tag(ahd, col_tag);
 		if (next_scb->col_scb != NULL)
 			next_scb->col_scb->col_scb = next_scb;
+		aic_timer_init(&next_scb->io_timer);
 		ahd_free_scb(ahd, next_scb);
 		hscb++;
 		hscb_busaddr += sizeof(*hscb);

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx.h#6 (text+ko) ====

@@ -639,6 +639,7 @@
 	u_int			  sg_count;/* How full ahd_dma_seg is */
 #define	AHD_MAX_LQ_CRC_ERRORS 5
 	u_int			  crc_retry_count;
+	aic_timer_t		  io_timer;
 };
 
 TAILQ_HEAD(scb_tailq, scb);

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic79xx_osm.c#14 (text+ko) ====

@@ -222,7 +222,7 @@
 	if ((scb->flags & SCB_TIMEDOUT) != 0)
 		LIST_REMOVE(scb, timedout_links);
 
-	callout_stop(&ccb->ccb_h.callout);
+	callout_stop(&scb->io_timer);
 
 	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
 		bus_dmasync_op_t op;

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx.c#7 (text+ko) ====

@@ -4606,6 +4606,7 @@
 #endif
 		next_scb->hscb = &scb_data->hscbs[scb_data->numscbs];
 		next_scb->hscb->tag = ahc->scb_data->numscbs;
+		aic_timer_init(&next_scb->io_timer);
 		SLIST_INSERT_HEAD(&ahc->scb_data->free_scbs,
 				  next_scb, links.sle);
 		segs += AHC_NSEG;

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx.h#4 (text+ko) ====

@@ -597,6 +597,7 @@
 	struct ahc_dma_seg 	 *sg_list;
 	bus_addr_t		  sg_list_phys;
 	u_int			  sg_count;/* How full ahc_dma_seg is */
+	aic_timer_t		  io_timer;
 };
 
 struct scb_data {

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic7xxx_osm.c#12 (text+ko) ====

@@ -339,7 +339,7 @@
 		ahc_run_untagged_queue(ahc, untagged_q);
 	}
 
-	callout_stop(&ccb->ccb_h.callout);
+	callout_stop(&scb->io_timer);
 
 	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
 		bus_dmasync_op_t op;

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic_osm_lib.c#6 (text+ko) ====

@@ -57,7 +57,7 @@
 			union ccb *ccb;
 
 			ccb = list_scb->io_ctx;
-			callout_stop(&ccb->ccb_h.callout);
+			callout_stop(&scb->io_timer);
 		}
 	}
 }

==== //depot/projects/scottl-camlock/src/sys/dev/aic7xxx/aic_osm_lib.h#7 (text+ko) ====

@@ -223,8 +223,7 @@
 	time = msec;
 	time *= hz;
 	time /= 1000;
-	callout_reset(&scb->io_ctx->ccb_h.callout, time, aic_platform_timeout,
-	    scb);
+	callout_reset(&scb->io_timer, time, aic_platform_timeout, scb);
 }
 
 static __inline void

==== //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt.h#18 (text+ko) ====

@@ -280,7 +280,7 @@
 
 /****************************** Timer Facilities ******************************/
 #if __FreeBSD_version > 500000
-#define mpt_callout_init(c)	callout_init(c, /*mpsafe*/0);
+#define mpt_callout_init(c)	callout_init(c, /*mpsafe*/1);
 #else
 #define mpt_callout_init(c)	callout_init(c);
 #endif
@@ -337,6 +337,7 @@
 	bus_addr_t	sense_pbuf;	/* Physical Address of sense data */
 	bus_dmamap_t	dmap;		/* DMA map for data buffers */
 	struct req_entry *chain;	/* for SGE overallocations */
+	struct callout  callout;	/* Timeout for the request */
 };
 
 /**************************** MPI Target State Info ***************************/
@@ -814,12 +815,12 @@
 #define	CAMLOCK_2_MPTLOCK(mpt)
 #define mpt_sleep(mpt, ident, priority, wmesg, timo) \
 	msleep(ident, &(mpt)->mpt_lock, priority, wmesg, timo)
-#define mpt_ccb_timeout(ccb, ticks, func, arg) \
-	callout_reset(&(ccb)->ccb_h.callout, (ticks), (func), (arg));
-#define mpt_ccb_untimeout(ccb, func, arg) \
-	callout_stop(&(ccb)->ccb_h.callout)
-#define mpt_ccb_timeout_init(ccb) \
-	callout_init(&(ccb)->ccb_h.callout, 1)
+#define mpt_req_timeout(req, ticks, func, arg) \
+	callout_reset(&(req)->callout, (ticks), (func), (arg));
+#define mpt_req_untimeout(req, func, arg) \
+	callout_stop(&(req)->callout)
+#define mpt_req_timeout_init(req) \
+	callout_init(&(req)->callout, 1)
 
 #else
 

==== //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_cam.c#21 (text+ko) ====

@@ -1325,10 +1325,10 @@
 
 	ccb->ccb_h.status |= CAM_SIM_QUEUED;
 	if (ccb->ccb_h.timeout != CAM_TIME_INFINITY) {
-		mpt_ccb_timeout(ccb, (ccb->ccb_h.timeout * hz) / 1000,
+		mpt_req_timeout(req, (ccb->ccb_h.timeout * hz) / 1000,
 		    mpt_timeout, ccb);
 	} else {
-		mpt_ccb_timeout_init(ccb);
+		mpt_req_timeout_init(req);
 	}
 	if (mpt->verbose > MPT_PRT_DEBUG) {
 		int nc = 0;
@@ -1726,10 +1726,10 @@
 
 	ccb->ccb_h.status |= CAM_SIM_QUEUED;
 	if (ccb->ccb_h.timeout != CAM_TIME_INFINITY) {
-		mpt_ccb_timeout(ccb, (ccb->ccb_h.timeout * hz) / 1000,
+		mpt_req_timeout(req, (ccb->ccb_h.timeout * hz) / 1000,
 		    mpt_timeout, ccb);
 	} else {
-		mpt_ccb_timeout_init(ccb);
+		mpt_req_timeout_init(req);
 	}
 	if (mpt->verbose > MPT_PRT_DEBUG) {
 		int nc = 0;
@@ -2103,6 +2103,7 @@
 	{
 		union ccb *ccb;
 		uint32_t pathid;
+		struct cam_sim *sim;
 		/*
 		 * In general this means a device has been added to the loop.
 		 */
@@ -2111,16 +2112,17 @@
 			break;
 		}
 		if (mpt->phydisk_sim) {
-			pathid = cam_sim_path(mpt->phydisk_sim);;
+			sim = mpt->phydisk_sim;
 		} else {
-			pathid = cam_sim_path(mpt->sim);
+			sim = mpt->sim;
 		}
+		pathid = cam_sim_path(sim);
 		MPTLOCK_2_CAMLOCK(mpt);
 		/*
 		 * Allocate a CCB, create a wildcard path for this bus,
 		 * and schedule a rescan.
 		 */
-		ccb = xpt_alloc_ccb_nowait();
+		ccb = xpt_alloc_ccb_nowait(sim);
 		if (ccb == NULL) {
 			mpt_prt(mpt, "unable to alloc CCB for rescan\n");
 			CAMLOCK_2_MPTLOCK(mpt);
@@ -2297,7 +2299,7 @@
 	}
 
 	tgt = scsi_req->TargetID;
-	mpt_ccb_untimeout(ccb, mpt_timeout, ccb);
+	mpt_req_untimeout(req, mpt_timeout, ccb);
 	ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
 
 	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
@@ -4618,7 +4620,7 @@
 	    req->serno, tgt->resid);
 	if (ccb) {
 		ccb->ccb_h.status = CAM_SIM_QUEUED | CAM_REQ_INPROG;
-		mpt_ccb_timeout(ccb, 60 * hz, mpt_timeout, ccb);
+		mpt_req_timeout(req, 60 * hz, mpt_timeout, ccb);
 	}
 	mpt_send_cmd(mpt, req);
 }
@@ -5033,7 +5035,7 @@
 			}
 			tgt->ccb = NULL;
 			tgt->nxfers++;
-			mpt_ccb_untimeout(ccb, mpt_timeout, ccb);
+			mpt_req_untimeout(req, mpt_timeout, ccb);
 			mpt_lprt(mpt, MPT_PRT_DEBUG,
 			    "TARGET_ASSIST %p (req %p:%u) done tag 0x%x\n",
 			    ccb, tgt->req, tgt->req->serno, ccb->csio.tag_id);
@@ -5098,7 +5100,7 @@
 				    TGT_STATE_MOVING_DATA_AND_STATUS) {
 					tgt->nxfers++;
 				}
-				mpt_ccb_untimeout(ccb, mpt_timeout, ccb);
+				mpt_req_untimeout(req, mpt_timeout, ccb);
 				if (ccb->ccb_h.flags & CAM_SEND_SENSE) {
 					ccb->ccb_h.status |= CAM_SENT_SENSE;
 				}

==== //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_raid.c#12 (text+ko) ====

@@ -756,7 +756,7 @@
 		if (rv != 0)
 			return (CAM_REQ_CMP_ERR);
 
-		mpt_ccb_timeout(ccb, mpt_raid_quiesce_timeout, ccb, 5 * hz);
+		mpt_req_timeout(req, mpt_raid_quiesce_timeout, ccb, 5 * hz);
 #if 0
 		if (rv == ETIMEDOUT) {
 			mpt_disk_prt(mpt, mpt_disk, "mpt_raid_quiesce_disk: "



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