test/nvme/aer: add changed namespace list log test

Change-Id: I2cc6c494bacbeec1ba725b4b3d78a1f4a2ed39d1
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/406166
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Changpeng Liu 2018-04-09 21:05:33 -04:00 committed by Daniel Verkamp
parent 1831b086d0
commit e9ee09f153
3 changed files with 134 additions and 45 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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