nvme-core: add async event trace helper
This patch adds a new event for nvme async event notification. We print the async event in the decoded format when we recognize the event otherwise we just dump the result. Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
97faec5314
commit
09bd1ff4b1
@ -3408,16 +3408,21 @@ static void nvme_fw_act_work(struct work_struct *work)
|
|||||||
|
|
||||||
static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
|
static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
|
||||||
{
|
{
|
||||||
switch ((result & 0xff00) >> 8) {
|
u32 aer_notice_type = (result & 0xff00) >> 8;
|
||||||
|
|
||||||
|
switch (aer_notice_type) {
|
||||||
case NVME_AER_NOTICE_NS_CHANGED:
|
case NVME_AER_NOTICE_NS_CHANGED:
|
||||||
|
trace_nvme_async_event(ctrl, aer_notice_type);
|
||||||
set_bit(NVME_AER_NOTICE_NS_CHANGED, &ctrl->events);
|
set_bit(NVME_AER_NOTICE_NS_CHANGED, &ctrl->events);
|
||||||
nvme_queue_scan(ctrl);
|
nvme_queue_scan(ctrl);
|
||||||
break;
|
break;
|
||||||
case NVME_AER_NOTICE_FW_ACT_STARTING:
|
case NVME_AER_NOTICE_FW_ACT_STARTING:
|
||||||
|
trace_nvme_async_event(ctrl, aer_notice_type);
|
||||||
queue_work(nvme_wq, &ctrl->fw_act_work);
|
queue_work(nvme_wq, &ctrl->fw_act_work);
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_NVME_MULTIPATH
|
#ifdef CONFIG_NVME_MULTIPATH
|
||||||
case NVME_AER_NOTICE_ANA:
|
case NVME_AER_NOTICE_ANA:
|
||||||
|
trace_nvme_async_event(ctrl, aer_notice_type);
|
||||||
if (!ctrl->ana_log_buf)
|
if (!ctrl->ana_log_buf)
|
||||||
break;
|
break;
|
||||||
queue_work(nvme_wq, &ctrl->ana_work);
|
queue_work(nvme_wq, &ctrl->ana_work);
|
||||||
@ -3432,11 +3437,12 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
|
|||||||
volatile union nvme_result *res)
|
volatile union nvme_result *res)
|
||||||
{
|
{
|
||||||
u32 result = le32_to_cpu(res->u32);
|
u32 result = le32_to_cpu(res->u32);
|
||||||
|
u32 aer_type = result & 0x07;
|
||||||
|
|
||||||
if (le16_to_cpu(status) >> 1 != NVME_SC_SUCCESS)
|
if (le16_to_cpu(status) >> 1 != NVME_SC_SUCCESS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (result & 0x7) {
|
switch (aer_type) {
|
||||||
case NVME_AER_NOTICE:
|
case NVME_AER_NOTICE:
|
||||||
nvme_handle_aen_notice(ctrl, result);
|
nvme_handle_aen_notice(ctrl, result);
|
||||||
break;
|
break;
|
||||||
@ -3444,6 +3450,7 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
|
|||||||
case NVME_AER_SMART:
|
case NVME_AER_SMART:
|
||||||
case NVME_AER_CSS:
|
case NVME_AER_CSS:
|
||||||
case NVME_AER_VS:
|
case NVME_AER_VS:
|
||||||
|
trace_nvme_async_event(ctrl, aer_type);
|
||||||
ctrl->aen_result = result;
|
ctrl->aen_result = result;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -156,6 +156,34 @@ TRACE_EVENT(nvme_complete_rq,
|
|||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#define aer_name(aer) { aer, #aer }
|
||||||
|
|
||||||
|
TRACE_EVENT(nvme_async_event,
|
||||||
|
TP_PROTO(struct nvme_ctrl *ctrl, u32 result),
|
||||||
|
TP_ARGS(ctrl, result),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(int, ctrl_id)
|
||||||
|
__field(u32, result)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->ctrl_id = ctrl->instance;
|
||||||
|
__entry->result = result;
|
||||||
|
),
|
||||||
|
TP_printk("nvme%d: NVME_AEN=%#08x [%s]",
|
||||||
|
__entry->ctrl_id, __entry->result,
|
||||||
|
__print_symbolic(__entry->result,
|
||||||
|
aer_name(NVME_AER_NOTICE_NS_CHANGED),
|
||||||
|
aer_name(NVME_AER_NOTICE_ANA),
|
||||||
|
aer_name(NVME_AER_NOTICE_FW_ACT_STARTING),
|
||||||
|
aer_name(NVME_AER_ERROR),
|
||||||
|
aer_name(NVME_AER_SMART),
|
||||||
|
aer_name(NVME_AER_CSS),
|
||||||
|
aer_name(NVME_AER_VS))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
#undef aer_name
|
||||||
|
|
||||||
#endif /* _TRACE_NVME_H */
|
#endif /* _TRACE_NVME_H */
|
||||||
|
|
||||||
#undef TRACE_INCLUDE_PATH
|
#undef TRACE_INCLUDE_PATH
|
||||||
|
Loading…
Reference in New Issue
Block a user