![Johannes Thumshirn](/assets/img/avatar_default.png)
Keith reported that command submission and command completion tracepoints have the order of the cmdid and qid fields swapped. While it isn't easily possible to change the command submission tracepoint, as there is a regression test parsing it in blktests we can swap the command completion tracepoint to have the fields aligned. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> Reported-by: Keith Busch <keith.busch@intel.com> Reviewed-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Keith Busch <keith.busch@intel.com>
166 lines
5.6 KiB
C
166 lines
5.6 KiB
C
/*
|
|
* NVM Express device driver tracepoints
|
|
* Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM nvme
|
|
|
|
#if !defined(_TRACE_NVME_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_NVME_H
|
|
|
|
#include <linux/nvme.h>
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/trace_seq.h>
|
|
|
|
#include "nvme.h"
|
|
|
|
#define nvme_admin_opcode_name(opcode) { opcode, #opcode }
|
|
#define show_admin_opcode_name(val) \
|
|
__print_symbolic(val, \
|
|
nvme_admin_opcode_name(nvme_admin_delete_sq), \
|
|
nvme_admin_opcode_name(nvme_admin_create_sq), \
|
|
nvme_admin_opcode_name(nvme_admin_get_log_page), \
|
|
nvme_admin_opcode_name(nvme_admin_delete_cq), \
|
|
nvme_admin_opcode_name(nvme_admin_create_cq), \
|
|
nvme_admin_opcode_name(nvme_admin_identify), \
|
|
nvme_admin_opcode_name(nvme_admin_abort_cmd), \
|
|
nvme_admin_opcode_name(nvme_admin_set_features), \
|
|
nvme_admin_opcode_name(nvme_admin_get_features), \
|
|
nvme_admin_opcode_name(nvme_admin_async_event), \
|
|
nvme_admin_opcode_name(nvme_admin_ns_mgmt), \
|
|
nvme_admin_opcode_name(nvme_admin_activate_fw), \
|
|
nvme_admin_opcode_name(nvme_admin_download_fw), \
|
|
nvme_admin_opcode_name(nvme_admin_ns_attach), \
|
|
nvme_admin_opcode_name(nvme_admin_keep_alive), \
|
|
nvme_admin_opcode_name(nvme_admin_directive_send), \
|
|
nvme_admin_opcode_name(nvme_admin_directive_recv), \
|
|
nvme_admin_opcode_name(nvme_admin_dbbuf), \
|
|
nvme_admin_opcode_name(nvme_admin_format_nvm), \
|
|
nvme_admin_opcode_name(nvme_admin_security_send), \
|
|
nvme_admin_opcode_name(nvme_admin_security_recv), \
|
|
nvme_admin_opcode_name(nvme_admin_sanitize_nvm))
|
|
|
|
const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
|
|
u8 *cdw10);
|
|
#define __parse_nvme_admin_cmd(opcode, cdw10) \
|
|
nvme_trace_parse_admin_cmd(p, opcode, cdw10)
|
|
|
|
#define nvme_opcode_name(opcode) { opcode, #opcode }
|
|
#define show_opcode_name(val) \
|
|
__print_symbolic(val, \
|
|
nvme_opcode_name(nvme_cmd_flush), \
|
|
nvme_opcode_name(nvme_cmd_write), \
|
|
nvme_opcode_name(nvme_cmd_read), \
|
|
nvme_opcode_name(nvme_cmd_write_uncor), \
|
|
nvme_opcode_name(nvme_cmd_compare), \
|
|
nvme_opcode_name(nvme_cmd_write_zeroes), \
|
|
nvme_opcode_name(nvme_cmd_dsm), \
|
|
nvme_opcode_name(nvme_cmd_resv_register), \
|
|
nvme_opcode_name(nvme_cmd_resv_report), \
|
|
nvme_opcode_name(nvme_cmd_resv_acquire), \
|
|
nvme_opcode_name(nvme_cmd_resv_release))
|
|
|
|
const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
|
|
u8 *cdw10);
|
|
#define __parse_nvme_cmd(opcode, cdw10) \
|
|
nvme_trace_parse_nvm_cmd(p, opcode, cdw10)
|
|
|
|
TRACE_EVENT(nvme_setup_admin_cmd,
|
|
TP_PROTO(struct nvme_command *cmd),
|
|
TP_ARGS(cmd),
|
|
TP_STRUCT__entry(
|
|
__field(u8, opcode)
|
|
__field(u8, flags)
|
|
__field(u16, cid)
|
|
__field(u64, metadata)
|
|
__array(u8, cdw10, 24)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->opcode = cmd->common.opcode;
|
|
__entry->flags = cmd->common.flags;
|
|
__entry->cid = cmd->common.command_id;
|
|
__entry->metadata = le64_to_cpu(cmd->common.metadata);
|
|
memcpy(__entry->cdw10, cmd->common.cdw10,
|
|
sizeof(__entry->cdw10));
|
|
),
|
|
TP_printk(" cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
|
|
__entry->cid, __entry->flags, __entry->metadata,
|
|
show_admin_opcode_name(__entry->opcode),
|
|
__parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10))
|
|
);
|
|
|
|
|
|
TRACE_EVENT(nvme_setup_nvm_cmd,
|
|
TP_PROTO(int qid, struct nvme_command *cmd),
|
|
TP_ARGS(qid, cmd),
|
|
TP_STRUCT__entry(
|
|
__field(int, qid)
|
|
__field(u8, opcode)
|
|
__field(u8, flags)
|
|
__field(u16, cid)
|
|
__field(u32, nsid)
|
|
__field(u64, metadata)
|
|
__array(u8, cdw10, 24)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->qid = qid;
|
|
__entry->opcode = cmd->common.opcode;
|
|
__entry->flags = cmd->common.flags;
|
|
__entry->cid = cmd->common.command_id;
|
|
__entry->nsid = le32_to_cpu(cmd->common.nsid);
|
|
__entry->metadata = le64_to_cpu(cmd->common.metadata);
|
|
memcpy(__entry->cdw10, cmd->common.cdw10,
|
|
sizeof(__entry->cdw10));
|
|
),
|
|
TP_printk("qid=%d, nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
|
|
__entry->qid, __entry->nsid, __entry->cid,
|
|
__entry->flags, __entry->metadata,
|
|
show_opcode_name(__entry->opcode),
|
|
__parse_nvme_cmd(__entry->opcode, __entry->cdw10))
|
|
);
|
|
|
|
TRACE_EVENT(nvme_complete_rq,
|
|
TP_PROTO(struct request *req),
|
|
TP_ARGS(req),
|
|
TP_STRUCT__entry(
|
|
__field(int, qid)
|
|
__field(int, cid)
|
|
__field(u64, result)
|
|
__field(u8, retries)
|
|
__field(u8, flags)
|
|
__field(u16, status)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->qid = req->q->id;
|
|
__entry->cid = req->tag;
|
|
__entry->result = le64_to_cpu(nvme_req(req)->result.u64);
|
|
__entry->retries = nvme_req(req)->retries;
|
|
__entry->flags = nvme_req(req)->flags;
|
|
__entry->status = nvme_req(req)->status;
|
|
),
|
|
TP_printk("qid=%d, cmdid=%u, res=%llu, retries=%u, flags=0x%x, status=%u",
|
|
__entry->qid, __entry->cid, __entry->result,
|
|
__entry->retries, __entry->flags, __entry->status)
|
|
|
|
);
|
|
|
|
#endif /* _TRACE_NVME_H */
|
|
|
|
#undef TRACE_INCLUDE_PATH
|
|
#define TRACE_INCLUDE_PATH .
|
|
#undef TRACE_INCLUDE_FILE
|
|
#define TRACE_INCLUDE_FILE trace
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|