[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