From a65b1d29fe5308688b65c5522e2257e4baa76b80 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Tue, 12 Sep 2023 23:42:32 +0900 Subject: [PATCH] ioctl: Add debugging feature to show command outputs Signed-off-by: Tokunori Ikegami --- src/libnvme.map | 2 ++ src/nvme/ioctl.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++- src/nvme/ioctl.h | 12 +++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/libnvme.map b/src/libnvme.map index faabd721..1765bc65 100644 --- a/src/libnvme.map +++ b/src/libnvme.map @@ -8,6 +8,8 @@ LIBNVME_1_6 { nvme_root_release_fds; nvme_subsystem_get_iopolicy; nvme_subsystem_release_fds; + nvme_set_debug; + nvme_get_debug; }; LIBNVME_1_5 { diff --git a/src/nvme/ioctl.c b/src/nvme/ioctl.c index b9710b3d..ec0ac6b6 100644 --- a/src/nvme/ioctl.c +++ b/src/nvme/ioctl.c @@ -13,9 +13,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -23,6 +25,8 @@ #include "ioctl.h" #include "util.h" +static bool nvme_debug; + static int nvme_verify_chr(int fd) { static struct stat nvme_stat; @@ -86,13 +90,62 @@ static int nvme_submit_passthru64(int fd, unsigned long ioctl_cmd, return err; } +static void nvme_show_command(struct nvme_passthru_cmd *cmd, int err, struct timeval start, + struct timeval end) +{ + printf("opcode : %02x\n", cmd->opcode); + printf("flags : %02x\n", cmd->flags); + printf("rsvd1 : %04x\n", cmd->rsvd1); + printf("nsid : %08x\n", cmd->nsid); + printf("cdw2 : %08x\n", cmd->cdw2); + printf("cdw3 : %08x\n", cmd->cdw3); + printf("data_len : %08x\n", cmd->data_len); + printf("metadata_len : %08x\n", cmd->metadata_len); + printf("addr : %"PRIx64"\n", (uint64_t)(uintptr_t)cmd->addr); + printf("metadata : %"PRIx64"\n", (uint64_t)(uintptr_t)cmd->metadata); + printf("cdw10 : %08x\n", cmd->cdw10); + printf("cdw11 : %08x\n", cmd->cdw11); + printf("cdw12 : %08x\n", cmd->cdw12); + printf("cdw13 : %08x\n", cmd->cdw13); + printf("cdw14 : %08x\n", cmd->cdw14); + printf("cdw15 : %08x\n", cmd->cdw15); + printf("timeout_ms : %08x\n", cmd->timeout_ms); + printf("result : %08x\n", cmd->result); + printf("err : %d\n", err); + printf("latency : %lu us\n", + (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec)); +} + +void nvme_set_debug(bool debug) +{ + nvme_debug = debug; +} + +bool nvme_get_debug(void) +{ + return nvme_debug; +} + static int nvme_submit_passthru(int fd, unsigned long ioctl_cmd, struct nvme_passthru_cmd *cmd, __u32 *result) { - int err = ioctl(fd, ioctl_cmd, cmd); + struct timeval start; + struct timeval end; + int err; + + if (nvme_get_debug()) + gettimeofday(&start, NULL); + + err = ioctl(fd, ioctl_cmd, cmd); + + if (nvme_get_debug()) { + gettimeofday(&end, NULL); + nvme_show_command(cmd, err, start, end); + } if (err >= 0 && result) *result = cmd->result; + return err; } diff --git a/src/nvme/ioctl.h b/src/nvme/ioctl.h index 47d8625e..2a6c4621 100644 --- a/src/nvme/ioctl.h +++ b/src/nvme/ioctl.h @@ -3855,4 +3855,16 @@ int nvme_zns_append(struct nvme_zns_append_args *args); */ int nvme_dim_send(struct nvme_dim_args *args); +/** + * nvme_set_debug - Set NVMe command debugging output + * @debug: true to enable or false to disable + */ +void nvme_set_debug(bool debug); + +/** + * nvme_get_debug - Get NVMe command debugging output + * + * Return: false if disabled or true if enabled. + */ +bool nvme_get_debug(void); #endif /* _LIBNVME_IOCTL_H */