Commit 919dbe9c authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Konrad Sztyber
Browse files

test/dma: Add param to corrupt mkey



A new parameters returns invalid mkey each Nth
translation operation. As result, accel_mlx5 qp
goes to error state and triggers recovery.

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: I7f96effab7c1892839ee85c257ed2f11ffb478a4
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/23127


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent 7f76f056
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -81,4 +81,7 @@ for mode in randread randwrite randrw; do
	done
done

# Test qp recovery
"$rootdir/test/dma/test_dma/test_dma" -q 64 -o 4096 -w randrw -M 50 -t 5 -m 0xc --json <(gen_accel_mlx5_crypto_json 8) -b "Crypto0" -f -x translate -Y 1000000

trap - SIGINT SIGTERM EXIT
+17 −3
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ static uint32_t g_io_size;
static uint32_t g_run_time_sec;
static uint32_t g_run_count;
static uint32_t g_test_ops;
static uint32_t g_corrupt_mkey_counter;
static bool g_is_random;
static bool g_force_memory_domains_support;

@@ -214,7 +215,7 @@ dma_test_bdev_io_completion_cb(struct spdk_bdev_io *bdev_io, bool success, void
	--task->io_inflight;
	dma_test_task_update_stats(task, req->submit_tsc);

	if (!success) {
	if (!success && !g_corrupt_mkey_counter) {
		if (!g_run_rc) {
			fprintf(stderr, "IO completed with error\n");
			g_run_rc = -1;
@@ -347,6 +348,7 @@ dma_test_translate_memory_cb(struct spdk_memory_domain *src_domain, void *src_do
			     void *addr, size_t len, struct spdk_memory_domain_translation_result *result)
{
	struct dma_test_req *req = src_domain_ctx;
	struct dma_test_task *task = req->task;
	struct ibv_qp *dst_domain_qp = (struct ibv_qp *)dst_domain_ctx->rdma.ibv_qp;

	if (spdk_unlikely(addr < req->iov.iov_base ||
@@ -373,7 +375,14 @@ dma_test_translate_memory_cb(struct spdk_memory_domain *src_domain, void *src_do
	result->rdma.rkey = req->mr->rkey;
	result->dst_domain = dst_domain;

	req->task->num_translations++;
	if (g_corrupt_mkey_counter && task->num_translations > g_corrupt_mkey_counter &&
	    task->num_translations % g_corrupt_mkey_counter == 0) {
		SPDK_NOTICELOG("Corrupt mkey on core %u\n", task->lcore);
		result->rdma.lkey = 0xffffffff;
		result->rdma.rkey = 0xffffffff;
	}

	task->num_translations++;

	return 0;
}
@@ -816,6 +825,7 @@ print_usage(void)
	printf(" -x <op,op>        Comma separated memory domain operations expected in the test. Values are \"translate\" and \"pull_push\"\n");
	printf(" -w <str>          io pattern (read, write, randread, randwrite, randrw)\n");
	printf(" -M <0-100>        rw percentage (100 for reads, 0 for writes)\n");
	printf(" -Y <val>          Return invalid mkey each <val>th translation\n");
}

static int
@@ -866,6 +876,7 @@ parse_arg(int ch, char *arg)
	case 'o':
	case 't':
	case 'M':
	case 'Y':
		tmp = spdk_strtol(arg, 10);
		if (tmp < 0) {
			fprintf(stderr, "Invalid option %c value %s\n", ch, arg);
@@ -885,6 +896,9 @@ parse_arg(int ch, char *arg)
		case 'M':
			g_rw_percentage = (uint32_t) tmp;
			break;
		case 'Y':
			g_corrupt_mkey_counter = (uint32_t) tmp;
			break;
		}
		break;
	case 'w':
@@ -967,7 +981,7 @@ main(int argc, char **argv)
	opts.shutdown_cb = dma_test_shutdown_cb;
	opts.rpc_addr = NULL;

	rc = spdk_app_parse_args(argc, argv, &opts, "b:fq:o:t:x:w:M:", NULL, parse_arg, print_usage);
	rc = spdk_app_parse_args(argc, argv, &opts, "b:fq:o:t:x:w:M:Y:", NULL, parse_arg, print_usage);
	if (rc != SPDK_APP_PARSE_ARGS_SUCCESS) {
		exit(rc);
	}