From a374f8ba19045f74be57141177989a0da789e2e8 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Sat, 10 Dec 2022 13:50:42 +0100 Subject: [PATCH] accel: use iovecs for copy+crc32c operations Also, since this was the last operation using src, remove this field from spdk_accel_task. Signed-off-by: Konrad Sztyber Change-Id: I55fd98697ef4f92a13dd0563b4adf9ccb0af171b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15942 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- include/spdk_internal/accel_module.h | 11 ++--- lib/accel/accel.c | 18 +++++--- lib/accel/accel_sw.c | 59 ++++++++------------------ module/accel/dsa/accel_dsa.c | 21 ++------- test/unit/lib/accel/accel.c/accel_ut.c | 4 -- 5 files changed, 36 insertions(+), 77 deletions(-) diff --git a/include/spdk_internal/accel_module.h b/include/spdk_internal/accel_module.h index 997a99def..ee69a299e 100644 --- a/include/spdk_internal/accel_module.h +++ b/include/spdk_internal/accel_module.h @@ -50,13 +50,10 @@ struct spdk_accel_task { void *src_domain_ctx; struct spdk_memory_domain *dst_domain; void *dst_domain_ctx; - union { - struct { - struct iovec *iovs; /* iovs passed by the caller */ - uint32_t iovcnt; /* iovcnt passed by the caller */ - } s; - void *src; - }; + struct { + struct iovec *iovs; /* iovs passed by the caller */ + uint32_t iovcnt; /* iovcnt passed by the caller */ + } s; union { struct { struct iovec *iovs; /* iovs passed by the caller */ diff --git a/lib/accel/accel.c b/lib/accel/accel.c index 05cef61c0..fbb5a4f35 100644 --- a/lib/accel/accel.c +++ b/lib/accel/accel.c @@ -422,12 +422,16 @@ spdk_accel_submit_copy_crc32c(struct spdk_io_channel *ch, void *dst, return -ENOMEM; } - accel_task->dst = dst; - accel_task->src = src; + 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->d.iovs[0].iov_base = dst; + accel_task->d.iovs[0].iov_len = nbytes; + accel_task->d.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->crc_dst = crc_dst; - accel_task->s.iovcnt = 0; accel_task->seed = seed; - accel_task->nbytes = nbytes; accel_task->flags = flags; accel_task->op_code = ACCEL_OPC_COPY_CRC32C; accel_task->src_domain = NULL; @@ -472,12 +476,14 @@ spdk_accel_submit_copy_crc32cv(struct spdk_io_channel *ch, void *dst, nbytes += src_iovs[i].iov_len; } + accel_task->d.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_DST]; + accel_task->d.iovs[0].iov_base = dst; + accel_task->d.iovs[0].iov_len = nbytes; + accel_task->d.iovcnt = 1; accel_task->s.iovs = src_iovs; accel_task->s.iovcnt = iov_cnt; - accel_task->dst = (void *)dst; accel_task->crc_dst = crc_dst; accel_task->seed = seed; - accel_task->nbytes = nbytes; accel_task->flags = flags; accel_task->op_code = ACCEL_OPC_COPY_CRC32C; accel_task->src_domain = NULL; diff --git a/lib/accel/accel_sw.c b/lib/accel/accel_sw.c index 119e98755..1306066c7 100644 --- a/lib/accel/accel_sw.c +++ b/lib/accel/accel_sw.c @@ -161,36 +161,19 @@ _sw_accel_copy(void *dst, void *src, size_t nbytes, int flags) } } -static int +static void _sw_accel_copy_iovs(struct iovec *dst_iovs, uint32_t dst_iovcnt, struct iovec *src_iovs, uint32_t src_iovcnt, int flags) { - if (spdk_unlikely(dst_iovcnt != 1 || src_iovcnt != 1)) { - return -EINVAL; - } + struct spdk_ioviter iter; + void *src, *dst; + size_t len; - if (spdk_unlikely(dst_iovs[0].iov_len != src_iovs[0].iov_len)) { - return -EINVAL; - } - - _sw_accel_copy(dst_iovs[0].iov_base, src_iovs[0].iov_base, dst_iovs[0].iov_len, flags); - - return 0; -} - -static void -_sw_accel_copyv(void *dst, struct iovec *iov, uint32_t iovcnt, int flags) -{ - uint32_t i; - - for (i = 0; i < iovcnt; i++) { - assert(iov[i].iov_base != NULL); - if (flags & ACCEL_FLAG_PERSISTENT) { - _pmem_memcpy(dst, iov[i].iov_base, (size_t)iov[i].iov_len); - } else { - memcpy(dst, iov[i].iov_base, (size_t)iov[i].iov_len); - } - dst += iov[i].iov_len; + for (len = spdk_ioviter_first(&iter, src_iovs, src_iovcnt, + dst_iovs, dst_iovcnt, &src, &dst); + len != 0; + len = spdk_ioviter_next(&iter, &src, &dst)) { + _sw_accel_copy(dst, src, len, flags); } } @@ -243,12 +226,6 @@ _sw_accel_fill(struct iovec *iovs, uint32_t iovcnt, uint8_t fill, int flags) return 0; } -static void -_sw_accel_crc32c(uint32_t *crc_dst, void *src, uint32_t seed, uint64_t nbytes) -{ - *crc_dst = spdk_crc32c_update(src, nbytes, ~seed); -} - static void _sw_accel_crc32cv(uint32_t *crc_dst, struct iovec *iov, uint32_t iovcnt, uint32_t seed) { @@ -520,9 +497,9 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_ case ACCEL_OPC_COPY: rc = _check_flags(accel_task->flags); if (rc == 0) { - rc = _sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt, - accel_task->s.iovs, accel_task->s.iovcnt, - accel_task->flags); + _sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt, + accel_task->s.iovs, accel_task->s.iovcnt, + accel_task->flags); } break; case ACCEL_OPC_FILL: @@ -551,13 +528,11 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_ case ACCEL_OPC_COPY_CRC32C: rc = _check_flags(accel_task->flags); if (rc == 0) { - if (accel_task->s.iovcnt == 0) { - _sw_accel_copy(accel_task->dst, accel_task->src, accel_task->nbytes, accel_task->flags); - _sw_accel_crc32c(accel_task->crc_dst, accel_task->src, accel_task->seed, accel_task->nbytes); - } else { - _sw_accel_copyv(accel_task->dst, accel_task->s.iovs, accel_task->s.iovcnt, accel_task->flags); - _sw_accel_crc32cv(accel_task->crc_dst, accel_task->s.iovs, accel_task->s.iovcnt, accel_task->seed); - } + _sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt, + accel_task->s.iovs, accel_task->s.iovcnt, + accel_task->flags); + _sw_accel_crc32cv(accel_task->crc_dst, accel_task->s.iovs, + accel_task->s.iovcnt, accel_task->seed); } break; case ACCEL_OPC_COMPRESS: diff --git a/module/accel/dsa/accel_dsa.c b/module/accel/dsa/accel_dsa.c index 647d2d54e..96ce437f7 100644 --- a/module/accel/dsa/accel_dsa.c +++ b/module/accel/dsa/accel_dsa.c @@ -143,12 +143,7 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task) { struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch); struct idxd_task *idxd_task; - int rc = 0; - struct iovec *iov; - uint32_t iovcnt; - struct iovec siov = {}; - struct iovec diov = {}; - int flags = 0; + int rc = 0, flags = 0; idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task); idxd_task->chan = chan; @@ -187,22 +182,12 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task) task->crc_dst, flags, dsa_done, idxd_task); break; case ACCEL_OPC_COPY_CRC32C: - if (task->s.iovcnt == 0) { - siov.iov_base = task->src; - siov.iov_len = task->nbytes; - iov = &siov; - iovcnt = 1; - } else { - iov = task->s.iovs; - iovcnt = task->s.iovcnt; - } - diov.iov_base = task->dst; - diov.iov_len = task->nbytes; if (task->flags & ACCEL_FLAG_PERSISTENT) { flags |= SPDK_IDXD_FLAG_PERSISTENT; flags |= SPDK_IDXD_FLAG_NONTEMPORAL; } - rc = spdk_idxd_submit_copy_crc32c(chan->chan, &diov, 1, iov, iovcnt, + rc = spdk_idxd_submit_copy_crc32c(chan->chan, task->d.iovs, task->d.iovcnt, + task->s.iovs, task->s.iovcnt, task->seed, task->crc_dst, flags, dsa_done, idxd_task); break; diff --git a/test/unit/lib/accel/accel.c/accel_ut.c b/test/unit/lib/accel/accel.c/accel_ut.c index ce7f2343b..330d0a3d8 100644 --- a/test/unit/lib/accel/accel.c/accel_ut.c +++ b/test/unit/lib/accel/accel.c/accel_ut.c @@ -444,12 +444,8 @@ test_spdk_accel_submit_copy_crc32c(void) rc = spdk_accel_submit_copy_crc32c(g_ch, dst, src, &crc_dst, seed, nbytes, flags, NULL, cb_arg); CU_ASSERT(rc == 0); - CU_ASSERT(task.dst == dst); - CU_ASSERT(task.src == src); CU_ASSERT(task.crc_dst == &crc_dst); - CU_ASSERT(task.s.iovcnt == 0); CU_ASSERT(task.seed == seed); - CU_ASSERT(task.nbytes == nbytes); CU_ASSERT(task.flags == 0); CU_ASSERT(task.op_code == ACCEL_OPC_COPY_CRC32C); expected_accel_task = TAILQ_FIRST(&g_sw_ch->tasks_to_complete);