[PATCH] nvme-cli: telemetry-log add controller initiated log gathering
Scott Bauer
scott.bauer at intel.com
Mon Feb 5 13:26:23 PST 2018
If the controller has a controller initiated log (0x8) available,
we can now retrieve it.
Signed-off-by: Scott Bauer <scott.bauer at intel.com>
---
linux/nvme.h | 1 +
nvme-ioctl.c | 6 +++++-
nvme-ioctl.h | 2 +-
nvme.c | 8 ++++++--
4 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/linux/nvme.h b/linux/nvme.h
index 8bacf3a..537217a 100644
--- a/linux/nvme.h
+++ b/linux/nvme.h
@@ -795,6 +795,7 @@ enum {
NVME_LOG_FW_SLOT = 0x03,
NVME_LOG_CMD_EFFECTS = 0x05,
NVME_LOG_TELEMETRY_HOST = 0x07,
+ NVME_LOG_TELEMETRY_CTRL = 0x08,
NVME_LOG_DISC = 0x70,
NVME_LOG_RESERVATION = 0x80,
NVME_LOG_SANITIZE = 0x81,
diff --git a/nvme-ioctl.c b/nvme-ioctl.c
index 6dd7192..a6e1e01 100644
--- a/nvme-ioctl.c
+++ b/nvme-ioctl.c
@@ -412,8 +412,12 @@ int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data)
}
int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
- size_t log_page_size, __u64 offset)
+ int ctrl_init, size_t log_page_size, __u64 offset)
{
+ if (ctrl_init)
+ return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_CTRL,
+ NVME_NO_LOG_LSP, offset,
+ log_page_size, lp);
if (generate_report)
return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_HOST,
NVME_TELEM_LSP_CREATE, offset,
diff --git a/nvme-ioctl.h b/nvme-ioctl.h
index 6569665..f5b287b 100644
--- a/nvme-ioctl.h
+++ b/nvme-ioctl.h
@@ -84,7 +84,7 @@ int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data);
int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
- size_t log_page_size, __u64 offset);
+ int ctrl_gen, size_t log_page_size, __u64 offset);
int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log);
int nvme_error_log(int fd, int entries, struct nvme_error_log_page *err_log);
int nvme_smart_log(int fd, __u32 nsid, struct nvme_smart_log *smart_log);
diff --git a/nvme.c b/nvme.c
index 499beef..8e97cfa 100644
--- a/nvme.c
+++ b/nvme.c
@@ -233,6 +233,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct
const char *desc = "Retrieve telemetry log and write to binary file";
const char *fname = "File name to save raw binary, includes header";
const char *hgen = "Have the host tell the controller to generate the report";
+ const char *cgen = "Gather report generated by the controller.";
struct nvme_telemetry_log_page_hdr *hdr;
void *page_log;
size_t full_size, offset, num_blocks;
@@ -241,15 +242,18 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct
struct config {
char *file_name;
__u32 host_gen;
+ int ctrl_init;
};
struct config cfg = {
.file_name = NULL,
.host_gen = 1,
+ .ctrl_init = 0,
};
const struct argconfig_commandline_options command_line_options[] = {
{"output-file", 'o', "FILE", CFG_STRING, &cfg.file_name, required_argument, fname},
{"host-generate", 'h', "NUM", CFG_POSITIVE, &cfg.host_gen, required_argument, hgen},
+ {"controller-init", 'c', "", CFG_NONE, &cfg.ctrl_init, no_argument, cgen},
{NULL}
};
@@ -277,7 +281,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct
hdr = malloc(4096);
memset(hdr, 0, 4096);
- err = nvme_get_telemetry_log(fd, hdr, cfg.host_gen, 4096, 0);
+ err = nvme_get_telemetry_log(fd, hdr, cfg.host_gen, cfg.ctrl_init, 4096, 0);
if (err) {
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
@@ -310,7 +314,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct
}
while (full_size) {
- err = nvme_get_telemetry_log(fd, page_log, 0, 4096, offset);
+ err = nvme_get_telemetry_log(fd, page_log, 0, cfg.ctrl_init, 4096, offset);
if (err) {
fprintf(stderr, "Failed to aquire full telemetry log!\n");
fprintf(stderr, "NVMe Status:%s(%x)\n",
--
2.11.0
More information about the Linux-nvme
mailing list