nvme: add tracing of reservation commands
authorGuixin Liu <kanie@linux.alibaba.com>
Wed, 31 Jan 2024 09:12:20 +0000 (17:12 +0800)
committerKeith Busch <kbusch@kernel.org>
Thu, 14 Mar 2024 18:38:28 +0000 (11:38 -0700)
Add detailed parsing of reservation commands to make the trace log
more consistent and human-readable.

Signed-off-by: Guixin Liu <kanie@linux.alibaba.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/trace.c

index 5e94b3c..7e6719a 100644 (file)
@@ -223,6 +223,60 @@ static const char *nvme_trace_zone_mgmt_recv(struct trace_seq *p, u8 *cdw10)
        return ret;
 }
 
+static const char *nvme_trace_resv_reg(struct trace_seq *p, u8 *cdw10)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+       u8 rrega = cdw10[0] & 0x7;
+       u8 iekey = (cdw10[0] >> 3) & 0x1;
+       u8 ptpl = (cdw10[3] >> 6) & 0x3;
+
+       trace_seq_printf(p, "rrega=%u, iekey=%u, ptpl=%u",
+                        rrega, iekey, ptpl);
+       trace_seq_putc(p, 0);
+
+       return ret;
+}
+
+static const char *nvme_trace_resv_acq(struct trace_seq *p, u8 *cdw10)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+       u8 racqa = cdw10[0] & 0x7;
+       u8 iekey = (cdw10[0] >> 3) & 0x1;
+       u8 rtype = cdw10[1];
+
+       trace_seq_printf(p, "racqa=%u, iekey=%u, rtype=%u",
+                        racqa, iekey, rtype);
+       trace_seq_putc(p, 0);
+
+       return ret;
+}
+
+static const char *nvme_trace_resv_rel(struct trace_seq *p, u8 *cdw10)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+       u8 rrela = cdw10[0] & 0x7;
+       u8 iekey = (cdw10[0] >> 3) & 0x1;
+       u8 rtype = cdw10[1];
+
+       trace_seq_printf(p, "rrela=%u, iekey=%u, rtype=%u",
+                        rrela, iekey, rtype);
+       trace_seq_putc(p, 0);
+
+       return ret;
+}
+
+static const char *nvme_trace_resv_report(struct trace_seq *p, u8 *cdw10)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+       u32 numd = get_unaligned_le32(cdw10);
+       u8 eds = cdw10[4] & 0x1;
+
+       trace_seq_printf(p, "numd=%u, eds=%u", numd, eds);
+       trace_seq_putc(p, 0);
+
+       return ret;
+}
+
 static const char *nvme_trace_common(struct trace_seq *p, u8 *cdw10)
 {
        const char *ret = trace_seq_buffer_ptr(p);
@@ -275,6 +329,14 @@ const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p,
                return nvme_trace_zone_mgmt_send(p, cdw10);
        case nvme_cmd_zone_mgmt_recv:
                return nvme_trace_zone_mgmt_recv(p, cdw10);
+       case nvme_cmd_resv_register:
+               return nvme_trace_resv_reg(p, cdw10);
+       case nvme_cmd_resv_acquire:
+               return nvme_trace_resv_acq(p, cdw10);
+       case nvme_cmd_resv_release:
+               return nvme_trace_resv_rel(p, cdw10);
+       case nvme_cmd_resv_report:
+               return nvme_trace_resv_report(p, cdw10);
        default:
                return nvme_trace_common(p, cdw10);
        }