From 4d1ba5f294fb35ae3048c731d8d2e825faddb1f6 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Fri, 9 Dec 2022 15:42:33 +0100 Subject: [PATCH] accel: use iovecs for compare operations Also, replace src2 with an iovec + iovcnt and rename it to s2 to keep the naming consistent with the source buffer (s). Signed-off-by: Konrad Sztyber Change-Id: I44787128377addd514818ec5aaec084b1a31f0c3 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15939 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- include/spdk_internal/accel_module.h | 5 ++++- lib/accel/accel.c | 11 ++++++++--- lib/accel/accel_sw.c | 16 +++++++++++++--- module/accel/dsa/accel_dsa.c | 8 +++----- test/unit/lib/accel/accel.c/accel_ut.c | 3 --- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/include/spdk_internal/accel_module.h b/include/spdk_internal/accel_module.h index 17b08dfdf..997a99def 100644 --- a/include/spdk_internal/accel_module.h +++ b/include/spdk_internal/accel_module.h @@ -62,8 +62,11 @@ struct spdk_accel_task { struct iovec *iovs; /* iovs passed by the caller */ uint32_t iovcnt; /* iovcnt passed by the caller */ } d; + struct { + struct iovec *iovs; + uint32_t iovcnt; + } s2; void *dst; - void *src2; }; union { struct { diff --git a/lib/accel/accel.c b/lib/accel/accel.c index 90f95f6ed..522dbfac1 100644 --- a/lib/accel/accel.c +++ b/lib/accel/accel.c @@ -290,9 +290,14 @@ spdk_accel_submit_compare(struct spdk_io_channel *ch, void *src1, return -ENOMEM; } - accel_task->src = src1; - accel_task->src2 = src2; - accel_task->nbytes = nbytes; + accel_task->s.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_SRC]; + accel_task->s2.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_SRC2]; + accel_task->s.iovs[0].iov_base = src1; + accel_task->s.iovs[0].iov_len = nbytes; + accel_task->s.iovcnt = 1; + accel_task->s2.iovs[0].iov_base = src2; + accel_task->s2.iovs[0].iov_len = nbytes; + accel_task->s2.iovcnt = 1; accel_task->op_code = ACCEL_OPC_COMPARE; accel_task->src_domain = NULL; accel_task->dst_domain = NULL; diff --git a/lib/accel/accel_sw.c b/lib/accel/accel_sw.c index d4684984d..799d3c9e0 100644 --- a/lib/accel/accel_sw.c +++ b/lib/accel/accel_sw.c @@ -195,9 +195,18 @@ _sw_accel_copyv(void *dst, struct iovec *iov, uint32_t iovcnt, int flags) } static int -_sw_accel_compare(void *src1, void *src2, size_t nbytes) +_sw_accel_compare(struct iovec *src_iovs, uint32_t src_iovcnt, + struct iovec *src2_iovs, uint32_t src2_iovcnt) { - return memcmp(src1, src2, nbytes); + if (spdk_unlikely(src_iovcnt != 1 || src2_iovcnt != 1)) { + return -EINVAL; + } + + if (spdk_unlikely(src_iovs[0].iov_len != src2_iovs[0].iov_len)) { + return -EINVAL; + } + + return memcmp(src_iovs[0].iov_base, src2_iovs[0].iov_base, src_iovs[0].iov_len); } static void @@ -520,7 +529,8 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_ } break; case ACCEL_OPC_COMPARE: - rc = _sw_accel_compare(accel_task->src, accel_task->src2, accel_task->nbytes); + rc = _sw_accel_compare(accel_task->s.iovs, accel_task->s.iovcnt, + accel_task->s2.iovs, accel_task->s2.iovcnt); break; case ACCEL_OPC_CRC32C: if (accel_task->s.iovcnt == 0) { diff --git a/module/accel/dsa/accel_dsa.c b/module/accel/dsa/accel_dsa.c index 01607838c..040cc6470 100644 --- a/module/accel/dsa/accel_dsa.c +++ b/module/accel/dsa/accel_dsa.c @@ -170,11 +170,9 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task) rc = idxd_submit_dualcast(chan, idxd_task, flags); break; case ACCEL_OPC_COMPARE: - siov.iov_base = task->src; - siov.iov_len = task->nbytes; - diov.iov_base = task->dst; - diov.iov_len = task->nbytes; - rc = spdk_idxd_submit_compare(chan->chan, &siov, 1, &diov, 1, flags, dsa_done, idxd_task); + rc = spdk_idxd_submit_compare(chan->chan, task->s.iovs, task->s.iovcnt, + task->s2.iovs, task->s2.iovcnt, flags, + dsa_done, idxd_task); break; case ACCEL_OPC_FILL: diov.iov_base = task->dst; diff --git a/test/unit/lib/accel/accel.c/accel_ut.c b/test/unit/lib/accel/accel.c/accel_ut.c index 46eadffff..3e0a5af5f 100644 --- a/test/unit/lib/accel/accel.c/accel_ut.c +++ b/test/unit/lib/accel/accel.c/accel_ut.c @@ -288,10 +288,7 @@ test_spdk_accel_submit_compare(void) /* accel submission OK. */ rc = spdk_accel_submit_compare(g_ch, src1, src2, nbytes, NULL, cb_arg); CU_ASSERT(rc == 0); - CU_ASSERT(task.src == src1); - CU_ASSERT(task.src2 == src2); CU_ASSERT(task.op_code == ACCEL_OPC_COMPARE); - CU_ASSERT(task.nbytes == nbytes); CU_ASSERT(memcmp(src1, src2, TEST_SUBMIT_SIZE) == 0); expected_accel_task = TAILQ_FIRST(&g_sw_ch->tasks_to_complete); TAILQ_REMOVE(&g_sw_ch->tasks_to_complete, expected_accel_task, link);