From 30e20f42e054cc4e5aaaa23ecc75472b173cf2cf Mon Sep 17 00:00:00 2001 From: Caleb Sander Date: Tue, 1 Aug 2023 11:24:15 -0600 Subject: [PATCH] fabrics: fetch smaller Discovery Log Page header 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 --- src/nvme/fabrics.c | 11 ++++++-- test/ioctl/discovery.c | 62 +++++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index c406acf8..6617f7b6 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -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", diff --git a/test/ioctl/discovery.c b/test/ioctl/discovery.c index c62aff65..f5f6f516 100644 --- a/test/ioctl/discovery.c +++ b/test/ioctl/discovery.c @@ -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, }, -- 2.50.1