linux-nvme.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: wenxiong <wenxiong@linux.vnet.ibm.com>
To: wenxiong@linux.vnet.ibm.com
Cc: keith.busch@intel.com, Medha Fox <mdate@us.ibm.com>,
	linux-nvme@lists.infradead.org, wenxiong@us.ibm.com
Subject: Re: [PATCH V2] nvme-cli: improvment critical warning format
Date: Thu, 21 Nov 2019 11:21:20 -0600	[thread overview]
Message-ID: <51c04102f8bf1d82283347ca20650fc9@linux.vnet.ibm.com> (raw)
In-Reply-To: <1572986551-5786-1-git-send-email-wenxiong@linux.vnet.ibm.com>

Hi Keith,

I appreciate your comments and feedback for this V2 patch. Our team 
likes to integrate it into linux distro.

Thanks for your help!
Wendy

On 2019-11-05 14:42, wenxiong@linux.vnet.ibm.com wrote:
> From: Wen Xiong <wenxiong@linux.vnet.ibm.com>
> 
> This patch improves the critical warning format with smart-log.
> 
> Signed-off-by: Wendy Xiong<wenxiong@linux.vnet.ibm.com>
> Signed-off-by: Medha Fox<mdate@us.ibm.com>
> ---
>  nvme-print.c |   29 ++++++++++++++++++++++++++---
>  nvme-print.h |    4 ++--
>  nvme.c       |   11 +++++++++--
>  3 files changed, 37 insertions(+), 7 deletions(-)
> 
> diff --git a/nvme-print.c b/nvme-print.c
> index ae91eb8..68a63fb 100644
> --- a/nvme-print.c
> +++ b/nvme-print.c
> @@ -1722,15 +1722,27 @@ void show_endurance_log(struct
> nvme_endurance_group_log *endurance_group,
>  		int128_to_double(endurance_group->num_err_info_log_entries));
>  }
> 
> -void show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname)
> +void show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname, unsigned int flag)
>  {
>  	/* convert temperature from Kelvin to Celsius */
>  	int temperature = ((smart->temperature[1] << 8) |
>  		smart->temperature[0]) - 273;
>  	int i;
> +	int human = flag & HUMAN;
> 
>  	printf("Smart Log for NVME device:%s namespace-id:%x\n", devname, 
> nsid);
> -	printf("critical_warning			: %#x\n", smart->critical_warning);
> +	printf("critical_warning                        : %#x\n",
> smart->critical_warning);
> +	printf("      Available Spare[0]                : %d\n",
> smart->critical_warning & 0x01);
> +
> +	if (human) {
> +		printf("      Available Spare[0]                : %d\n",
> smart->critical_warning & 0x01);
> +		printf("      Temp. Threshold[1]                : %d\n",
> (smart->critical_warning & 0x02) >> 1);
> +		printf("      NVM subsystem Reliability[2]      : %d\n",
> (smart->critical_warning & 0x04) >> 2);
> +		printf("      Read-only[3]                      : %d\n",
> (smart->critical_warning & 0x08) >> 3);
> +		printf("      Volatile mem. backup failed[4]    : %d\n",
> (smart->critical_warning & 0x10) >> 4);
> +		printf("      Persistent Mem. RO[5]             : %d\n",
> (smart->critical_warning & 0x20) >> 5);
> +	}
> +
>  	printf("temperature				: %d C\n", temperature);
>  	printf("available_spare				: %u%%\n", smart->avail_spare);
>  	printf("available_spare_threshold		: %u%%\n", smart->spare_thresh);
> @@ -3221,11 +3233,12 @@ void json_endurance_log(struct
> nvme_endurance_group_log *endurance_group,
>  	json_free_object(root);
>  }
> 
> -void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname)
> +void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname, unsigned int flag)
>  {
>  	struct json_object *root;
>  	int c;
>  	char key[21];
> +	int human = flag & HUMAN;
> 
>  	unsigned int temperature = ((smart->temperature[1] << 8) |
>  		smart->temperature[0]);
> @@ -3244,6 +3257,16 @@ void json_smart_log(struct nvme_smart_log
> *smart, unsigned int nsid, const char
>  	root = json_create_object();
> 
>  	json_object_add_value_int(root, "critical_warning", 
> smart->critical_warning);
> +
> +	if (human) {
> +		json_object_add_value_int(root,"   Available Spare[0]",
> smart->critical_warning & 0x01);
> +		json_object_add_value_int(root,"   Temp. Threshold[1]",
> (smart->critical_warning & 0x02) >> 1);
> +		json_object_add_value_int(root,"   NVM subsystem Reliability[2]",
> (smart->critical_warning & 0x04) >> 2);
> +		json_object_add_value_int(root,"   Read-only[3]",
> (smart->critical_warning & 0x08) >> 3);
> +		json_object_add_value_int(root,"   Volatile mem. backup failed[4]",
> (smart->critical_warning & 0x10) >> 4);
> +		json_object_add_value_int(root,"   Persistent Mem. RO[5]",
> (smart->critical_warning & 0x20) >> 5);
> +	}
> +
>  	json_object_add_value_int(root, "temperature", temperature);
>  	json_object_add_value_int(root, "avail_spare", smart->avail_spare);
>  	json_object_add_value_int(root, "spare_thresh", smart->spare_thresh);
> diff --git a/nvme-print.h b/nvme-print.h
> index dea8915..44d7ff6 100644
> --- a/nvme-print.h
> +++ b/nvme-print.h
> @@ -24,7 +24,7 @@ void show_nvme_id_ns(struct nvme_id_ns *ns, unsigned
> int flags);
>  void show_nvme_resv_report(struct nvme_reservation_status *status,
> int bytes, __u32 cdw11);
>  void show_lba_range(struct nvme_lba_range_type *lbrt, int nr_ranges);
>  void show_error_log(struct nvme_error_log_page *err_log, int entries,
> const char *devname);
> -void show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname);
> +void show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname, unsigned int flag);
>  void show_ana_log(struct nvme_ana_rsp_hdr *ana_log, const char 
> *devname);
>  void show_self_test_log(struct nvme_self_test_log *self_test, const
> char *devname);
>  void show_fw_log(struct nvme_firmware_log_page *fw_log, const char 
> *devname);
> @@ -57,7 +57,7 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
> unsigned int mode, void (*vend
>  void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int flags);
>  void json_nvme_resv_report(struct nvme_reservation_status *status,
> int bytes, __u32 cdw11);
>  void json_error_log(struct nvme_error_log_page *err_log, int entries,
> const char *devname);
> -void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname);
> +void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
> const char *devname, unsigned int flag);
>  void json_ana_log(struct nvme_ana_rsp_hdr *ana_log, const char 
> *devname);
>  void json_effects_log(struct nvme_effects_log_page *effects_log,
> const char *devname);
>  void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
> const char *devname);
> diff --git a/nvme.c b/nvme.c
> index 0823267..e249695 100644
> --- a/nvme.c
> +++ b/nvme.c
> @@ -174,11 +174,14 @@ static int get_smart_log(int argc, char **argv,
> struct command *cmd, struct plug
>  			"(default) or binary.";
>  	const char *namespace = "(optional) desired namespace";
>  	const char *raw = "output in binary format";
> +	const char *human_readable = "show info in readable format";
>  	int err, fmt, fd;
> +	unsigned int flag = 0;
> 
>  	struct config {
>  		__u32 namespace_id;
>  		int   raw_binary;
> +		int   human_readable;
>  		char *output_format;
>  	};
> 
> @@ -192,6 +195,7 @@ static int get_smart_log(int argc, char **argv,
> struct command *cmd, struct plug
>  		OPT_UINT("namespace-id", 'n', &cfg.namespace_id,  namespace),
>  		OPT_FMT("output-format", 'o', &cfg.output_format, output_format),
>  		OPT_FLAG("raw-binary",   'b', &cfg.raw_binary,    raw),
> +		OPT_FLAG("human-readable", 'H', &cfg.human_readable,    
> human_readable),
>  		OPT_END()
>  	};
> 
> @@ -209,14 +213,17 @@ static int get_smart_log(int argc, char **argv,
> struct command *cmd, struct plug
>  	if (cfg.raw_binary)
>  		fmt = BINARY;
> 
> +	if (cfg.human_readable)
> +		flag |= HUMAN;
> +
>  	err = nvme_smart_log(fd, cfg.namespace_id, &smart_log);
>  	if (!err) {
>  		if (fmt == BINARY)
>  			d_raw((unsigned char *)&smart_log, sizeof(smart_log));
>  		else if (fmt == JSON)
> -			json_smart_log(&smart_log, cfg.namespace_id, devicename);
> +			json_smart_log(&smart_log, cfg.namespace_id, devicename, flag);
>  		else
> -			show_smart_log(&smart_log, cfg.namespace_id, devicename);
> +			show_smart_log(&smart_log, cfg.namespace_id, devicename, flag);
>  	} else if (err > 0)
>  		show_nvme_status(err);
>  	else

_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

      reply	other threads:[~2019-11-21 17:21 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-05 20:42 [PATCH V2] nvme-cli: improvment critical warning format wenxiong
2019-11-21 17:21 ` wenxiong [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51c04102f8bf1d82283347ca20650fc9@linux.vnet.ibm.com \
    --to=wenxiong@linux.vnet.ibm.com \
    --cc=keith.busch@intel.com \
    --cc=linux-nvme@lists.infradead.org \
    --cc=mdate@us.ibm.com \
    --cc=wenxiong@us.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).