[PATCH V2 1/5] nvme-cli: Decode "Supported Events Bitmap" in PEL header
Chaitanya Kulkarni
chaitanyak at nvidia.com
Sun Dec 12 23:50:18 PST 2021
On 11/18/21 8:57 AM, wenxiong at linux.ibm.com wrote:
> External email: Use caution opening links or attachments
>
>
> 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 word is duplicate since we already have
"Supported Events Bitmap" in the header of this message.
> 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>
> ---
> nvme-print.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------
> nvme.c | 4 ++--
> 2 files changed, 48 insertions(+), 8 deletions(-)
>
> diff --git a/nvme-print.c b/nvme-print.c
> index 1556b52..1b419b7 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)
> +{
type should be a type of enum nvme_persistent_event_types,
is there a reason its type is int ?
> + 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) {
> @@ -1081,6 +1101,29 @@ static const char *nvme_show_nss_hw_error(__u16 error_code)
> }
> }
>
> +void add_bitmap(int i, __u8 seb, struct json_object *root, int json_flag)
> +{
> + char evt_str[50];
> + char key[128];
> +
do we need to initialize above arrays to 0s ?
> + for (int bit = 0; bit < 8; bit++) {
> + if (nvme_pel_event_to_string(bit + i * 8)) {
> + if (json_flag == 1) {
If json_flag is going to take only two values then its type should be
bool.
> + sprintf(key, "bitmap_%x", (bit + i * 8));
> + if ((seb >> 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);
> + } else {
> + if (nvme_pel_event_to_string(bit + i * 8))
> + if ((seb >> bit) & 0x1)
> + printf(" Support %s\n",
> + nvme_pel_event_to_string(bit + i * 8));
> + }
> + }
> + }
> +}
> +
> void json_persistent_event_log(void *pevent_log_info, __u32 size)
> {
> struct json_object *root;
> @@ -1151,9 +1194,7 @@ 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]);
> + add_bitmap(i, pevent_log_head->seb[i], root, 1);
> }
> } else {
> printf("No log data can be shown with this log len at least " \
> @@ -1479,12 +1520,11 @@ 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]);
> + add_bitmap(i, pevent_log_head->seb[i], NULL, 0);
> }
> } else {
> printf("No log data can be shown with this log len at least " \
> diff --git a/nvme.c b/nvme.c
> index 6ebfa92..a68db6c 100644
> --- a/nvme.c
> +++ b/nvme.c
> @@ -4922,7 +4922,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");
> @@ -5067,7 +5067,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,
> --
> 2.27.0
>
More information about the Linux-nvme
mailing list