From e9ee09f15345a2b5ed547909af3da77538eed18c Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Mon, 9 Apr 2018 21:05:33 -0400 Subject: [PATCH] test/nvme/aer: add changed namespace list log test Change-Id: I2cc6c494bacbeec1ba725b4b3d78a1f4a2ed39d1 Signed-off-by: Changpeng Liu Reviewed-on: https://review.gerrithub.io/406166 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker --- test/nvme/aer/aer.c | 127 +++++++++++++++++++++++++++++++++++++++--- test/nvmf/host/aer.sh | 49 +++++----------- test/nvmf/nvmf.sh | 3 +- 3 files changed, 134 insertions(+), 45 deletions(-) diff --git a/test/nvme/aer/aer.c b/test/nvme/aer/aer.c index e0dc7fbd1d..e090e08fce 100644 --- a/test/nvme/aer/aer.c +++ b/test/nvme/aer/aer.c @@ -42,6 +42,7 @@ struct dev { struct spdk_nvme_ctrlr *ctrlr; struct spdk_nvme_health_information_page *health_page; + struct spdk_nvme_ns_list *changed_ns_list; uint32_t orig_temp_threshold; char name[SPDK_NVMF_TRADDR_MAX_LEN + 1]; }; @@ -62,6 +63,10 @@ static struct spdk_nvme_transport_id g_trid; /* Enable AER temperature test */ static int enable_temp_test = 0; +/* Enable AER namespace attribute notice test, this variable holds + * the NSID that is expected to be in the Changed NS List. + */ +static uint32_t expected_ns_test = 0; static void set_temp_completion(void *cb_arg, const struct spdk_nvme_cpl *cpl) @@ -160,6 +165,43 @@ get_health_log_page_completion(void *cb_arg, const struct spdk_nvme_cpl *cpl) aer_done++; } +static void +get_changed_ns_log_page_completion(void *cb_arg, const struct spdk_nvme_cpl *cpl) +{ + struct dev *dev = cb_arg; + bool found = false; + uint32_t i; + + outstanding_commands --; + + if (spdk_nvme_cpl_is_error(cpl)) { + printf("%s: get log page failed\n", dev->name); + failed = 1; + return; + } + + /* Let's compare the expected namespce ID is + * in changed namespace list + */ + if (dev->changed_ns_list->ns_list[0] != 0xffffffffu) { + for (i = 0; i < sizeof(*dev->changed_ns_list) / sizeof(uint32_t); i++) { + if (expected_ns_test == dev->changed_ns_list->ns_list[i]) { + printf("%s: changed NS list contains expected NSID: %u\n", + dev->name, expected_ns_test); + found = true; + break; + } + } + } + + if (!found) { + printf("%s: Error: Cann't find expected NSID %u\n", dev->name, expected_ns_test); + failed = 1; + } + + aer_done++; +} + static int get_health_log_page(struct dev *dev) { @@ -168,6 +210,24 @@ get_health_log_page(struct dev *dev) rc = 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), 0, get_health_log_page_completion, dev); + + if (rc == 0) { + outstanding_commands++; + } + + return rc; +} + +static int +get_changed_ns_log_page(struct dev *dev) +{ + int rc; + + rc = spdk_nvme_ctrlr_cmd_get_log_page(dev->ctrlr, SPDK_NVME_LOG_CHANGED_NS_LIST, + SPDK_NVME_GLOBAL_NS_TAG, dev->changed_ns_list, + sizeof(*dev->changed_ns_list), 0, + get_changed_ns_log_page_completion, dev); + if (rc == 0) { outstanding_commands++; } @@ -184,6 +244,9 @@ cleanup(void) if (dev->health_page) { spdk_dma_free(dev->health_page); } + if (dev->changed_ns_list) { + spdk_dma_free(dev->changed_ns_list); + } } } @@ -201,12 +264,15 @@ aer_cb(void *arg, const struct spdk_nvme_cpl *cpl) printf("%s: aer_cb for log page %d\n", dev->name, log_page_id); - /* Set the temperature threshold back to the original value - * so the AER doesn't trigger again. - */ - set_temp_threshold(dev, dev->orig_temp_threshold); - - get_health_log_page(dev); + if (log_page_id == SPDK_NVME_LOG_HEALTH_INFORMATION) { + /* Set the temperature threshold back to the original value + * so the AER doesn't trigger again. + */ + set_temp_threshold(dev, dev->orig_temp_threshold); + get_health_log_page(dev); + } else if (log_page_id == SPDK_NVME_LOG_CHANGED_NS_LIST) { + get_changed_ns_log_page(dev); + } } static void @@ -216,6 +282,7 @@ usage(const char *program_name) printf("\n"); printf("options:\n"); printf(" -T enable temperature tests\n"); + printf(" -n expected Namespace attribute notice ID\n"); printf(" -r trid remote NVMe over Fabrics target address\n"); printf(" Format: 'key:value [key:value] ...'\n"); printf(" Keys:\n"); @@ -240,8 +307,11 @@ parse_args(int argc, char **argv) g_trid.trtype = SPDK_NVME_TRANSPORT_PCIE; snprintf(g_trid.subnqn, sizeof(g_trid.subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN); - while ((op = getopt(argc, argv, "r:t:H:T")) != -1) { + while ((op = getopt(argc, argv, "n:r:t:H:T")) != -1) { switch (op) { + case 'n': + expected_ns_test = atoi(optarg); + break; case 't': rc = spdk_log_set_trace_flag(optarg); if (rc < 0) { @@ -306,6 +376,11 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, printf("Allocation error (health page)\n"); failed = 1; } + dev->changed_ns_list = spdk_dma_zmalloc(sizeof(*dev->changed_ns_list), 4096, NULL); + if (dev->changed_ns_list == NULL) { + printf("Allocation error (changed namespace list page)\n"); + failed = 1; + } } static void @@ -403,6 +478,36 @@ spdk_aer_temperature_test(void) return 0; } +static int +spdk_aer_changed_ns_test(void) +{ + struct dev *dev; + + aer_done = 0; + + printf("Starting namespce attribute notice tests for all controllers...\n"); + + foreach_dev(dev) { + get_feature_test(dev); + } + + if (failed) { + return failed; + } + + while (!failed && (aer_done < num_devs)) { + foreach_dev(dev) { + spdk_nvme_ctrlr_process_admin_completions(dev->ctrlr); + } + } + + if (failed) { + return failed; + } + + return 0; +} + int main(int argc, char **argv) { struct dev *dev; @@ -418,6 +523,7 @@ int main(int argc, char **argv) spdk_env_opts_init(&opts); opts.name = "aer"; opts.core_mask = "0x1"; + opts.mem_size = 64; if (spdk_env_init(&opts) < 0) { fprintf(stderr, "Unable to initialize SPDK env\n"); return 1; @@ -446,6 +552,13 @@ int main(int argc, char **argv) } } + /* AER changed namespace list test */ + if (expected_ns_test) { + if (spdk_aer_changed_ns_test()) { + goto done; + } + } + printf("Cleaning up...\n"); while (outstanding_commands) { diff --git a/test/nvmf/host/aer.sh b/test/nvmf/host/aer.sh index 7b5f712448..28644fcdc1 100755 --- a/test/nvmf/host/aer.sh +++ b/test/nvmf/host/aer.sh @@ -16,15 +16,10 @@ if [ -z $NVMF_FIRST_TARGET_IP ]; then exit 0 fi -if check_ip_is_soft_roce $NVMF_FIRST_TARGET_IP; then - echo "Bypass AER tests for softRoCE NIC" - exit 0 -fi - timing_enter aer timing_enter start_nvmf_tgt -$NVMF_APP -c $testdir/../nvmf.conf & +$NVMF_APP -s 512 -c $testdir/../nvmf.conf & nvmfpid=$! trap "killprocess $nvmfpid; exit 1" SIGINT SIGTERM EXIT @@ -48,41 +43,23 @@ $rpc_py construct_nvmf_subsystem nqn.2016-06.io.spdk:cnode1 "trtype:RDMA traddr: # trsvcid:$NVMF_PORT \ # subnqn:nqn.2014-08.org.nvmexpress.discovery" -# Namespace Attribute Notice Tests with kernel initiator -nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -sleep 2 -sync +# Namespace Attribute Notice Tests +$rootdir/test/nvme/aer/aer -r "\ + trtype:RDMA \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2016-06.io.spdk:cnode1" -n 2 & +aerpid=$! -function get_nvme_name { - bdevs=$(lsblk -d | cut -d " " -f 1 | grep "^nvme[0-9]n2") || true -} - -bdevs="" -get_nvme_name - -if [ -n "$bdevs" ]; then - echo "Ignore adding Namespace 2 test" - $rpc_py delete_bdev Malloc0 - nvmfcleanup - killprocess $nvmfpid - exit 0 -fi +# Waiting for aer start to work +sleep 5 # Add a new namespace -$rpc_py construct_malloc_bdev 128 4096 --name Malloc1 +$rpc_py construct_malloc_bdev 64 4096 --name Malloc1 $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc1 -n 2 -sleep 3 -sync -bdevs="" -get_nvme_name - -if [ -z "$bdevs" ]; then - echo "AER for adding a Namespace test failed" - nvmfcleanup - killprocess $nvmfpid - exit 1 -fi +wait $aerpid $rpc_py delete_bdev Malloc0 $rpc_py delete_bdev Malloc1 diff --git a/test/nvmf/nvmf.sh b/test/nvmf/nvmf.sh index cf08eb564b..b923ddea38 100755 --- a/test/nvmf/nvmf.sh +++ b/test/nvmf/nvmf.sh @@ -39,8 +39,7 @@ run_test test/nvmf/host/bdevperf.sh run_test test/nvmf/host/identify.sh run_test test/nvmf/host/perf.sh run_test test/nvmf/host/identify_kernel_nvmf.sh -# Disable aer.sh for now while some intermittent failures are investigated. -#run_test test/nvmf/host/aer.sh +run_test test/nvmf/host/aer.sh run_test test/nvmf/host/fio.sh timing_exit host