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 <konrad.sztyber@intel.com> Change-Id: Ib394c127eeb5890451535ff485f96f7edd2897a4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15938 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:
parent
dee8e1f4c0
commit
135396b0bc
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user