]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme-cli: add support of RAE
authorAlexey Timofeyev <alexey.timofeyev@sk.com>
Thu, 28 Jun 2018 17:33:05 +0000 (17:33 +0000)
committerAlexey Timofeyev <alexey.timofeyev@sk.com>
Thu, 28 Jun 2018 17:36:14 +0000 (17:36 +0000)
Currently telemetry-log cannot retain content of corresponding log page as RAE is not set.
This patch adds RAE bit support into routines to retrieve log pages.

Signed-off-by: Alexey Timofeyev <alexey.timofeyev@sk.com>
Documentation/nvme-get-log.1
Documentation/nvme-get-log.html
Documentation/nvme-get-log.txt
nvme-ioctl.c
nvme-ioctl.h
nvme.c

index f596071b65a4b8db3de66b3cc0fe159874ade700..5cd47d64107de653b2df48d365d53358ccab8d11 100644 (file)
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 06/05/2018
+.\"      Date: 06/28/2018
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-LOG" "1" "06/05/2018" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LOG" "1" "06/28/2018" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -39,6 +39,7 @@ nvme-get-log \- Retrieves a log page from an NVMe device
                       [\-\-raw\-binary | \-b]
                       [\-\-lpo=<offset> | \-o <offset>]
                       [\-\-lsp=<field> | \-s <field>]
+                      [\-\-rae | \-r]
 .fi
 .SH "DESCRIPTION"
 .sp
@@ -83,6 +84,11 @@ The log page offset specifies the location within a log page to start returning
 .RS 4
 The log specified field of LID\&.
 .RE
+.PP
+\-r, \-\-rae
+.RS 4
+Retain an Asynchronous Event\&.
+.RE
 .SH "EXAMPLES"
 .sp
 .RS 4
index 665490a5165c0d5c1d05764488b3933f264ca704..0efb56b69ec37cc1714a515a4f20af8f10c09a0b 100644 (file)
@@ -1,9 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
 <head>\r
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.8" />\r
+<meta name="generator" content="AsciiDoc 8.6.10" />\r
 <title>nvme-get-log(1)</title>\r
 <style type="text/css">\r
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
@@ -94,7 +95,9 @@ ul > li > * { color: black; }
   padding: 0;\r
   margin: 0;\r
 }\r
-\r
+pre {\r
+  white-space: pre-wrap;\r
+}\r
 \r
 #author {\r
   color: #527bbd;\r
@@ -223,7 +226,7 @@ div.exampleblock > div.content {
 }\r
 \r
 div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
 a.image:visited { color: white; }\r
 \r
 dl {\r
@@ -752,7 +755,8 @@ nvme-get-log(1) Manual Page
                       [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]\r
                       [--raw-binary | -b]\r
                       [--lpo=&lt;offset&gt; | -o &lt;offset&gt;]\r
-                      [--lsp=&lt;field&gt; | -s &lt;field&gt;]</pre>\r
+                      [--lsp=&lt;field&gt; | -s &lt;field&gt;]\r
+                      [--rae | -r]</pre>\r
 <div class="attribution">\r
 </div></div>\r
 </div>\r
@@ -859,6 +863,17 @@ program to parse.</p></div>
         The log specified field of LID.\r
 </p>\r
 </dd>\r
+<dt class="hdlist1">\r
+-r\r
+</dt>\r
+<dt class="hdlist1">\r
+--rae\r
+</dt>\r
+<dd>\r
+<p>\r
+        Retain an Asynchronous Event.\r
+</p>\r
+</dd>\r
 </dl></div>\r
 </div>\r
 </div>\r
@@ -902,7 +917,8 @@ Have the program return the raw log page in binary:
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 2018-02-07 09:54:27 MST\r
+Last updated\r
+ 2018-06-28 16:56:55 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 1df0a26c1b66f57a087209c241ed94d0167725c8..301fb81ea833d51d8cd3f20c72ac563ef3c10906 100644 (file)
@@ -15,6 +15,7 @@ SYNOPSIS
                      [--raw-binary | -b]
                      [--lpo=<offset> | -o <offset>]
                      [--lsp=<field> | -s <field>]
+                     [--rae | -r]
 
 DESCRIPTION
 -----------
@@ -67,6 +68,10 @@ OPTIONS
 --lsp=<field>::
        The log specified field of LID.
 
+-r::
+--rae::
+       Retain an Asynchronous Event.
+
 EXAMPLES
 --------
 * Get 512 bytes from log page 2
index 2e0abf9cc2c3064a5c9ff607723ce61db09722b6..ec8084688216e322649f67b0895e66bf516dd1a8 100644 (file)
@@ -394,7 +394,7 @@ int nvme_identify_nvmset(int fd, __u16 nvmset_id, void *data)
 }
 
 int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
