Author: imp Date: Wed Dec 6 00:29:43 2017 New Revision: 326605 URL: https://svnweb.freebsd.org/changeset/base/326605
Log: Add NVME as a known device type for devstat processing. Also, reduce the amount of cut and pasted code a little since only two args are different in the devstat_end_transaction calls. Sponsored by: Netflix Modified: head/sys/cam/cam_periph.c Modified: head/sys/cam/cam_periph.c ============================================================================== --- head/sys/cam/cam_periph.c Wed Dec 6 00:00:37 2017 (r326604) +++ head/sys/cam/cam_periph.c Wed Dec 6 00:29:43 2017 (r326605) @@ -1171,8 +1171,10 @@ cam_periph_runccb(union ccb *ccb, * If the user has supplied a stats structure, and if we understand * 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)) { + if (ds != NULL && + (ccb->ccb_h.func_code == XPT_SCSI_IO || + ccb->ccb_h.func_code == XPT_ATA_IO || + ccb->ccb_h.func_code == XPT_NVME_IO)) { starttime = <ime; binuptime(starttime); devstat_start_transaction(ds, starttime); @@ -1203,25 +1205,27 @@ cam_periph_runccb(union ccb *ccb, } if (ds != NULL) { + uint32_t bytes; + devstat_tag_type tag; + bool valid = true; + if (ccb->ccb_h.func_code == XPT_SCSI_IO) { - devstat_end_transaction(ds, - 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, starttime); + bytes = ccb->csio.dxfer_len - ccb->csio.resid; + tag = (devstat_tag_type)(ccb->csio.tag_action & 0x3); } else if (ccb->ccb_h.func_code == XPT_ATA_IO) { - devstat_end_transaction(ds, - ccb->ataio.dxfer_len - ccb->ataio.resid, - 0, /* Not used in ATA */ - ((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, starttime); + bytes = ccb->ataio.dxfer_len - ccb->ataio.resid; + tag = (devstat_tag_type)0; + } else if (ccb->ccb_h.func_code == XPT_NVME_IO) { + bytes = ccb->nvmeio.dxfer_len; /* NB: resid no possible */ + tag = (devstat_tag_type)0; + } else { + valid = false; } + if (valid) + devstat_end_transaction(ds, bytes, tag, + ((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, starttime); } return(error); _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"