From d24ea9009a42eb214674224ea2d66b10b1f9e61e Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 14 Dec 2016 11:11:02 -0700 Subject: [PATCH] nvme: add offset to spdk_nvme_ctrlr_cmd_get_log_page() Change-Id: I1af4950995062f892062f29db85da2a8dd793d85 Signed-off-by: Daniel Verkamp --- examples/nvme/arbitration/arbitration.c | 1 + examples/nvme/identify/identify.c | 9 +++++---- examples/nvme/perf/perf.c | 2 +- include/spdk/nvme.h | 4 ++++ lib/nvme/nvme_ctrlr.c | 2 +- lib/nvme/nvme_ctrlr_cmd.c | 20 +++++++++++++++++-- lib/nvme/nvme_rdma.c | 2 +- test/lib/nvme/aer/aer.c | 2 +- .../nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c | 4 ++-- .../unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut.c | 18 ++++++++--------- 10 files changed, 43 insertions(+), 21 deletions(-) diff --git a/examples/nvme/arbitration/arbitration.c b/examples/nvme/arbitration/arbitration.c index 6d9cf5417..6b53fd908 100644 --- a/examples/nvme/arbitration/arbitration.c +++ b/examples/nvme/arbitration/arbitration.c @@ -628,6 +628,7 @@ print_latency_statistics(const char *op_name, enum spdk_nvme_intel_log_page log_ SPDK_NVME_GLOBAL_NS_TAG, &ctrlr->latency_page, sizeof(struct spdk_nvme_intel_rw_latency_page), + 0, enable_latency_tracking_complete, NULL)) { printf("nvme_ctrlr_cmd_get_log_page() failed\n"); diff --git a/examples/nvme/identify/identify.c b/examples/nvme/identify/identify.c index f36e75673..98dda4040 100644 --- a/examples/nvme/identify/identify.c +++ b/examples/nvme/identify/identify.c @@ -189,6 +189,7 @@ get_error_log_page(struct spdk_nvme_ctrlr *ctrlr) if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_ERROR, SPDK_NVME_GLOBAL_NS_TAG, error_page, sizeof(*error_page) * (cdata->elpe + 1), + 0, get_log_page_completion, NULL)) { printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); exit(1); @@ -201,7 +202,7 @@ static int get_health_log_page(struct spdk_nvme_ctrlr *ctrlr) { if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, - SPDK_NVME_GLOBAL_NS_TAG, &health_page, sizeof(health_page), get_log_page_completion, NULL)) { + SPDK_NVME_GLOBAL_NS_TAG, &health_page, sizeof(health_page), 0, get_log_page_completion, NULL)) { printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); exit(1); } @@ -213,7 +214,7 @@ static int get_intel_smart_log_page(struct spdk_nvme_ctrlr *ctrlr) { if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_LOG_SMART, SPDK_NVME_GLOBAL_NS_TAG, - &intel_smart_page, sizeof(intel_smart_page), get_log_page_completion, NULL)) { + &intel_smart_page, sizeof(intel_smart_page), 0, get_log_page_completion, NULL)) { printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); exit(1); } @@ -225,7 +226,7 @@ static int get_intel_temperature_log_page(struct spdk_nvme_ctrlr *ctrlr) { if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE, - SPDK_NVME_GLOBAL_NS_TAG, &intel_temperature_page, sizeof(intel_temperature_page), + SPDK_NVME_GLOBAL_NS_TAG, &intel_temperature_page, sizeof(intel_temperature_page), 0, get_log_page_completion, NULL)) { printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); exit(1); @@ -237,7 +238,7 @@ static int get_intel_md_log_page(struct spdk_nvme_ctrlr *ctrlr) { if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_MARKETING_DESCRIPTION, - SPDK_NVME_GLOBAL_NS_TAG, &intel_md_page, sizeof(intel_md_page), + SPDK_NVME_GLOBAL_NS_TAG, &intel_md_page, sizeof(intel_md_page), 0, get_log_page_completion, NULL)) { printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); exit(1); diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index ef38290b7..9eba8ee74 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -742,7 +742,7 @@ print_latency_statistics(const char *op_name, enum spdk_nvme_intel_log_page log_ while (ctrlr) { if (spdk_nvme_ctrlr_is_log_page_supported(ctrlr->ctrlr, log_page)) { if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr->ctrlr, log_page, SPDK_NVME_GLOBAL_NS_TAG, - ctrlr->latency_page, sizeof(struct spdk_nvme_intel_rw_latency_page), + ctrlr->latency_page, sizeof(struct spdk_nvme_intel_rw_latency_page), 0, enable_latency_tracking_complete, NULL)) { printf("nvme_ctrlr_cmd_get_log_page() failed\n"); diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 6e94bcb0a..5c19374b2 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -517,6 +517,9 @@ struct spdk_nvme_ns *spdk_nvme_ctrlr_get_ns(struct spdk_nvme_ctrlr *ctrlr, uint3 * \param nsid Depending on the log page, this may be 0, a namespace identifier, or SPDK_NVME_GLOBAL_NS_TAG. * \param payload The pointer to the payload buffer. * \param payload_size The size of payload buffer. + * \param offset Offset in bytes within the log page to start retrieving log page data. + * May only be non-zero if the controller supports extended data for Get Log Page + * as reported in the controller data log page attributes. * \param cb_fn Callback function to invoke when the log page has been retrieved. * \param cb_arg Argument to pass to the callback function. * @@ -533,6 +536,7 @@ struct spdk_nvme_ns *spdk_nvme_ctrlr_get_ns(struct spdk_nvme_ctrlr *ctrlr, uint3 int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page, uint32_t nsid, void *payload, uint32_t payload_size, + uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg); /** diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 36268d212..b5ab2c0f2 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -269,7 +269,7 @@ static int nvme_ctrlr_set_intel_support_log_pages(struct spdk_nvme_ctrlr *ctrlr) status.done = false; spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY, SPDK_NVME_GLOBAL_NS_TAG, - log_page_directory, sizeof(struct spdk_nvme_intel_log_page_directory), + log_page_directory, sizeof(struct spdk_nvme_intel_log_page_directory), 0, nvme_completion_poll_cb, &status); while (status.done == false) { diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index ce74b24ca..8d3ccb0ee 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -340,23 +340,37 @@ nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page, - uint32_t nsid, void *payload, uint32_t payload_size, spdk_nvme_cmd_cb cb_fn, - void *cb_arg) + uint32_t nsid, void *payload, uint32_t payload_size, + uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { struct nvme_request *req; struct spdk_nvme_cmd *cmd; uint32_t numd, numdl, numdu; + uint32_t lpol, lpou; int rc; if (payload_size == 0) { return -EINVAL; } + if (offset & 3) { + return -EINVAL; + } + numd = payload_size / sizeof(uint32_t) - 1u; numdl = numd & 0xFFFFu; numdu = (numd >> 16) & 0xFFFFu; + lpol = (uint32_t)offset; + lpou = (uint32_t)(offset >> 32); + nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); + + if (offset && !ctrlr->cdata.lpa.edlp) { + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + return -EINVAL; + } + req = nvme_allocate_request_user_copy(payload, payload_size, cb_fn, cb_arg, false); if (req == NULL) { nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); @@ -369,6 +383,8 @@ spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page cmd->cdw10 = numdl << 16; cmd->cdw10 |= log_page; cmd->cdw11 = numdu; + cmd->cdw12 = lpol; + cmd->cdw13 = lpou; rc = nvme_ctrlr_submit_admin_request(ctrlr, req); nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index a9cc5947d..1c6fa3c7f 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1082,7 +1082,7 @@ nvme_fabrics_get_log_discovery_page(struct spdk_nvme_ctrlr *ctrlr, int rc; status.done = false; - rc = spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_DISCOVERY, 0, log_page, size, + rc = spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_DISCOVERY, 0, log_page, size, 0, nvme_completion_poll_cb, &status); if (rc < 0) { return -1; diff --git a/test/lib/nvme/aer/aer.c b/test/lib/nvme/aer/aer.c index 7f05607b4..052c021f5 100644 --- a/test/lib/nvme/aer/aer.c +++ b/test/lib/nvme/aer/aer.c @@ -146,7 +146,7 @@ static int get_health_log_page(struct dev *dev) { return spdk_nvme_ctrlr_cmd_get_log_page(dev->ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, - SPDK_NVME_GLOBAL_NS_TAG, dev->health_page, sizeof(*dev->health_page), + SPDK_NVME_GLOBAL_NS_TAG, dev->health_page, sizeof(*dev->health_page), 0, get_log_page_completion, dev); } diff --git a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c index 98235f30b..e24f6e8cd 100644 --- a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +++ b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c @@ -206,8 +206,8 @@ spdk_nvme_ctrlr_cmd_get_feature(struct spdk_nvme_ctrlr *ctrlr, uint8_t feature, int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page, - uint32_t nsid, void *payload, uint32_t payload_size, spdk_nvme_cmd_cb cb_fn, - void *cb_arg) + uint32_t nsid, void *payload, uint32_t payload_size, + uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { fake_cpl_success(cb_fn, cb_arg); return 0; diff --git a/test/lib/nvme/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut.c b/test/lib/nvme/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut.c index 5ae0f189a..cf7657878 100644 --- a/test/lib/nvme/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut.c +++ b/test/lib/nvme/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut.c @@ -315,7 +315,7 @@ test_firmware_get_log_page(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_FIRMWARE_SLOT, SPDK_NVME_GLOBAL_NS_TAG, &payload, - sizeof(payload), NULL, NULL); + sizeof(payload), 0, NULL, NULL); } static void @@ -328,7 +328,7 @@ test_health_get_log_page(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, health_log_nsid, &payload, - sizeof(payload), NULL, NULL); + sizeof(payload), 0, NULL, NULL); } static void @@ -344,7 +344,7 @@ test_error_get_log_page(void) /* valid page */ error_num_entries = 1; spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_ERROR, SPDK_NVME_GLOBAL_NS_TAG, &payload, - sizeof(payload), NULL, NULL); + sizeof(payload), 0, NULL, NULL); } static void test_intel_smart_get_log_page(void) @@ -355,7 +355,7 @@ static void test_intel_smart_get_log_page(void) verify_fn = verify_intel_smart_log_page; spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_SMART, health_log_nsid, &payload, - sizeof(payload), NULL, NULL); + sizeof(payload), 0, NULL, NULL); } static void test_intel_temperature_get_log_page(void) @@ -366,7 +366,7 @@ static void test_intel_temperature_get_log_page(void) verify_fn = verify_intel_temperature_log_page; spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE, SPDK_NVME_GLOBAL_NS_TAG, - &payload, sizeof(payload), NULL, NULL); + &payload, sizeof(payload), 0, NULL, NULL); } static void test_intel_read_latency_get_log_page(void) @@ -378,7 +378,7 @@ static void test_intel_read_latency_get_log_page(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_READ_CMD_LATENCY, SPDK_NVME_GLOBAL_NS_TAG, - &payload, sizeof(payload), NULL, NULL); + &payload, sizeof(payload), 0, NULL, NULL); } static void test_intel_write_latency_get_log_page(void) @@ -390,7 +390,7 @@ static void test_intel_write_latency_get_log_page(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_WRITE_CMD_LATENCY, SPDK_NVME_GLOBAL_NS_TAG, - &payload, sizeof(payload), NULL, NULL); + &payload, sizeof(payload), 0, NULL, NULL); } static void test_intel_get_log_page_directory(void) @@ -402,7 +402,7 @@ static void test_intel_get_log_page_directory(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY, SPDK_NVME_GLOBAL_NS_TAG, - &payload, sizeof(payload), NULL, NULL); + &payload, sizeof(payload), 0, NULL, NULL); } static void test_intel_marketing_description_get_log_page(void) @@ -414,7 +414,7 @@ static void test_intel_marketing_description_get_log_page(void) spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_MARKETING_DESCRIPTION, SPDK_NVME_GLOBAL_NS_TAG, - &payload, sizeof(payload), NULL, NULL); + &payload, sizeof(payload), 0, NULL, NULL); } static void test_generic_get_log_pages(void)