-                 __u16 lsi, __u32 data_len, void *data)
+                 __u16 lsi, bool rae, __u32 data_len, void *data)
 {
        struct nvme_admin_cmd cmd = {
                .opcode         = nvme_admin_get_log_page,
@@ -405,7 +405,7 @@ int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
        __u32 numd = (data_len >> 2) - 1;
        __u16 numdu = numd >> 16, numdl = numd & 0xffff;
 
-       cmd.cdw10 = log_id | (numdl << 16);
+       cmd.cdw10 = log_id | (numdl << 16) | (rae ? 1 << 15 : 0);
        if (lsp)
                 cmd.cdw10 |= lsp << 8;
 
@@ -420,7 +420,7 @@ int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
 int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data)
 {
        return nvme_get_log13(fd, nsid, log_id, NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
-                             0, data_len, data);
+                             0, 0, data_len, data);
 }
 
 int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
@@ -429,15 +429,15 @@ int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
        if (ctrl_init)
                return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_CTRL,
                                      NVME_NO_LOG_LSP, offset,
-                                     0, log_page_size, lp);
+                                     0, 1, log_page_size, lp);
        if (generate_report)
                return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_HOST,
                                      NVME_TELEM_LSP_CREATE, offset,
-                                     0, log_page_size, lp);
+                                     0, 1, log_page_size, lp);
        else
                return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_HOST,
                                      NVME_NO_LOG_LSP, offset,
-                                     0, log_page_size, lp);
+                                     0, 1, log_page_size, lp);
 }
 
 int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log)
@@ -458,7 +458,7 @@ int nvme_error_log(int fd, int entries, struct nvme_error_log_page *err_log)
 
 int nvme_endurance_log(int fd, __u16 group_id, struct nvme_endurance_group_log *endurance_log)
 {
-       return nvme_get_log13(fd, 0, NVME_LOG_ENDURANCE_GROUP, 0, 0, group_id,
+       return nvme_get_log13(fd, 0, NVME_LOG_ENDURANCE_GROUP, 0, 0, group_id, 0,
                        sizeof(*endurance_log), endurance_log);
 }
 
index 0b2006221eca093859c4db3791e2305663538e29..199b29e409df9d4c77ae4d6efa8ad25ad2f8c254 100644 (file)
@@ -81,7 +81,7 @@ int nvme_identify_ctrl_list(int fd, __u32 nsid, __u16 cntid, void *data);
 int nvme_identify_ns_descs(int fd, __u32 nsid, void *data);
 int nvme_identify_nvmset(int fd, __u16 nvmset_id, void *data);
 int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
-                  __u16 group_id, __u32 data_len, void *data);
+                  __u16 group_id, bool rae, __u32 data_len, void *data);
 int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data);
 
 
diff --git a/nvme.c b/nvme.c
index d456bf19c6b3820ae89660d0f54eb70181315a4a..f95ed68d6d0b4eeff3d65b3091ab120f0ab46e9c 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -673,6 +673,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
        const char *aen = "result of the aen, use to override log id";
        const char *lsp = "log specific field";
        const char *lpo = "log page offset specifies the location within a log page from where to start returning data";
+       const char *rae = "retain an asynchronous event";
        const char *raw_binary = "output in raw format";
        int err, fd;
 
@@ -683,6 +684,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
                __u32 aen;
                __u64 lpo;
                __u8  lsp;
+               int   rae;
                int   raw_binary;
        };
 
@@ -692,6 +694,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
                .log_len      = 0,
                .lpo          = NVME_NO_LOG_LPO,
                .lsp          = NVME_NO_LOG_LSP,
+               .rae          = 0,
        };
 
        const struct argconfig_commandline_options command_line_options[] = {
@@ -702,6 +705,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
                {"raw-binary",   'b', "",    CFG_NONE,     &cfg.raw_binary,   no_argument,       raw_binary},
                {"lpo",          'o', "NUM", CFG_LONG,     &cfg.lpo,          required_argument, lpo},
                {"lsp",          's', "NUM", CFG_BYTE,     &cfg.lsp,          required_argument, lsp},
+               {"rae",          'r', "",    CFG_NONE,     &cfg.rae,          no_argument,       rae},
                {NULL}
        };
 
@@ -734,7 +738,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
                }
 
                err = nvme_get_log13(fd, cfg.namespace_id, cfg.log_id,
-                                    cfg.lsp, cfg.lpo, 0,
+                                    cfg.lsp, cfg.lpo, 0, cfg.rae,
                                     cfg.log_len, log);
                if (!err) {
                        if (!cfg.raw_binary) {
@@ -2811,7 +2815,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
                {"cdw12",        'c', "NUM",  CFG_POSITIVE, &cfg.cdw12,        required_argument, cdw12},
                {"data-len",     'l', "NUM",  CFG_POSITIVE, &cfg.data_len,     required_argument, data_len},
                {"data",         'd', "FILE", CFG_STRING,   &cfg.file,         required_argument, data},
-               {"save",         's', "",     CFG_NONE,     &cfg.save,         no_argument, save},
+               {"save",         's', "",     CFG_NONE,     &cfg.save,         no_argument,       save},
                {NULL}
        };