[PATCH 3/3] accel-config/test: Use madvise(MADV_DONTNEED) to ummap address

Rex Zhang <[email protected]> Tue, 20 Feb 2024 09:58:38 +0800
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
Instead of vfio passthrough device, use madvise(MADV_DONTNEED)
to unmap source address for the operation translation fetch.

Signed-off-by: Rex Zhang <[email protected]>
---
 test/accel_test.c |   8 +--
 test/accel_test.h |   4 --
 test/iaa.c        | 179 ++--------------------------------------------
 test/iaa.h        |   2 +-
 test/iaa_test.c   |  23 ++----
 5 files changed, 13 insertions(+), 203 deletions(-)

diff --git a/test/accel_test.c b/test/accel_test.c
index 61d9944..e7f0e8e 100644
--- a/test/accel_test.c
+++ b/test/accel_test.c
@@ -479,13 +479,7 @@ void __clean_task(struct task *tsk)
 	free(tsk->desc);
 	free(tsk->comp);
 	mprotect(tsk->src1, PAGE_SIZE, PROT_READ | PROT_WRITE);
-	if (tsk->opcode != IAX_OPCODE_TRANSL_FETCH) {
-		free(tsk->src1);
-	} else {
-		munmap(tsk->src1, tsk->xfer_size);
-		close(tsk->group);
-		close(tsk->container);
-	}
+	free(tsk->src1);
 	free(tsk->src2);
 	free(tsk->dst1);
 	free(tsk->dst2);
diff --git a/test/accel_test.h b/test/accel_test.h
index fea0fe6..1402620 100644
--- a/test/accel_test.h
+++ b/test/accel_test.h
@@ -94,10 +94,6 @@ struct task {
 		uint8_t algorithm;
 		uint8_t flags;
 	} crypto_aecs;
