summaryrefslogtreecommitdiff
path: root/dtrace/iotrace2.d
diff options
context:
space:
mode:
Diffstat (limited to 'dtrace/iotrace2.d')
-rw-r--r--dtrace/iotrace2.d147
1 files changed, 147 insertions, 0 deletions
diff --git a/dtrace/iotrace2.d b/dtrace/iotrace2.d
new file mode 100644
index 0000000..b37b933
--- /dev/null
+++ b/dtrace/iotrace2.d
@@ -0,0 +1,147 @@
+#define time (timestamp/1000)
+
+#define XPT_FC_QUEUED 0x100
+#define XPT_FC_DEV_QUEUED 0x800
+#define XPT_SCSI_IO (0x01 | XPT_FC_DEV_QUEUED | XPT_FC_QUEUED)
+
+fbt::xpt_action:entry
+/args[0]->ccb_h.func_code == XPT_SCSI_IO /
+{
+ ccb = args[0];
+ requests[ccb] = time;
+}
+
+
+
+fbt::xpt_done:entry
+/args[0]->ccb_h.func_code == XPT_SCSI_IO /
+{
+ ccb = args[0];
+ delay = (requests[ccb] == 0) ? 0 : time - requests[ccb] ;
+ requests[ ccb ] = 0;
+
+ target = ccb->ccb_h.target_id; /* Controller Port 0..7 */
+ mpt = (struct mpt_softc*) ccb->ccb_h.sim_priv.entries[0].ptr;
+ unit = mpt->dev->unit; /* Controller ID */
+
+ printf("%u,%u,%u\n", unit, target, delay);
+}
+
+
+/*
+ * Code-Excerpts for reference
+
+union ccb {
+ struct ccb_hdr ccb_h;
+ struct ccb_scsiio csio;
+ struct ccb_getdev cgd;
+ struct ccb_getdevlist cgdl;
+ struct ccb_pathinq cpi;
+ struct ccb_relsim crs;
+ struct ccb_setasync csa;
+ struct ccb_setdev csd;
+ struct ccb_pathstats cpis;
+ struct ccb_getdevstats cgds;
+ struct ccb_dev_match cdm;
+ struct ccb_trans_settings cts;
+ struct ccb_calc_geometry ccg;
+ struct ccb_sim_knob knob;
+ struct ccb_abort cab;
+ struct ccb_resetbus crb;
+ struct ccb_resetdev crd;
+ struct ccb_termio tio;
+ struct ccb_accept_tio atio;
+ struct ccb_scsiio ctio;
+ struct ccb_en_lun cel;
+ struct ccb_immed_notify cin;
+ struct ccb_notify_ack cna;
+ struct ccb_immediate_notify cin1;
+ struct ccb_notify_acknowledge cna2;
+ struct ccb_eng_inq cei;
+ struct ccb_eng_exec cee;
+ struct ccb_rescan crcn;
+ struct ccb_debug cdbg;
+ struct ccb_ataio ataio;
+};
+
+struct ccb_hdr {
+ cam_pinfo pinfo; * Info for priority scheduling *
+ camq_entry xpt_links; * For chaining in the XPT layer *
+ camq_entry sim_links; * For chaining in the SIM layer *
+ camq_entry periph_links; * For chaining in the type driver *
+ u_int32_t retry_count;
+ void (*cbfcnp)(struct cam_periph *, union ccb *);
+ * Callback on completion function *
+ xpt_opcode func_code; * XPT function code *
+ u_int32_t status; * Status returned by CAM subsystem *
+ struct cam_path *path; * Compiled path for this ccb *
+ path_id_t path_id; * Path ID for the request *
+ target_id_t target_id; * Target device ID *
+ lun_id_t target_lun; * Target LUN number *
+ u_int32_t flags; * ccb_flags *
+ ccb_ppriv_area periph_priv;
+ ccb_spriv_area sim_priv;
+ u_int32_t timeout; * Timeout value *
+
+ *
+ * Deprecated, only for use by non-MPSAFE SIMs. All others must
+ * allocate and initialize their own callout storage.
+ *
+ struct callout_handle timeout_ch;
+};
+
+func_code:
+XPT_SCSI_IO = (0x01 | XPT_FC_DEV_QUEUED = 0x800 | XPT_FC_QUEUED, XPT_FC_QUEUED = 0x100) = 0x901
+
+ * SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO
+ * function codes.
+struct ccb_scsiio {
+ struct ccb_hdr ccb_h;
+ union ccb *next_ccb; * Ptr for next CCB for action *
+ u_int8_t *req_map; * Ptr to mapping info *
+ u_int8_t *data_ptr; * Ptr to the data buf/SG list *
+ u_int32_t dxfer_len; * Data transfer length *
+ * Autosense storage *
+ struct scsi_sense_data sense_data;
+ u_int8_t sense_len; * Number of bytes to autosense *
+ u_int8_t cdb_len; * Number of bytes for the CDB *
+ u_int16_t sglist_cnt; * Number of SG list entries *
+ u_int8_t scsi_status; * Returned SCSI status *
+ u_int8_t sense_resid; * Autosense resid length: 2's comp *
+ u_int32_t resid; * Transfer residual length: 2's comp *
+ cdb_t cdb_io; * Union for CDB bytes/pointer *
+ u_int8_t *msg_ptr; * Pointer to the message buffer *
+ u_int16_t msg_len; * Number of bytes for the Message *
+ u_int8_t tag_action; * What to do for tag queueing *
+ *
+ * The tag action should be either the define below (to send a
+ * non-tagged transaction) or one of the defined scsi tag messages
+ * from scsi_message.h.
+ *
+#define CAM_TAG_ACTION_NONE 0x00
+ u_int tag_id; * tag id from initator (target mode) *
+ u_int init_id; * initiator id of who selected *
+};
+
+
+request_t => req_entry
+struct req_entry {
+
+struct req_entry {
+ TAILQ_ENTRY(req_entry) links; * Pointer to next in list *
+ mpt_req_state_t state; * Request State Information *
+ uint16_t index; * Index of this entry *
+ uint16_t IOCStatus; * Completion status *
+ uint16_t ResponseCode; * TMF Reponse Code *
+ uint16_t serno; * serial number *
+ union ccb *ccb; * CAM request *
+ void *req_vbuf; * Virtual Address of Entry *
+ void *sense_vbuf; * Virtual Address of sense data *
+ bus_addr_t req_pbuf; * Physical Address of Entry *
+ 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 *
+};
+*/
+