]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
fabrics: fetch smaller Discovery Log Page header
authorCaleb Sander <csander@purestorage.com>
Tue, 1 Aug 2023 17:24:15 +0000 (11:24 -0600)
committerDaniel Wagner <wagi@monom.org>
Tue, 7 Nov 2023 07:06:49 +0000 (08:06 +0100)
Most of the 1 KB Discovery Log Page header is reserved.
Only the first 18 bytes are currently defined.
So avoid transfering more data from the controller than necessary.

Signed-off-by: Caleb Sander <csander@purestorage.com>
src/nvme/fabrics.c
test/ioctl/discovery.c

index c406acf8ca82c2dc42b9f1762310955e3a982bb5..6617f7b615a5eb29edb57312581fc6ef703b515c 100644 (file)
@@ -1054,6 +1054,13 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
        return NULL;
 }
 
+/*
+ * Most of nvmf_discovery_log is reserved, so only fetch the initial bytes.
+ * 8 bytes for GENCTR, 8 for NUMREC, and 2 for RECFMT.
+ * Since only multiples of 4 bytes are allowed, round 18 up to 20.
+ */
+#define DISCOVERY_HEADER_LEN 20
+
 static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c,
                                                     struct nvme_get_log_args *args,
                                                     int max_retries)
@@ -1077,7 +1084,7 @@ static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c,
                 name, retries, max_retries);
        args->lpo = 0;
        args->log = log;
-       args->len = sizeof(*log);
+       args->len = DISCOVERY_HEADER_LEN;
        if (nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, args)) {
                nvme_msg(r, LOG_INFO,
                         "%s: discover try %d/%d failed, error %d\n",
@@ -1126,7 +1133,7 @@ static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c,
 
                args->lpo = 0;
                args->log = log;
-               args->len = sizeof(*log);
+               args->len = DISCOVERY_HEADER_LEN;
                if (nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, args)) {
                        nvme_msg(r, LOG_INFO,
                                 "%s: discover try %d/%d failed, error %d\n",
index c62aff65ed914eb3074942cc52cdc7ec6729765b..f5f6f5160fae2a35e07ed35223baaa8683ad41c3 100644 (file)
@@ -13,6 +13,7 @@
 #include "util.h"
 
 #define TEST_FD 0xFD
+#define HEADER_LEN 20
 
 static void arbitrary_ascii_string(size_t max_len, char *str, char *log_str)
 {
@@ -61,8 +62,8 @@ static void test_no_entries(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -89,8 +90,8 @@ static void test_four_entries(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -104,8 +105,8 @@ static void test_four_entries(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -139,8 +140,8 @@ static void test_five_entries(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -163,8 +164,8 @@ static void test_five_entries(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -200,8 +201,8 @@ static void test_genctr_change(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header1),
-                       .cdw10 = (sizeof(header1) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header1,
                },
@@ -215,8 +216,8 @@ static void test_genctr_change(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header2),
-                       .cdw10 = (sizeof(header2) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header2,
                },
@@ -230,8 +231,8 @@ static void test_genctr_change(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header2),
-                       .cdw10 = (sizeof(header2) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header2,
                },
@@ -264,8 +265,8 @@ static void test_max_retries(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header1),
-                       .cdw10 = (sizeof(header1) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header1,
                },
@@ -279,8 +280,8 @@ static void test_max_retries(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header2),
-                       .cdw10 = (sizeof(header2) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header2,
                },
@@ -294,8 +295,8 @@ static void test_max_retries(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header3),
-                       .cdw10 = (sizeof(header3) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header3,
                },
@@ -312,13 +313,12 @@ static void test_max_retries(nvme_ctrl_t c)
 
 static void test_header_error(nvme_ctrl_t c)
 {
-       size_t header_size = sizeof(struct nvmf_discovery_log);
        /* Stop after an error in fetching the header the first time */
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = header_size,
-                       .cdw10 = (header_size / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .err = NVME_SC_INVALID_OPCODE,
                },
@@ -339,8 +339,8 @@ static void test_entries_error(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -370,8 +370,8 @@ static void test_genctr_error(nvme_ctrl_t c)
        struct mock_cmd mock_admin_cmds[] = {
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .out_data = &header,
                },
@@ -385,8 +385,8 @@ static void test_genctr_error(nvme_ctrl_t c)
                },
                {
                        .opcode = nvme_admin_get_log_page,
-                       .data_len = sizeof(header),
-                       .cdw10 = (sizeof(header) / 4 - 1) << 16 /* NUMDL */
+                       .data_len = HEADER_LEN,
+                       .cdw10 = (HEADER_LEN / 4 - 1) << 16 /* NUMDL */
                               | NVME_LOG_LID_DISCOVER, /* LID */
                        .err = NVME_SC_INTERNAL,
                },