162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * NVM Express target device driver tracepoints 462306a36Sopenharmony_ci * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This is entirely based on drivers/nvme/host/trace.h 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#undef TRACE_SYSTEM 1062306a36Sopenharmony_ci#define TRACE_SYSTEM nvmet 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#if !defined(_TRACE_NVMET_H) || defined(TRACE_HEADER_MULTI_READ) 1362306a36Sopenharmony_ci#define _TRACE_NVMET_H 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/nvme.h> 1662306a36Sopenharmony_ci#include <linux/tracepoint.h> 1762306a36Sopenharmony_ci#include <linux/trace_seq.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "nvmet.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciconst char *nvmet_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode, 2262306a36Sopenharmony_ci u8 *cdw10); 2362306a36Sopenharmony_ciconst char *nvmet_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode, 2462306a36Sopenharmony_ci u8 *cdw10); 2562306a36Sopenharmony_ciconst char *nvmet_trace_parse_fabrics_cmd(struct trace_seq *p, u8 fctype, 2662306a36Sopenharmony_ci u8 *spc); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define parse_nvme_cmd(qid, opcode, fctype, cdw10) \ 2962306a36Sopenharmony_ci ((opcode) == nvme_fabrics_command ? \ 3062306a36Sopenharmony_ci nvmet_trace_parse_fabrics_cmd(p, fctype, cdw10) : \ 3162306a36Sopenharmony_ci (qid ? \ 3262306a36Sopenharmony_ci nvmet_trace_parse_nvm_cmd(p, opcode, cdw10) : \ 3362306a36Sopenharmony_ci nvmet_trace_parse_admin_cmd(p, opcode, cdw10))) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciconst char *nvmet_trace_ctrl_name(struct trace_seq *p, struct nvmet_ctrl *ctrl); 3662306a36Sopenharmony_ci#define __print_ctrl_name(ctrl) \ 3762306a36Sopenharmony_ci nvmet_trace_ctrl_name(p, ctrl) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciconst char *nvmet_trace_disk_name(struct trace_seq *p, char *name); 4062306a36Sopenharmony_ci#define __print_disk_name(name) \ 4162306a36Sopenharmony_ci nvmet_trace_disk_name(p, name) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#ifndef TRACE_HEADER_MULTI_READ 4462306a36Sopenharmony_cistatic inline struct nvmet_ctrl *nvmet_req_to_ctrl(struct nvmet_req *req) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci return req->sq->ctrl; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic inline void __assign_req_name(char *name, struct nvmet_req *req) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci if (!req->ns) { 5262306a36Sopenharmony_ci memset(name, 0, DISK_NAME_LEN); 5362306a36Sopenharmony_ci return; 5462306a36Sopenharmony_ci } 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci strscpy_pad(name, req->ns->device_path, DISK_NAME_LEN); 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci#endif 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciTRACE_EVENT(nvmet_req_init, 6162306a36Sopenharmony_ci TP_PROTO(struct nvmet_req *req, struct nvme_command *cmd), 6262306a36Sopenharmony_ci TP_ARGS(req, cmd), 6362306a36Sopenharmony_ci TP_STRUCT__entry( 6462306a36Sopenharmony_ci __field(struct nvme_command *, cmd) 6562306a36Sopenharmony_ci __field(struct nvmet_ctrl *, ctrl) 6662306a36Sopenharmony_ci __array(char, disk, DISK_NAME_LEN) 6762306a36Sopenharmony_ci __field(int, qid) 6862306a36Sopenharmony_ci __field(u16, cid) 6962306a36Sopenharmony_ci __field(u8, opcode) 7062306a36Sopenharmony_ci __field(u8, fctype) 7162306a36Sopenharmony_ci __field(u8, flags) 7262306a36Sopenharmony_ci __field(u32, nsid) 7362306a36Sopenharmony_ci __field(u64, metadata) 7462306a36Sopenharmony_ci __array(u8, cdw10, 24) 7562306a36Sopenharmony_ci ), 7662306a36Sopenharmony_ci TP_fast_assign( 7762306a36Sopenharmony_ci __entry->cmd = cmd; 7862306a36Sopenharmony_ci __entry->ctrl = nvmet_req_to_ctrl(req); 7962306a36Sopenharmony_ci __assign_req_name(__entry->disk, req); 8062306a36Sopenharmony_ci __entry->qid = req->sq->qid; 8162306a36Sopenharmony_ci __entry->cid = cmd->common.command_id; 8262306a36Sopenharmony_ci __entry->opcode = cmd->common.opcode; 8362306a36Sopenharmony_ci __entry->fctype = cmd->fabrics.fctype; 8462306a36Sopenharmony_ci __entry->flags = cmd->common.flags; 8562306a36Sopenharmony_ci __entry->nsid = le32_to_cpu(cmd->common.nsid); 8662306a36Sopenharmony_ci __entry->metadata = le64_to_cpu(cmd->common.metadata); 8762306a36Sopenharmony_ci memcpy(__entry->cdw10, &cmd->common.cdws, 8862306a36Sopenharmony_ci sizeof(__entry->cdw10)); 8962306a36Sopenharmony_ci ), 9062306a36Sopenharmony_ci TP_printk("nvmet%s: %sqid=%d, cmdid=%u, nsid=%u, flags=%#x, " 9162306a36Sopenharmony_ci "meta=%#llx, cmd=(%s, %s)", 9262306a36Sopenharmony_ci __print_ctrl_name(__entry->ctrl), 9362306a36Sopenharmony_ci __print_disk_name(__entry->disk), 9462306a36Sopenharmony_ci __entry->qid, __entry->cid, __entry->nsid, 9562306a36Sopenharmony_ci __entry->flags, __entry->metadata, 9662306a36Sopenharmony_ci show_opcode_name(__entry->qid, __entry->opcode, 9762306a36Sopenharmony_ci __entry->fctype), 9862306a36Sopenharmony_ci parse_nvme_cmd(__entry->qid, __entry->opcode, 9962306a36Sopenharmony_ci __entry->fctype, __entry->cdw10)) 10062306a36Sopenharmony_ci); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciTRACE_EVENT(nvmet_req_complete, 10362306a36Sopenharmony_ci TP_PROTO(struct nvmet_req *req), 10462306a36Sopenharmony_ci TP_ARGS(req), 10562306a36Sopenharmony_ci TP_STRUCT__entry( 10662306a36Sopenharmony_ci __field(struct nvmet_ctrl *, ctrl) 10762306a36Sopenharmony_ci __array(char, disk, DISK_NAME_LEN) 10862306a36Sopenharmony_ci __field(int, qid) 10962306a36Sopenharmony_ci __field(int, cid) 11062306a36Sopenharmony_ci __field(u64, result) 11162306a36Sopenharmony_ci __field(u16, status) 11262306a36Sopenharmony_ci ), 11362306a36Sopenharmony_ci TP_fast_assign( 11462306a36Sopenharmony_ci __entry->ctrl = nvmet_req_to_ctrl(req); 11562306a36Sopenharmony_ci __entry->qid = req->cq->qid; 11662306a36Sopenharmony_ci __entry->cid = req->cqe->command_id; 11762306a36Sopenharmony_ci __entry->result = le64_to_cpu(req->cqe->result.u64); 11862306a36Sopenharmony_ci __entry->status = le16_to_cpu(req->cqe->status) >> 1; 11962306a36Sopenharmony_ci __assign_req_name(__entry->disk, req); 12062306a36Sopenharmony_ci ), 12162306a36Sopenharmony_ci TP_printk("nvmet%s: %sqid=%d, cmdid=%u, res=%#llx, status=%#x", 12262306a36Sopenharmony_ci __print_ctrl_name(__entry->ctrl), 12362306a36Sopenharmony_ci __print_disk_name(__entry->disk), 12462306a36Sopenharmony_ci __entry->qid, __entry->cid, __entry->result, __entry->status) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define aer_name(aer) { aer, #aer } 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ciTRACE_EVENT(nvmet_async_event, 13162306a36Sopenharmony_ci TP_PROTO(struct nvmet_ctrl *ctrl, __le32 result), 13262306a36Sopenharmony_ci TP_ARGS(ctrl, result), 13362306a36Sopenharmony_ci TP_STRUCT__entry( 13462306a36Sopenharmony_ci __field(int, ctrl_id) 13562306a36Sopenharmony_ci __field(u32, result) 13662306a36Sopenharmony_ci ), 13762306a36Sopenharmony_ci TP_fast_assign( 13862306a36Sopenharmony_ci __entry->ctrl_id = ctrl->cntlid; 13962306a36Sopenharmony_ci __entry->result = (le32_to_cpu(result) & 0xff00) >> 8; 14062306a36Sopenharmony_ci ), 14162306a36Sopenharmony_ci TP_printk("nvmet%d: NVME_AEN=%#08x [%s]", 14262306a36Sopenharmony_ci __entry->ctrl_id, __entry->result, 14362306a36Sopenharmony_ci __print_symbolic(__entry->result, 14462306a36Sopenharmony_ci aer_name(NVME_AER_NOTICE_NS_CHANGED), 14562306a36Sopenharmony_ci aer_name(NVME_AER_NOTICE_ANA), 14662306a36Sopenharmony_ci aer_name(NVME_AER_NOTICE_FW_ACT_STARTING), 14762306a36Sopenharmony_ci aer_name(NVME_AER_NOTICE_DISC_CHANGED), 14862306a36Sopenharmony_ci aer_name(NVME_AER_ERROR), 14962306a36Sopenharmony_ci aer_name(NVME_AER_SMART), 15062306a36Sopenharmony_ci aer_name(NVME_AER_CSS), 15162306a36Sopenharmony_ci aer_name(NVME_AER_VS)) 15262306a36Sopenharmony_ci ) 15362306a36Sopenharmony_ci); 15462306a36Sopenharmony_ci#undef aer_name 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci#endif /* _TRACE_NVMET_H */ 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH 15962306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH . 16062306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE 16162306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci/* This part must be outside protection */ 16462306a36Sopenharmony_ci#include <trace/define_trace.h> 165