60 #if defined(OCS_DEBUG_QUEUE_HISTORY)
61 #define OCS_Q_HIST_SIZE (1000000UL)
64 extern void ocs_dump32(uint32_t, ocs_os_handle_t,
const char *,
void *, uint32_t);
72 #define OCS_LOG_ENABLE_SCSI_TGT_TRACE(ocs) ocs_debug_is_enabled(OCS_DEBUG_ENABLE_SCSI_TGT_TRACE)
74 #define OCS_LOG_ENABLE_Q_FULL_BUSY_MSG(ocs) (((ocs) != NULL) ? (((ocs)->logmask & (1U << 5)) != 0) : 0)
75 #define OCS_LOG_ENABLE_IO_ERRORS(ocs) (((ocs) != NULL) ? (((ocs)->logmask & (1U << 6)) != 0) : 0)
77 #if defined(OCS_DEBUG_QUEUE_HISTORY)
81 typedef union ocs_q_hist_ftr_u {
84 #define Q_HIST_TYPE_LEN 4
85 #define Q_HIST_MASK_LEN 28
86 uint32_t mask:Q_HIST_MASK_LEN,
96 OCS_Q_HIST_TYPE_WQE = 0,
97 OCS_Q_HIST_TYPE_CQE_RQ,
98 OCS_Q_HIST_TYPE_CQE_TCP_ACK,
99 OCS_Q_HIST_TYPE_CQE_INI_IO,
100 OCS_Q_HIST_TYPE_CQE_TGT_IO,
101 OCS_Q_HIST_TYPE_CQE_CMDINV,
102 OCS_Q_HIST_TYPE_CQE_ASYNC,
103 OCS_Q_HIST_TYPE_CQE_MQ,
104 OCS_Q_HIST_TYPE_CQE_CNXINV,
105 OCS_Q_HIST_TYPE_CQE_T_DDIGEST,
106 OCS_Q_HIST_TYPE_CQE_TX_DIF,
107 OCS_Q_HIST_TYPE_MISC,
110 static __inline
const char *
111 ocs_queue_history_type_name(ocs_q_hist_type_t type)
114 case OCS_Q_HIST_TYPE_WQE:
return "wqe";
break;
115 case OCS_Q_HIST_TYPE_CQE_RQ:
return "cqe rq";
break;
116 case OCS_Q_HIST_TYPE_CQE_TCP_ACK:
return "cqe TCP_ACK";
break;
117 case OCS_Q_HIST_TYPE_CQE_INI_IO:
return "cqe Ini IO";
break;
118 case OCS_Q_HIST_TYPE_CQE_TGT_IO:
return "cqe Tgt IO";
break;
119 case OCS_Q_HIST_TYPE_CQE_CMDINV:
return "cqe Cmd Inv";
break;
120 case OCS_Q_HIST_TYPE_CQE_ASYNC:
return "cqe Async";
break;
121 case OCS_Q_HIST_TYPE_CQE_MQ:
return "cqe MQ";
break;
122 case OCS_Q_HIST_TYPE_CQE_CNXINV:
return "cqe Cnx Inv";
break;
123 case OCS_Q_HIST_TYPE_CQE_T_DDIGEST:
return "cqe Tgt Data Digest";
break;
124 case OCS_Q_HIST_TYPE_CQE_TX_DIF:
return "cqe TX DIF";
break;
125 case OCS_Q_HIST_TYPE_MISC:
return "misc";
break;
126 default:
return "unknown";
break;
133 uint32_t q_hist_index;
134 ocs_lock_t q_hist_lock;
142 extern uint32_t ocs_queue_history_prev_index(uint32_t);
143 extern uint8_t ocs_queue_history_q_info_enabled(
void);
144 extern uint8_t ocs_queue_history_timestamp_enabled(
void);
146 #define ocs_queue_history_wq(...)
147 #define ocs_queue_history_cqe(...)
148 #define ocs_queue_history_misc(...)
149 #define ocs_queue_history_init(...)
150 #define ocs_queue_history_free(...)
154 #define OCS_DEBUG_ALWAYS (1U << 0)
155 #define OCS_DEBUG_ENABLE_MQ_DUMP (1U << 1)
156 #define OCS_DEBUG_ENABLE_CQ_DUMP (1U << 2)
157 #define OCS_DEBUG_ENABLE_WQ_DUMP (1U << 3)
158 #define OCS_DEBUG_ENABLE_IO_TRACE (1U << 4)
159 #define OCS_DEBUG_ENABLE_SM_TRACE (1U << 5)
160 #define OCS_DEBUG_ENABLE_SCSI_TGT_TRACE (1U << 6)
161 #define OCS_DEBUG_ENABLE_ISNS_LOG (1U << 7)
163 #define ocs_assert(cond, ...) \
166 const char *fn = strrchr(__FILE__, '/'); \
167 ocs_log_err(NULL, "%s(%d) assertion (%s) failed\n", (fn ? fn + 1 : __FILE__), __LINE__, #cond); \
169 ocs_save_ddump_all(OCS_DDUMP_FLAGS_WQES|OCS_DDUMP_FLAGS_CQES|OCS_DDUMP_FLAGS_MQES, -1, \
171 return __VA_ARGS__; \
177 #if defined(OCS_INCLUDE_DEBUG)
178 #define io_trace(io, fmt, ...) \
181 if (ocs_debug_is_enabled(OCS_DEBUG_ENABLE_IO_TRACE)) \
182 ocs_log_info(iscsi->os, "[%06x][%04x] %s: " fmt, \
183 (io->hio != NULL ? io->hio->icd : -1), \
184 io->init_task_tag, __func__, ##__VA_ARGS__); \
187 #define io_trace(io, fmt, ...)
#define ocs_queue_history_misc(...)
void ocs_debug_attach(void *)
#define ocs_queue_history_wq(...)
#define ocs_queue_history_init(...)
void ocs_debug_detach(void *)
#define ocs_queue_history_cqe(...)
void ocs_dump_service_params(const char *label, void *sparms)
void ocs_dump32(uint32_t mask, ocs_os_handle_t os, const char *label, void *buf, uint32_t buf_length)
Dump 32 bit hex/ascii data.
void ocs_swap_and_dump32(uint32_t mask, ocs_os_handle_t os, const char *label, void *buf, uint32_t buf_length)
#define ocs_queue_history_free(...)
void ocs_debug_enable(uint32_t mask)
enable debug options
int ocs_debug_is_enabled(uint32_t mask)
return true if debug bits are enabled
void ocs_debug_disable(uint32_t mask)
disable debug options