0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM scsi
0004
0005 #if !defined(_TRACE_SCSI_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_SCSI_H
0007
0008 #include <scsi/scsi_cmnd.h>
0009 #include <scsi/scsi_host.h>
0010 #include <linux/tracepoint.h>
0011 #include <linux/trace_seq.h>
0012
0013 #define scsi_opcode_name(opcode) { opcode, #opcode }
0014 #define show_opcode_name(val) \
0015 __print_symbolic(val, \
0016 scsi_opcode_name(TEST_UNIT_READY), \
0017 scsi_opcode_name(REZERO_UNIT), \
0018 scsi_opcode_name(REQUEST_SENSE), \
0019 scsi_opcode_name(FORMAT_UNIT), \
0020 scsi_opcode_name(READ_BLOCK_LIMITS), \
0021 scsi_opcode_name(REASSIGN_BLOCKS), \
0022 scsi_opcode_name(INITIALIZE_ELEMENT_STATUS), \
0023 scsi_opcode_name(READ_6), \
0024 scsi_opcode_name(WRITE_6), \
0025 scsi_opcode_name(SEEK_6), \
0026 scsi_opcode_name(READ_REVERSE), \
0027 scsi_opcode_name(WRITE_FILEMARKS), \
0028 scsi_opcode_name(SPACE), \
0029 scsi_opcode_name(INQUIRY), \
0030 scsi_opcode_name(RECOVER_BUFFERED_DATA), \
0031 scsi_opcode_name(MODE_SELECT), \
0032 scsi_opcode_name(RESERVE), \
0033 scsi_opcode_name(RELEASE), \
0034 scsi_opcode_name(COPY), \
0035 scsi_opcode_name(ERASE), \
0036 scsi_opcode_name(MODE_SENSE), \
0037 scsi_opcode_name(START_STOP), \
0038 scsi_opcode_name(RECEIVE_DIAGNOSTIC), \
0039 scsi_opcode_name(SEND_DIAGNOSTIC), \
0040 scsi_opcode_name(ALLOW_MEDIUM_REMOVAL), \
0041 scsi_opcode_name(SET_WINDOW), \
0042 scsi_opcode_name(READ_CAPACITY), \
0043 scsi_opcode_name(READ_10), \
0044 scsi_opcode_name(WRITE_10), \
0045 scsi_opcode_name(SEEK_10), \
0046 scsi_opcode_name(POSITION_TO_ELEMENT), \
0047 scsi_opcode_name(WRITE_VERIFY), \
0048 scsi_opcode_name(VERIFY), \
0049 scsi_opcode_name(SEARCH_HIGH), \
0050 scsi_opcode_name(SEARCH_EQUAL), \
0051 scsi_opcode_name(SEARCH_LOW), \
0052 scsi_opcode_name(SET_LIMITS), \
0053 scsi_opcode_name(PRE_FETCH), \
0054 scsi_opcode_name(READ_POSITION), \
0055 scsi_opcode_name(SYNCHRONIZE_CACHE), \
0056 scsi_opcode_name(LOCK_UNLOCK_CACHE), \
0057 scsi_opcode_name(READ_DEFECT_DATA), \
0058 scsi_opcode_name(MEDIUM_SCAN), \
0059 scsi_opcode_name(COMPARE), \
0060 scsi_opcode_name(COPY_VERIFY), \
0061 scsi_opcode_name(WRITE_BUFFER), \
0062 scsi_opcode_name(READ_BUFFER), \
0063 scsi_opcode_name(UPDATE_BLOCK), \
0064 scsi_opcode_name(READ_LONG), \
0065 scsi_opcode_name(WRITE_LONG), \
0066 scsi_opcode_name(CHANGE_DEFINITION), \
0067 scsi_opcode_name(WRITE_SAME), \
0068 scsi_opcode_name(UNMAP), \
0069 scsi_opcode_name(READ_TOC), \
0070 scsi_opcode_name(LOG_SELECT), \
0071 scsi_opcode_name(LOG_SENSE), \
0072 scsi_opcode_name(XDWRITEREAD_10), \
0073 scsi_opcode_name(MODE_SELECT_10), \
0074 scsi_opcode_name(RESERVE_10), \
0075 scsi_opcode_name(RELEASE_10), \
0076 scsi_opcode_name(MODE_SENSE_10), \
0077 scsi_opcode_name(PERSISTENT_RESERVE_IN), \
0078 scsi_opcode_name(PERSISTENT_RESERVE_OUT), \
0079 scsi_opcode_name(VARIABLE_LENGTH_CMD), \
0080 scsi_opcode_name(REPORT_LUNS), \
0081 scsi_opcode_name(MAINTENANCE_IN), \
0082 scsi_opcode_name(MAINTENANCE_OUT), \
0083 scsi_opcode_name(MOVE_MEDIUM), \
0084 scsi_opcode_name(EXCHANGE_MEDIUM), \
0085 scsi_opcode_name(READ_12), \
0086 scsi_opcode_name(WRITE_12), \
0087 scsi_opcode_name(WRITE_VERIFY_12), \
0088 scsi_opcode_name(SEARCH_HIGH_12), \
0089 scsi_opcode_name(SEARCH_EQUAL_12), \
0090 scsi_opcode_name(SEARCH_LOW_12), \
0091 scsi_opcode_name(READ_ELEMENT_STATUS), \
0092 scsi_opcode_name(SEND_VOLUME_TAG), \
0093 scsi_opcode_name(WRITE_LONG_2), \
0094 scsi_opcode_name(READ_16), \
0095 scsi_opcode_name(WRITE_16), \
0096 scsi_opcode_name(VERIFY_16), \
0097 scsi_opcode_name(WRITE_SAME_16), \
0098 scsi_opcode_name(ZBC_OUT), \
0099 scsi_opcode_name(ZBC_IN), \
0100 scsi_opcode_name(SERVICE_ACTION_IN_16), \
0101 scsi_opcode_name(READ_32), \
0102 scsi_opcode_name(WRITE_32), \
0103 scsi_opcode_name(WRITE_SAME_32), \
0104 scsi_opcode_name(ATA_16), \
0105 scsi_opcode_name(ATA_12))
0106
0107 #define scsi_hostbyte_name(result) { result, #result }
0108 #define show_hostbyte_name(val) \
0109 __print_symbolic(val, \
0110 scsi_hostbyte_name(DID_OK), \
0111 scsi_hostbyte_name(DID_NO_CONNECT), \
0112 scsi_hostbyte_name(DID_BUS_BUSY), \
0113 scsi_hostbyte_name(DID_TIME_OUT), \
0114 scsi_hostbyte_name(DID_BAD_TARGET), \
0115 scsi_hostbyte_name(DID_ABORT), \
0116 scsi_hostbyte_name(DID_PARITY), \
0117 scsi_hostbyte_name(DID_ERROR), \
0118 scsi_hostbyte_name(DID_RESET), \
0119 scsi_hostbyte_name(DID_BAD_INTR), \
0120 scsi_hostbyte_name(DID_PASSTHROUGH), \
0121 scsi_hostbyte_name(DID_SOFT_ERROR), \
0122 scsi_hostbyte_name(DID_IMM_RETRY), \
0123 scsi_hostbyte_name(DID_REQUEUE), \
0124 scsi_hostbyte_name(DID_TRANSPORT_DISRUPTED), \
0125 scsi_hostbyte_name(DID_TRANSPORT_FAILFAST))
0126
0127 #define scsi_statusbyte_name(result) { result, #result }
0128 #define show_statusbyte_name(val) \
0129 __print_symbolic(val, \
0130 scsi_statusbyte_name(SAM_STAT_GOOD), \
0131 scsi_statusbyte_name(SAM_STAT_CHECK_CONDITION), \
0132 scsi_statusbyte_name(SAM_STAT_CONDITION_MET), \
0133 scsi_statusbyte_name(SAM_STAT_BUSY), \
0134 scsi_statusbyte_name(SAM_STAT_INTERMEDIATE), \
0135 scsi_statusbyte_name(SAM_STAT_INTERMEDIATE_CONDITION_MET), \
0136 scsi_statusbyte_name(SAM_STAT_RESERVATION_CONFLICT), \
0137 scsi_statusbyte_name(SAM_STAT_COMMAND_TERMINATED), \
0138 scsi_statusbyte_name(SAM_STAT_TASK_SET_FULL), \
0139 scsi_statusbyte_name(SAM_STAT_ACA_ACTIVE), \
0140 scsi_statusbyte_name(SAM_STAT_TASK_ABORTED))
0141
0142 #define scsi_prot_op_name(result) { result, #result }
0143 #define show_prot_op_name(val) \
0144 __print_symbolic(val, \
0145 scsi_prot_op_name(SCSI_PROT_NORMAL), \
0146 scsi_prot_op_name(SCSI_PROT_READ_INSERT), \
0147 scsi_prot_op_name(SCSI_PROT_WRITE_STRIP), \
0148 scsi_prot_op_name(SCSI_PROT_READ_STRIP), \
0149 scsi_prot_op_name(SCSI_PROT_WRITE_INSERT), \
0150 scsi_prot_op_name(SCSI_PROT_READ_PASS), \
0151 scsi_prot_op_name(SCSI_PROT_WRITE_PASS))
0152
0153 const char *scsi_trace_parse_cdb(struct trace_seq*, unsigned char*, int);
0154 #define __parse_cdb(cdb, len) scsi_trace_parse_cdb(p, cdb, len)
0155
0156 TRACE_EVENT(scsi_dispatch_cmd_start,
0157
0158 TP_PROTO(struct scsi_cmnd *cmd),
0159
0160 TP_ARGS(cmd),
0161
0162 TP_STRUCT__entry(
0163 __field( unsigned int, host_no )
0164 __field( unsigned int, channel )
0165 __field( unsigned int, id )
0166 __field( unsigned int, lun )
0167 __field( unsigned int, opcode )
0168 __field( unsigned int, cmd_len )
0169 __field( int, driver_tag)
0170 __field( int, scheduler_tag)
0171 __field( unsigned int, data_sglen )
0172 __field( unsigned int, prot_sglen )
0173 __field( unsigned char, prot_op )
0174 __dynamic_array(unsigned char, cmnd, cmd->cmd_len)
0175 ),
0176
0177 TP_fast_assign(
0178 __entry->host_no = cmd->device->host->host_no;
0179 __entry->channel = cmd->device->channel;
0180 __entry->id = cmd->device->id;
0181 __entry->lun = cmd->device->lun;
0182 __entry->opcode = cmd->cmnd[0];
0183 __entry->cmd_len = cmd->cmd_len;
0184 __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0185 __entry->scheduler_tag = scsi_cmd_to_rq(cmd)->internal_tag;
0186 __entry->data_sglen = scsi_sg_count(cmd);
0187 __entry->prot_sglen = scsi_prot_sg_count(cmd);
0188 __entry->prot_op = scsi_get_prot_op(cmd);
0189 memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0190 ),
0191
0192 TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \
0193 " prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s)",
0194 __entry->host_no, __entry->channel, __entry->id,
0195 __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0196 show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0197 __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0198 __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0199 __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len))
0200 );
0201
0202 TRACE_EVENT(scsi_dispatch_cmd_error,
0203
0204 TP_PROTO(struct scsi_cmnd *cmd, int rtn),
0205
0206 TP_ARGS(cmd, rtn),
0207
0208 TP_STRUCT__entry(
0209 __field( unsigned int, host_no )
0210 __field( unsigned int, channel )
0211 __field( unsigned int, id )
0212 __field( unsigned int, lun )
0213 __field( int, rtn )
0214 __field( unsigned int, opcode )
0215 __field( unsigned int, cmd_len )
0216 __field( int, driver_tag)
0217 __field( int, scheduler_tag)
0218 __field( unsigned int, data_sglen )
0219 __field( unsigned int, prot_sglen )
0220 __field( unsigned char, prot_op )
0221 __dynamic_array(unsigned char, cmnd, cmd->cmd_len)
0222 ),
0223
0224 TP_fast_assign(
0225 __entry->host_no = cmd->device->host->host_no;
0226 __entry->channel = cmd->device->channel;
0227 __entry->id = cmd->device->id;
0228 __entry->lun = cmd->device->lun;
0229 __entry->rtn = rtn;
0230 __entry->opcode = cmd->cmnd[0];
0231 __entry->cmd_len = cmd->cmd_len;
0232 __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0233 __entry->scheduler_tag = scsi_cmd_to_rq(cmd)->internal_tag;
0234 __entry->data_sglen = scsi_sg_count(cmd);
0235 __entry->prot_sglen = scsi_prot_sg_count(cmd);
0236 __entry->prot_op = scsi_get_prot_op(cmd);
0237 memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0238 ),
0239
0240 TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \
0241 " prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s)" \
0242 " rtn=%d",
0243 __entry->host_no, __entry->channel, __entry->id,
0244 __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0245 show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0246 __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0247 __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0248 __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len),
0249 __entry->rtn)
0250 );
0251
0252 DECLARE_EVENT_CLASS(scsi_cmd_done_timeout_template,
0253
0254 TP_PROTO(struct scsi_cmnd *cmd),
0255
0256 TP_ARGS(cmd),
0257
0258 TP_STRUCT__entry(
0259 __field( unsigned int, host_no )
0260 __field( unsigned int, channel )
0261 __field( unsigned int, id )
0262 __field( unsigned int, lun )
0263 __field( int, result )
0264 __field( unsigned int, opcode )
0265 __field( unsigned int, cmd_len )
0266 __field( int, driver_tag)
0267 __field( int, scheduler_tag)
0268 __field( unsigned int, data_sglen )
0269 __field( unsigned int, prot_sglen )
0270 __field( unsigned char, prot_op )
0271 __dynamic_array(unsigned char, cmnd, cmd->cmd_len)
0272 ),
0273
0274 TP_fast_assign(
0275 __entry->host_no = cmd->device->host->host_no;
0276 __entry->channel = cmd->device->channel;
0277 __entry->id = cmd->device->id;
0278 __entry->lun = cmd->device->lun;
0279 __entry->result = cmd->result;
0280 __entry->opcode = cmd->cmnd[0];
0281 __entry->cmd_len = cmd->cmd_len;
0282 __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0283 __entry->scheduler_tag = scsi_cmd_to_rq(cmd)->internal_tag;
0284 __entry->data_sglen = scsi_sg_count(cmd);
0285 __entry->prot_sglen = scsi_prot_sg_count(cmd);
0286 __entry->prot_op = scsi_get_prot_op(cmd);
0287 memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0288 ),
0289
0290 TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u " \
0291 "prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s) " \
0292 "result=(driver=%s host=%s message=%s status=%s)",
0293 __entry->host_no, __entry->channel, __entry->id,
0294 __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0295 show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0296 __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0297 __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0298 __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len),
0299 "DRIVER_OK",
0300 show_hostbyte_name(((__entry->result) >> 16) & 0xff),
0301 "COMMAND_COMPLETE",
0302 show_statusbyte_name(__entry->result & 0xff))
0303 );
0304
0305 DEFINE_EVENT(scsi_cmd_done_timeout_template, scsi_dispatch_cmd_done,
0306 TP_PROTO(struct scsi_cmnd *cmd),
0307 TP_ARGS(cmd));
0308
0309 DEFINE_EVENT(scsi_cmd_done_timeout_template, scsi_dispatch_cmd_timeout,
0310 TP_PROTO(struct scsi_cmnd *cmd),
0311 TP_ARGS(cmd));
0312
0313 TRACE_EVENT(scsi_eh_wakeup,
0314
0315 TP_PROTO(struct Scsi_Host *shost),
0316
0317 TP_ARGS(shost),
0318
0319 TP_STRUCT__entry(
0320 __field( unsigned int, host_no )
0321 ),
0322
0323 TP_fast_assign(
0324 __entry->host_no = shost->host_no;
0325 ),
0326
0327 TP_printk("host_no=%u", __entry->host_no)
0328 );
0329
0330 #endif
0331
0332
0333 #include <trace/define_trace.h>