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 <konrad.sztyber@intel.com>
Change-Id: I44787128377addd514818ec5aaec084b1a31f0c3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15939
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Konrad Sztyber 2022-12-09 15:42:33 +01:00 committed by Tomasz Zawadzki
parent 135396b0bc
commit 4d1ba5f294
5 changed files with 28 additions and 15 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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);