Skip to content

Commit

Permalink
ioctl: Add debugging feature to show command outputs
Browse files Browse the repository at this point in the history
Signed-off-by: Tokunori Ikegami <[email protected]>
  • Loading branch information
ikegami-t committed Sep 12, 2023
1 parent 460a2b4 commit a65b1d2
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/libnvme.map
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
55 changes: 54 additions & 1 deletion src/nvme/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,20 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>

#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>

#include <ccan/build_assert/build_assert.h>
#include <ccan/endian/endian.h>

#include "ioctl.h"
#include "util.h"

static bool nvme_debug;

static int nvme_verify_chr(int fd)
{
static struct stat nvme_stat;
Expand Down Expand Up @@ -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;
}

Expand Down
12 changes: 12 additions & 0 deletions src/nvme/ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit a65b1d2

Please sign in to comment.