From 135396b0bc02b27f747d3946872a1d0176d5d92a Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Fri, 9 Dec 2022 15:26:37 +0100 Subject: [PATCH] accel: use iovecs for dualcast operations Also, replace dst2 with an iovec + iovcnt and rename it to d2 to keep the naming consistent with the destination buffer (d). Signed-off-by: Konrad Sztyber Change-Id: Ib394c127eeb5890451535ff485f96f7edd2897a4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15938 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- include/spdk_internal/accel_module.h | 5 ++++- lib/accel/accel.c | 16 ++++++++++++---- lib/accel/accel_sw.c | 26 ++++++++++++++++++++++++-- module/accel/dsa/accel_dsa.c | 23 +++++++++++++++++++++-- test/unit/lib/accel/accel.c/accel_ut.c | 4 ---- 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/include/spdk_internal/accel_module.h b/include/spdk_internal/accel_module.h index 038540d74..17b08dfdf 100644 --- a/include/spdk_internal/accel_module.h +++ b/include/spdk_internal/accel_module.h @@ -66,7 +66,10 @@ struct spdk_accel_task { void *src2; }; union { - void *dst2; + struct { + struct iovec *iovs; + uint32_t iovcnt; + } d2; uint32_t seed; uint64_t fill_pattern; struct spdk_accel_crypto_key *crypto_key; diff --git a/lib/accel/accel.c b/lib/accel/accel.c index f7692c405..90f95f6ed 100644 --- a/lib/accel/accel.c +++ b/lib/accel/accel.c @@ -253,10 +253,18 @@ spdk_accel_submit_dualcast(struct spdk_io_channel *ch, void *dst1, return -ENOMEM; } - accel_task->src = src; - accel_task->dst = dst1; - accel_task->dst2 = dst2; - accel_task->nbytes = nbytes; + accel_task->s.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_SRC]; + accel_task->d.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_DST]; + accel_task->d2.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_DST2]; + accel_task->d.iovs[0].iov_base = dst1; + accel_task->d.iovs[0].iov_len = nbytes; + accel_task->d.iovcnt = 1; + accel_task->d2.iovs[0].iov_base = dst2; + accel_task->d2.iovs[0].iov_len = nbytes; + accel_task->d2.iovcnt = 1; + accel_task->s.iovs[0].iov_base = src; + accel_task->s.iovs[0].iov_len = nbytes; + accel_task->s.iovcnt = 1; accel_task->flags = flags; accel_task->op_code = ACCEL_OPC_DUALCAST; accel_task->src_domain = NULL; diff --git a/lib/accel/accel_sw.c b/lib/accel/accel_sw.c index 4679826e0..d4684984d 100644 --- a/lib/accel/accel_sw.c +++ b/lib/accel/accel_sw.c @@ -130,6 +130,26 @@ _sw_accel_dualcast(void *dst1, void *dst2, void *src, size_t nbytes, int flags) } } +static int +_sw_accel_dualcast_iovs(struct iovec *dst_iovs, uint32_t dst_iovcnt, + struct iovec *dst2_iovs, uint32_t dst2_iovcnt, + struct iovec *src_iovs, uint32_t src_iovcnt, int flags) +{ + if (spdk_unlikely(dst_iovcnt != 1 || dst2_iovcnt != 1 || src_iovcnt != 1)) { + return -EINVAL; + } + + if (spdk_unlikely(dst_iovs[0].iov_len != src_iovs[0].iov_len || + dst_iovs[0].iov_len != dst2_iovs[0].iov_len)) { + return -EINVAL; + } + + _sw_accel_dualcast(dst_iovs[0].iov_base, dst2_iovs[0].iov_base, src_iovs[0].iov_base, + dst_iovs[0].iov_len, flags); + + return 0; +} + static void _sw_accel_copy(void *dst, void *src, size_t nbytes, int flags) { @@ -493,8 +513,10 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_ case ACCEL_OPC_DUALCAST: rc = _check_flags(accel_task->flags); if (rc == 0) { - _sw_accel_dualcast(accel_task->dst, accel_task->dst2, accel_task->src, accel_task->nbytes, - accel_task->flags); + rc = _sw_accel_dualcast_iovs(accel_task->d.iovs, accel_task->d.iovcnt, + accel_task->d2.iovs, accel_task->d2.iovcnt, + accel_task->s.iovs, accel_task->s.iovcnt, + accel_task->flags); } break; case ACCEL_OPC_COMPARE: diff --git a/module/accel/dsa/accel_dsa.c b/module/accel/dsa/accel_dsa.c index c12d8b7ed..01607838c 100644 --- a/module/accel/dsa/accel_dsa.c +++ b/module/accel/dsa/accel_dsa.c @@ -13,6 +13,7 @@ #include "spdk/env.h" #include "spdk/event.h" +#include "spdk/likely.h" #include "spdk/thread.h" #include "spdk/idxd.h" #include "spdk/util.h" @@ -118,6 +119,25 @@ dsa_done(void *cb_arg, int status) spdk_accel_task_complete(&idxd_task->task, status); } +static int +idxd_submit_dualcast(struct idxd_io_channel *ch, struct idxd_task *idxd_task, int flags) +{ + struct spdk_accel_task *task = &idxd_task->task; + + if (spdk_unlikely(task->d.iovcnt != 1 || task->d2.iovcnt != 1 || task->s.iovcnt != 1)) { + return -EINVAL; + } + + if (spdk_unlikely(task->d.iovs[0].iov_len != task->s.iovs[0].iov_len || + task->d.iovs[0].iov_len != task->d2.iovs[0].iov_len)) { + return -EINVAL; + } + + return spdk_idxd_submit_dualcast(ch->chan, task->d.iovs[0].iov_base, + task->d2.iovs[0].iov_base, task->s.iovs[0].iov_base, + task->d.iovs[0].iov_len, flags, dsa_done, idxd_task); +} + static int _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task) { @@ -147,8 +167,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task) flags |= SPDK_IDXD_FLAG_PERSISTENT; flags |= SPDK_IDXD_FLAG_NONTEMPORAL; } - rc = spdk_idxd_submit_dualcast(chan->chan, task->dst, task->dst2, task->src, task->nbytes, - flags, dsa_done, idxd_task); + rc = idxd_submit_dualcast(chan, idxd_task, flags); break; case ACCEL_OPC_COMPARE: siov.iov_base = task->src; diff --git a/test/unit/lib/accel/accel.c/accel_ut.c b/test/unit/lib/accel/accel.c/accel_ut.c index 740dd127c..46eadffff 100644 --- a/test/unit/lib/accel/accel.c/accel_ut.c +++ b/test/unit/lib/accel/accel.c/accel_ut.c @@ -248,11 +248,7 @@ test_spdk_accel_submit_dualcast(void) /* SW module does the dualcast. */ rc = spdk_accel_submit_dualcast(g_ch, dst1, dst2, src, nbytes, flags, NULL, cb_arg); CU_ASSERT(rc == 0); - CU_ASSERT(task.dst == dst1); - CU_ASSERT(task.dst2 == dst2); - CU_ASSERT(task.src == src); CU_ASSERT(task.op_code == ACCEL_OPC_DUALCAST); - CU_ASSERT(task.nbytes == nbytes); CU_ASSERT(task.flags == 0); CU_ASSERT(memcmp(dst1, src, TEST_SUBMIT_SIZE) == 0); CU_ASSERT(memcmp(dst2, src, TEST_SUBMIT_SIZE) == 0);