-
-	/* Translation Fetch */
-	int container;
-	int group;
 };
 
 struct task_node {
diff --git a/test/iaa.c b/test/iaa.c
index 44eea97..6a5d37b 100644
--- a/test/iaa.c
+++ b/test/iaa.c
@@ -14,6 +14,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/mman.h>
+#include <sys/user.h>
 #include <linux/vfio.h>
 #include <accfg/libaccel_config.h>
 #include <accfg/idxd.h>
@@ -557,129 +558,12 @@ static int init_expand(struct task *tsk, int tflags,
 
 static int init_transl_fetch(struct task *tsk, int tflags, int opcode, unsigned long src1_xfer_size)
 {
-	int rc, groupid, device;
-	uint32_t pci_domain, pci_bus, pci_dev, pci_func;
-	char path[50], iommu_group_path[50], *group_num;
-	DIR *dirp;
-	struct dirent *dirf;
-	struct stat st;
-
-	struct vfio_group_status group_status = {
-		.argsz = sizeof(group_status) };
-
-	dirp = opendir("/sys/bus/pci/drivers/vfio-pci/");
-	if (!dirp) {
-		err("Failed to open /sys/bus/pci/drivers/vfio-pci\n");
-		return -errno;
-	}
-
-	while ((dirf = readdir(dirp))) {
-		if (isdigit(dirf->d_name[0])) {
-			rc = sscanf(dirf->d_name, "%04x:%02x:%02x.%x",
-				    &pci_domain, &pci_bus, &pci_dev, &pci_func);
-			if (rc != 4) {
-				err("BDF string construction failed\n");
-				closedir(dirp);
-				return -ENOMEM;
-			}
-			break;
-		}
-	}
-	closedir(dirp);
-
-	snprintf(path, sizeof(path), "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/",
-		 pci_domain, pci_bus, pci_dev, pci_func);
-	rc = stat(path, &st);
-	if (rc < 0) {
-		err("No such device: %s\n", strerror(errno));
-		return -errno;
-	}
-
-	memcpy(path + strlen(path), "iommu_group", sizeof("iommu_group"));
-
-	rc = readlink(path, iommu_group_path, sizeof(iommu_group_path));
-	if (rc <= 0) {
-		err("No iommu_group for device: %s, path %s\n", strerror(errno), path);
-		return -errno;
-	}
-
-	group_num = basename(iommu_group_path);
-	if (sscanf(group_num, "%d", &groupid) != 1) {
-		err("Unknown group %s\n", group_num);
-		return -EIO;
-	}
-
-	snprintf(path, sizeof(path), "/dev/vfio/%d", groupid);
-
-	tsk->container = open("/dev/vfio/vfio", O_RDWR);
-	if (tsk->container < 0) {
-		err("Failed to open /dev/vfio/vfio, %d (%s)\n",
-		    tsk->container, strerror(errno));
-		return -errno;
-	}
-
-	tsk->group = open(path, O_RDWR);
-	if (tsk->group < 0) {
-		err("Failed to open %s, %d (%s)\n", path, tsk->group, strerror(errno));
-		close(tsk->container);
-		return -errno;
-	}
-
-	rc = ioctl(tsk->group, VFIO_GROUP_GET_STATUS, &group_status);
-	if (rc) {
-		err("ioctl(VFIO_GROUP_GET_STATUS) failed: %s\n", strerror(errno));
-		close(tsk->group);
-		close(tsk->container);
-		return -errno;
-	}
-
-	if (!(group_status.flags & VFIO_GROUP_FLAGS_VIABLE)) {
-		close(tsk->group);
-		close(tsk->container);
-		err("Group not viable, are all devices attached to vfio?\n");
-		return -EINVAL;
-	}
-
-	rc = ioctl(tsk->group, VFIO_GROUP_SET_CONTAINER, &tsk->container);
-	if (rc) {
-		err("Failed to set group container: %s\n", strerror(errno));
-		close(tsk->group);
-		close(tsk->container);
-		return -errno;
-	}
-
-	rc = ioctl(tsk->container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU);
-	if (rc) {
-		err("Failed to set IOMMU: %s\n", strerror(errno));
-		close(tsk->group);
-		close(tsk->container);
-		return -errno;
-	}
-
-	snprintf(path, sizeof(path), "%04x:%02x:%02x.%d", pci_domain, pci_bus, pci_dev, pci_func);
-
-	device = ioctl(tsk->group, VFIO_GROUP_GET_DEVICE_FD, path);
-	if (device < 0) {
-		err("Failed to get device %s:%s\n", path, strerror(errno));
-		close(tsk->group);
-		close(tsk->container);
-		return -errno;
-	}
-
-	tsk->src1 = mmap(NULL, src1_xfer_size, PROT_READ | PROT_WRITE,
-			 MAP_PRIVATE | MAP_ANONYMOUS, device, 0);
-	if (tsk->src1 == MAP_FAILED) {
-		err("mmap failed: %s\n", strerror(errno));
-		close(tsk->group);
-		close(tsk->container);
-		return -errno;
-	}
-
+	tsk->src1 = aligned_alloc(PAGE_SIZE, src1_xfer_size);
 	tsk->opcode = opcode;
 	tsk->test_flags = tflags;
 	tsk->xfer_size = src1_xfer_size;
-	tsk->group = tsk->group;
-	tsk->container = tsk->container;
+	memset_pattern(tsk->src1, 0x0123456789abcdef, src1_xfer_size);
+	madvise(tsk->src1, src1_xfer_size, MADV_DONTNEED);
 
 	return ACCTEST_STATUS_OK;
 }
@@ -1810,70 +1694,17 @@ static int iaa_wait_transl_fetch(struct acctest_context *ctx, struct task *tsk)
 	return ACCTEST_STATUS_OK;
 }
 
-int iaa_transl_fetch_multi_task_nodes(struct acctest_context *ctx, int do_mmap)
+int iaa_transl_fetch_multi_task_nodes(struct acctest_context *ctx)
 {
 	struct task_node *tsk_node = ctx->multi_task_node;
 	int ret = ACCTEST_STATUS_OK;
 
-	struct vfio_iommu_type1_dma_map dma_map = {
-		.argsz = sizeof(dma_map) };
-	struct vfio_iommu_type1_dma_unmap dma_unmap = {
-		.argsz = sizeof(dma_unmap)
-	};
-
 	while (tsk_node) {
 		tsk_node->tsk->dflags |= (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
 		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
 			tsk_node->tsk->dflags |= IDXD_OP_FLAG_BOF;
 
 		iaa_prep_transl_fetch(tsk_node->tsk);
-
-		if (do_mmap) {
-			dma_map.vaddr = (uint64_t)tsk_node->tsk->src1;
-			dma_map.size = tsk_node->tsk->xfer_size;
-			dma_map.iova = (uint64_t)tsk_node->tsk->src1;
-			dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
-			dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-
-			ret = ioctl(tsk_node->tsk->container, VFIO_IOMMU_MAP_DMA, &dma_map);
-			if (ret) {
-				err("Failed to map memory (%s)\n", strerror(errno));
-				munmap(tsk_node->tsk->src1, tsk_node->tsk->xfer_size);
-				close(tsk_node->tsk->group);
-				close(tsk_node->tsk->container);
-				return -errno;
-			}
-			info("Mapped memory addr %p\n", tsk_node->tsk->src1);
-		} else {
-			dma_unmap.iova = (uint64_t)tsk_node->tsk->src1;
-			dma_unmap.size = tsk_node->tsk->xfer_size;
-
-			ret = ioctl(tsk_node->tsk->container, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
-			if (ret) {
-				err("Failed to unmap memory (%s)\n", strerror(errno));
-				munmap(tsk_node->tsk->src1, tsk_node->tsk->xfer_size);
-				close(tsk_node->tsk->group);
-				close(tsk_node->tsk->container);
-				return -errno;
-			}
-			info("Unmapped memory addr %p\n", tsk_node->tsk->src1);
-		}
-
-		ret = mprotect(tsk_node->tsk->src1, tsk_node->tsk->xfer_size, PROT_READ);
-		if (ret) {
-			err("mprotect1 error: %s", strerror(errno));
-			return -errno;
-		}
-
-		ret = mprotect(tsk_node->tsk->src1, tsk_node->tsk->xfer_size,
-			       PROT_READ | PROT_WRITE);
-		if (ret) {
-			err("mprotect2 error: %s", strerror(errno));
-			return -errno;
-		}
-
-		__asm__ __volatile__ ("mfence" ::: "memory");
-
 		tsk_node = tsk_node->next;
 	}
 
diff --git a/test/iaa.h b/test/iaa.h
index bbb4bad..69c5de4 100644
--- a/test/iaa.h
+++ b/test/iaa.h
@@ -26,7 +26,7 @@ int iaa_select_multi_task_nodes(struct acctest_context *ctx);
 int iaa_rle_burst_multi_task_nodes(struct acctest_context *ctx);
 int iaa_find_unique_multi_task_nodes(struct acctest_context *ctx);
 int iaa_expand_multi_task_nodes(struct acctest_context *ctx);
-int iaa_transl_fetch_multi_task_nodes(struct acctest_context *ctx, int do_mmap);
+int iaa_transl_fetch_multi_task_nodes(struct acctest_context *ctx);
 int iaa_encrypto_multi_task_nodes(struct acctest_context *ctx);
 int iaa_decrypto_multi_task_nodes(struct acctest_context *ctx);
 
diff --git a/test/iaa_test.c b/test/iaa_test.c
index 1417924..5854c64 100644
--- a/test/iaa_test.c
+++ b/test/iaa_test.c
@@ -23,7 +23,6 @@ static void usage(void)
 	"-2 <extra_flags_2> ; specified by each opcpde\n"
 	"-3 <extra_flags_3> ; specified by each opcpde\n"
 	"-a <aecs> ; specifies AECS\n"
-	"-m <map or unmap> ; specified by Translation Fetch\n"
 	"-o <opcode>     ; opcode, same value as in IAA spec\n"
 	"-d              ; wq device such as iax1/wq1.0\n"
 	"-n <number of descriptors> ;descriptor count to submit\n"
@@ -436,14 +435,14 @@ static int test_filter(struct acctest_context *ctx, size_t buf_size, int tflags,
 }
 
 static int test_transl_fetch(struct acctest_context *ctx, size_t buf_size,
-			     int tflags, uint32_t opcode, int num_desc, int do_map)
+			     int tflags, uint32_t opcode, int num_desc)
 {
 	struct task_node *tsk_node;
 	int rc = ACCTEST_STATUS_OK;
 	int itr = num_desc, i = 0, range = 0;
 
-	info("test transl-fetch: opcode %d len %#lx tflags %#x num_desc %ld do_map %d\n",
-	     opcode, buf_size, tflags, num_desc, do_map);
+	info("test transl-fetch: opcode %d len %#lx tflags %#x num_desc %ld\n",
+	     opcode, buf_size, tflags, num_desc);
 
 	ctx->is_batch = 0;
 
@@ -471,16 +470,10 @@ static int test_transl_fetch(struct acctest_context *ctx, size_t buf_size,
 
 		switch (opcode) {
 		case IAX_OPCODE_TRANSL_FETCH:
-			rc = iaa_transl_fetch_multi_task_nodes(ctx, do_map);
-			if ((tflags & TEST_FLAGS_BOF) ||
-			    ((!(tflags & TEST_FLAGS_BOF)) && do_map)) {
-				if (rc != ACCTEST_STATUS_OK)
-					return rc;
-			}
+			rc = iaa_transl_fetch_multi_task_nodes(ctx);
 
 			/* Verification of all the nodes*/
-			if ((tflags & TEST_FLAGS_BOF) ||
-			    ((!(tflags & TEST_FLAGS_BOF)) && do_map))
+			if (tflags & TEST_FLAGS_BOF)
 				rc = iaa_task_result_verify_task_nodes(ctx, 0);
 			else
 				rc = iaa_task_result_verify_task_nodes(ctx, 1);
@@ -579,7 +572,6 @@ int main(int argc, char *argv[])
 	int extra_flags_1 = 0;
 	int extra_flags_2 = 0;
 	int extra_flags_3 = 0;
-	int do_map = 0;
 	int aecs = 0;
 	int opcode = IAX_OPCODE_NOOP;
 	int opt;
@@ -612,9 +604,6 @@ int main(int argc, char *argv[])
 		case 'a':
 			aecs = strtoul(optarg, NULL, 0);
 			break;
-		case 'm':
-			do_map = strtoul(optarg, NULL, 0);
-			break;
 		case 'o':
 			opcode = strtoul(optarg, NULL, 0);
 			break;
@@ -702,7 +691,7 @@ int main(int argc, char *argv[])
 			goto error;
 		break;
 	case IAX_OPCODE_TRANSL_FETCH:
-		rc = test_transl_fetch(iaa, buf_size, tflags, opcode, num_desc, do_map);
+		rc = test_transl_fetch(iaa, buf_size, tflags, opcode, num_desc);
 		if (rc != ACCTEST_STATUS_OK)
 			goto error;
 		break;
-- 
2.25.1