nvme: add offset to spdk_nvme_ctrlr_cmd_get_log_page()

Change-Id: I1af4950995062f892062f29db85da2a8dd793d85
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2016-12-14 11:11:02 -07:00
parent 9938985766
commit d24ea9009a
10 changed files with 43 additions and 21 deletions

View File

@ -628,6 +628,7 @@ print_latency_statistics(const char *op_name, enum spdk_nvme_intel_log_page log_
SPDK_NVME_GLOBAL_NS_TAG, SPDK_NVME_GLOBAL_NS_TAG,
&ctrlr->latency_page, &ctrlr->latency_page,
sizeof(struct spdk_nvme_intel_rw_latency_page), sizeof(struct spdk_nvme_intel_rw_latency_page),
0,
enable_latency_tracking_complete, enable_latency_tracking_complete,
NULL)) { NULL)) {
printf("nvme_ctrlr_cmd_get_log_page() failed\n"); printf("nvme_ctrlr_cmd_get_log_page() failed\n");

View File

@ -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, if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_ERROR,
SPDK_NVME_GLOBAL_NS_TAG, error_page, SPDK_NVME_GLOBAL_NS_TAG, error_page,
sizeof(*error_page) * (cdata->elpe + 1), sizeof(*error_page) * (cdata->elpe + 1),
0,
get_log_page_completion, NULL)) { get_log_page_completion, NULL)) {
printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n");
exit(1); exit(1);
@ -201,7 +202,7 @@ static int
get_health_log_page(struct spdk_nvme_ctrlr *ctrlr) get_health_log_page(struct spdk_nvme_ctrlr *ctrlr)
{ {
if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, 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"); printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n");
exit(1); exit(1);
} }
@ -213,7 +214,7 @@ static int
get_intel_smart_log_page(struct spdk_nvme_ctrlr *ctrlr) 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, 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"); printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n");
exit(1); exit(1);
} }
@ -225,7 +226,7 @@ static int
get_intel_temperature_log_page(struct spdk_nvme_ctrlr *ctrlr) get_intel_temperature_log_page(struct spdk_nvme_ctrlr *ctrlr)
{ {
if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE, 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)) { get_log_page_completion, NULL)) {
printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n");
exit(1); exit(1);
@ -237,7 +238,7 @@ static int
get_intel_md_log_page(struct spdk_nvme_ctrlr *ctrlr) get_intel_md_log_page(struct spdk_nvme_ctrlr *ctrlr)
{ {
if (spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_MARKETING_DESCRIPTION, 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)) { get_log_page_completion, NULL)) {
printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n"); printf("spdk_nvme_ctrlr_cmd_get_log_page() failed\n");
exit(1); exit(1);

View File

@ -742,7 +742,7 @@ print_latency_statistics(const char *op_name, enum spdk_nvme_intel_log_page log_
while (ctrlr) { while (ctrlr) {
if (spdk_nvme_ctrlr_is_log_page_supported(ctrlr->ctrlr, log_page)) { 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, 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, enable_latency_tracking_complete,
NULL)) { NULL)) {
printf("nvme_ctrlr_cmd_get_log_page() failed\n"); printf("nvme_ctrlr_cmd_get_log_page() failed\n");

View File

@ -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 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 The pointer to the payload buffer.
* \param payload_size The size of 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_fn Callback function to invoke when the log page has been retrieved.
* \param cb_arg Argument to pass to the callback function. * \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, int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr,
uint8_t log_page, uint32_t nsid, uint8_t log_page, uint32_t nsid,
void *payload, uint32_t payload_size, void *payload, uint32_t payload_size,
uint64_t offset,
spdk_nvme_cmd_cb cb_fn, void *cb_arg); spdk_nvme_cmd_cb cb_fn, void *cb_arg);
/** /**

View File

@ -269,7 +269,7 @@ static int nvme_ctrlr_set_intel_support_log_pages(struct spdk_nvme_ctrlr *ctrlr)
status.done = false; status.done = false;
spdk_nvme_ctrlr_cmd_get_log_page(ctrlr, SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY, SPDK_NVME_GLOBAL_NS_TAG, 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, nvme_completion_poll_cb,
&status); &status);
while (status.done == false) { while (status.done == false) {

View File

@ -340,23 +340,37 @@ nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
int int
spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page, 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, uint32_t nsid, void *payload, uint32_t payload_size,
void *cb_arg) uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{ {
struct nvme_request *req; struct nvme_request *req;
struct spdk_nvme_cmd *cmd; struct spdk_nvme_cmd *cmd;
uint32_t numd, numdl, numdu; uint32_t numd, numdl, numdu;
uint32_t lpol, lpou;
int rc; int rc;
if (payload_size == 0) { if (payload_size == 0) {
return -EINVAL; return -EINVAL;
} }
if (offset & 3) {
return -EINVAL;
}
numd = payload_size / sizeof(uint32_t) - 1u; numd = payload_size / sizeof(uint32_t) - 1u;
numdl = numd & 0xFFFFu; numdl = numd & 0xFFFFu;
numdu = (numd >> 16) & 0xFFFFu; numdu = (numd >> 16) & 0xFFFFu;
lpol = (uint32_t)offset;
lpou = (uint32_t)(offset >> 32);
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); 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); req = nvme_allocate_request_user_copy(payload, payload_size, cb_fn, cb_arg, false);
if (req == NULL) { if (req == NULL) {
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); 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 = numdl << 16;
cmd->cdw10 |= log_page; cmd->cdw10 |= log_page;
cmd->cdw11 = numdu; cmd->cdw11 = numdu;
cmd->cdw12 = lpol;
cmd->cdw13 = lpou;
rc = nvme_ctrlr_submit_admin_request(ctrlr, req); rc = nvme_ctrlr_submit_admin_request(ctrlr, req);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);

View File

@ -1082,7 +1082,7 @@ nvme_fabrics_get_log_discovery_page(struct spdk_nvme_ctrlr *ctrlr,
int rc; int rc;
status.done = false; 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); nvme_completion_poll_cb, &status);
if (rc < 0) { if (rc < 0) {
return -1; return -1;

View File

@ -146,7 +146,7 @@ static int
get_health_log_page(struct dev *dev) get_health_log_page(struct dev *dev)
{ {
return spdk_nvme_ctrlr_cmd_get_log_page(dev->ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, 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); get_log_page_completion, dev);
} }

View File

@ -206,8 +206,8 @@ spdk_nvme_ctrlr_cmd_get_feature(struct spdk_nvme_ctrlr *ctrlr, uint8_t feature,
int int
spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page, 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, uint32_t nsid, void *payload, uint32_t payload_size,
void *cb_arg) uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{ {
fake_cpl_success(cb_fn, cb_arg); fake_cpl_success(cb_fn, cb_arg);
return 0; return 0;

View File

@ -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, spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_FIRMWARE_SLOT, SPDK_NVME_GLOBAL_NS_TAG,
&payload, &payload,
sizeof(payload), NULL, NULL); sizeof(payload), 0, NULL, NULL);
} }
static void 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, spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_HEALTH_INFORMATION, health_log_nsid,
&payload, &payload,
sizeof(payload), NULL, NULL); sizeof(payload), 0, NULL, NULL);
} }
static void static void
@ -344,7 +344,7 @@ test_error_get_log_page(void)
/* valid page */ /* valid page */
error_num_entries = 1; error_num_entries = 1;
spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_LOG_ERROR, SPDK_NVME_GLOBAL_NS_TAG, &payload, 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) 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; verify_fn = verify_intel_smart_log_page;
spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_SMART, health_log_nsid, &payload, 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) 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; 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, 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) 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_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_READ_CMD_LATENCY,
SPDK_NVME_GLOBAL_NS_TAG, 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) 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_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_WRITE_CMD_LATENCY,
SPDK_NVME_GLOBAL_NS_TAG, 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) 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_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY,
SPDK_NVME_GLOBAL_NS_TAG, 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) 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_ctrlr_cmd_get_log_page(&ctrlr, SPDK_NVME_INTEL_MARKETING_DESCRIPTION,
SPDK_NVME_GLOBAL_NS_TAG, SPDK_NVME_GLOBAL_NS_TAG,
&payload, sizeof(payload), NULL, NULL); &payload, sizeof(payload), 0, NULL, NULL);
} }
static void test_generic_get_log_pages(void) static void test_generic_get_log_pages(void)