Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Mar 2015 16:53:17 +0000 (UTC)
From:      "Kenneth D. Merry" <ken@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r280446 - stable/10/sys/cam
Message-ID:  <201503241653.t2OGrHvi071403@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ken
Date: Tue Mar 24 16:53:16 2015
New Revision: 280446
URL: https://svnweb.freebsd.org/changeset/base/280446

Log:
  MFC, r279375
  
    ------------------------------------------------------------------------
    r279375 | ken | 2015-02-27 14:35:36 -0700 (Fri, 27 Feb 2015) | 26 lines
  
    Fix I/O size calculation for pass(4) driver requests and add latency
    tracking.
  
    It is important to subtract the residual from the requested
    transfer size to see how much data was actually transferred.  With
    tape drives in particular, it is common to request more data than is
    returned.
  
    Also, add I/O latency tracking for CAM requests issued by
    cam_periph_runccb().
  
    If the caller supplies a struct devstat, and the I/O is a SCSI or
    ATA I/O, we will track the elapsed time to provide I/O latency
    statistics for the request.
  
    sys/cam/scsi/cam_periph.c:
    	In cam_periph_runccb(), subtract the residual when reporting I/O
    	totals to devstat(9) for SCSI and ATA passthrough requests.
  
    	In cam_periph_runccb(), grab the I/O start time and supply
    	the start time to devstat_end_transaction() so that it can
    	calculate the elapsed I/O time.
  
    Sponsored by:	Spectra Logic
    MFC after:	1 week
  
    ------------------------------------------------------------------------
  
  Sponsored by:	Spectra Logic

Modified:
  stable/10/sys/cam/cam_periph.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cam/cam_periph.c
==============================================================================
--- stable/10/sys/cam/cam_periph.c	Tue Mar 24 16:46:40 2015	(r280445)
+++ stable/10/sys/cam/cam_periph.c	Tue Mar 24 16:53:16 2015	(r280446)
@@ -1048,8 +1048,11 @@ cam_periph_runccb(union ccb *ccb,
 		  cam_flags camflags, u_int32_t sense_flags,
 		  struct devstat *ds)
 {
+	struct bintime *starttime;
+	struct bintime ltime;
 	int error;
  
+	starttime = NULL;
 	xpt_path_assert(ccb->ccb_h.path, MA_OWNED);
 
 	/*
@@ -1057,8 +1060,11 @@ cam_periph_runccb(union ccb *ccb,
 	 * this particular type of ccb, record the transaction start.
 	 */
 	if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO ||
-	    ccb->ccb_h.func_code == XPT_ATA_IO))
-		devstat_start_transaction(ds, NULL);
+	    ccb->ccb_h.func_code == XPT_ATA_IO)) {
+		starttime = &ltime;
+		binuptime(starttime);
+		devstat_start_transaction(ds, starttime);
+	}
 
 	ccb->ccb_h.cbfcnp = cam_periph_done;
 	xpt_action(ccb);
@@ -1086,22 +1092,22 @@ cam_periph_runccb(union ccb *ccb,
 	if (ds != NULL) {
 		if (ccb->ccb_h.func_code == XPT_SCSI_IO) {
 			devstat_end_transaction(ds,
-					ccb->csio.dxfer_len,
+					ccb->csio.dxfer_len - ccb->csio.resid,
 					ccb->csio.tag_action & 0x3,
 					((ccb->ccb_h.flags & CAM_DIR_MASK) ==
 					CAM_DIR_NONE) ?  DEVSTAT_NO_DATA : 
 					(ccb->ccb_h.flags & CAM_DIR_OUT) ?
 					DEVSTAT_WRITE : 
-					DEVSTAT_READ, NULL, NULL);
+					DEVSTAT_READ, NULL, starttime);
 		} else if (ccb->ccb_h.func_code == XPT_ATA_IO) {
 			devstat_end_transaction(ds,
-					ccb->ataio.dxfer_len,
+					ccb->ataio.dxfer_len - ccb->ataio.resid,
 					ccb->ataio.tag_action & 0x3,
 					((ccb->ccb_h.flags & CAM_DIR_MASK) ==
 					CAM_DIR_NONE) ?  DEVSTAT_NO_DATA : 
 					(ccb->ccb_h.flags & CAM_DIR_OUT) ?
 					DEVSTAT_WRITE : 
-					DEVSTAT_READ, NULL, NULL);
+					DEVSTAT_READ, NULL, starttime);
 		}
 	}
 



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