[PATCH 1/5] nvme-cli: Decode "Supported Events Bitmap" in PEL header
Chaitanya Kulkarni
chaitanyak at nvidia.com
Wed Nov 17 17:49:52 PST 2021
On 11/17/21 08:04, wenxiong at linux.ibm.com wrote:
> From: Wen Xiong <wenxiong at linux.ibm.com>
>
> "Supported Events Bitmap" in PEL header shows what events
> are supported in current nvme devices.
>
> Persistent Event Log for device: nvme0n1
> Action for Persistent Event Log: 0
> ..
> ..
> ..
> Supported Events Bitmap:
> Support SMART/Health Log Snapshot Event(0x1)
> Support Firmware Commit Event(0x2)
> Support Timestamp Change Event(0x3)
> Support Power-on or Reset Event(0x4)
> Support NVM Subsystem Hardware Error Event(0x5)
> Support Change Namespace Event(0x6)
> Support Format NVM Start Event(0x7)
> Support Format NVM Completion Event(0x8)
> Support Sanitize Start Event(0x9)
> Support Sanitize Completion Event(0xa)
> Support Set Feature Event(0xb)
> Support Set Telemetry CRT Event(0xc)
> Support Thermal Excursion Event(0xd)
>
> Signed-off-by: Wen Xiong <wenxiong at linux.ibm.com>
You need to provide a cover-letter for series like this...
> ---
> nvme-print.c | 44 ++++++++++++++++++++++++++++++++++++++------
> nvme.c | 4 ++--
> 2 files changed, 40 insertions(+), 8 deletions(-)
>
> diff --git a/nvme-print.c b/nvme-print.c
> index 1556b52..16fd569 100644
> --- a/nvme-print.c
> +++ b/nvme-print.c
> @@ -1053,6 +1053,26 @@ void nvme_show_predictable_latency_event_agg_log(
> }
> }
>
> +const char *nvme_pel_event_to_string(int type)
> +{
> + switch (type) {
> + case NVME_PEL_SMART_HEALTH_EVENT: return "SMART/Health Log Snapshot Event(0x1)";
> + case NVME_PEL_FW_COMMIT_EVENT: return "Firmware Commit Event(0x2)";
> + case NVME_PEL_TIMESTAMP_EVENT: return "Timestamp Change Event(0x3)";
> + case NVME_PEL_POWER_ON_RESET_EVENT: return "Power-on or Reset Event(0x4)";
> + case NVME_PEL_NSS_HW_ERROR_EVENT: return "NVM Subsystem Hardware Error Event(0x5)";
> + case NVME_PEL_CHANGE_NS_EVENT: return "Change Namespace Event(0x6)";
> + case NVME_PEL_FORMAT_START_EVENT: return "Format NVM Start Event(0x7)";
> + case NVME_PEL_FORMAT_COMPLETION_EVENT: return "Format NVM Completion Event(0x8)";
> + case NVME_PEL_SANITIZE_START_EVENT: return "Sanitize Start Event(0x9)";
> + case NVME_PEL_SANITIZE_COMPLETION_EVENT: return "Sanitize Completion Event(0xa)";
> + case NVME_PEL_SET_FEATURE_EVENT: return "Set Feature Event(0xb)";
> + case NVME_PEL_TELEMETRY_CRT: return "Set Telemetry CRT Event(0xc)";
> + case NVME_PEL_THERMAL_EXCURSION_EVENT: return "Thermal Excursion Event(0xd)";
> + default: return NULL;
> + }
> +}
> +
> static const char *nvme_show_nss_hw_error(__u16 error_code)
> {
> switch (error_code) {
> @@ -1089,6 +1109,7 @@ void json_persistent_event_log(void *pevent_log_info, __u32 size)
> __u32 offset, por_info_len, por_info_list;
> __u64 *fw_rev;
> char key[128];
> + char evt_str[50];
>
> struct nvme_smart_log *smart_event;
> struct nvme_fw_commit_event *fw_commit_event;
> @@ -1151,9 +1172,16 @@ void json_persistent_event_log(void *pevent_log_info, __u32 size)
> for (int i = 0; i < 32; i++) {
> if (pevent_log_head->seb[i] == 0)
> continue;
> - sprintf(key, "bitmap_%d", i);
> - json_object_add_value_uint(root, key,
> - pevent_log_head->seb[i]);
> + for (int bit = 0; bit < 8; bit++) {
> + if (nvme_pel_event_to_string(bit + i * 8)) {
> + sprintf(key, "bitmap_%x", (bit + i * 8));
> + if ((pevent_log_head->seb[i] >> bit) & 0x1)
> + snprintf(evt_str, sizeof(evt_str), "Support %s",
> + nvme_pel_event_to_string(bit + i * 8));
> + json_object_add_value_string(root, key, evt_str);
> + }
> + }
> +
please create a helper for above hunk, too much nesting ..
> }
> } else {
> printf("No log data can be shown with this log len at least " \
> @@ -1479,12 +1507,16 @@ void nvme_show_persistent_event_log(void *pevent_log_info,
> le32_to_cpu(pevent_log_head->rci));
> if (human)
> nvme_show_persistent_event_log_rci(pevent_log_head->rci);
> - printf("Supported Events Bitmap: ");
> + printf("Supported Events Bitmap: \n");
> for (int i = 0; i < 32; i++) {
> if (pevent_log_head->seb[i] == 0)
> continue;
> - printf(" BitMap[%d] is 0x%x\n", i,
> - pevent_log_head->seb[i]);
> + for (int bit = 0; bit < 8; bit++) {
> + if (nvme_pel_event_to_string(bit + i * 8))
> + if ((pevent_log_head->seb[i] >> bit) & 0x1)
> + printf(" Support %s\n",
> + nvme_pel_event_to_string(bit + i * 8));
> + }
same here as above
> }
> } else {
> printf("No log data can be shown with this log len at least " \
> diff --git a/nvme.c b/nvme.c
> index 303315c..7f89801 100644
> --- a/nvme.c
> +++ b/nvme.c
> @@ -4900,7 +4900,7 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin
>
> nc = argconfig_parse_comma_sep_array(cfg.ctx_attrs, (int *)ctx_attrs, ARRAY_SIZE(ctx_attrs));
> nb = argconfig_parse_comma_sep_array(cfg.blocks, (int *)nlbs, ARRAY_SIZE(nlbs));
> - ns = argconfig_parse_comma_sep_array_long(cfg.slbas, slbas, ARRAY_SIZE(slbas));
> + ns = argconfig_parse_comma_sep_array_long(cfg.slbas, (long long unsigned int *)slbas, ARRAY_SIZE(slbas));
> nr = max(nc, max(nb, ns));
> if (!nr || nr > 256) {
> fprintf(stderr, "No range definition provided\n");
> @@ -5044,7 +5044,7 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi
> }
> }
>
> - nvme_init_copy_range(copy, nlbs, slbas, eilbrts, elbatms, elbats, nr);
> + nvme_init_copy_range(copy, nlbs, (__u64 *)slbas, eilbrts, elbatms, elbats, nr);
>
> err = nvme_copy(fd, cfg.namespace_id, copy, cfg.sdlba, nr, cfg.prinfor,
> cfg.prinfow, cfg.dtype, cfg.dspec, cfg.format, cfg.lr,
>
More information about the Linux-nvme
mailing list