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 <konrad.sztyber@intel.com> Change-Id: I55fd98697ef4f92a13dd0563b4adf9ccb0af171b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15942 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
1b566ac7d9
commit
a374f8ba19
@ -50,13 +50,10 @@ struct spdk_accel_task {
|
|||||||
void *src_domain_ctx;
|
void *src_domain_ctx;
|
||||||
struct spdk_memory_domain *dst_domain;
|
struct spdk_memory_domain *dst_domain;
|
||||||
void *dst_domain_ctx;
|
void *dst_domain_ctx;
|
||||||
union {
|
|
||||||
struct {
|
struct {
|
||||||
struct iovec *iovs; /* iovs passed by the caller */
|
struct iovec *iovs; /* iovs passed by the caller */
|
||||||
uint32_t iovcnt; /* iovcnt passed by the caller */
|
uint32_t iovcnt; /* iovcnt passed by the caller */
|
||||||
} s;
|
} s;
|
||||||
void *src;
|
|
||||||
};
|
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
struct iovec *iovs; /* iovs passed by the caller */
|
struct iovec *iovs; /* iovs passed by the caller */
|
||||||
|
@ -422,12 +422,16 @@ spdk_accel_submit_copy_crc32c(struct spdk_io_channel *ch, void *dst,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
accel_task->dst = dst;
|
accel_task->s.iovs = &accel_task->aux_iovs[SPDK_ACCEL_AUX_IOV_SRC];
|
||||||
accel_task->src = 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->crc_dst = crc_dst;
|
||||||
accel_task->s.iovcnt = 0;
|
|
||||||
accel_task->seed = seed;
|
accel_task->seed = seed;
|
||||||
accel_task->nbytes = nbytes;
|
|
||||||
accel_task->flags = flags;
|
accel_task->flags = flags;
|
||||||
accel_task->op_code = ACCEL_OPC_COPY_CRC32C;
|
accel_task->op_code = ACCEL_OPC_COPY_CRC32C;
|
||||||
accel_task->src_domain = NULL;
|
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;
|
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.iovs = src_iovs;
|
||||||
accel_task->s.iovcnt = iov_cnt;
|
accel_task->s.iovcnt = iov_cnt;
|
||||||
accel_task->dst = (void *)dst;
|
|
||||||
accel_task->crc_dst = crc_dst;
|
accel_task->crc_dst = crc_dst;
|
||||||
accel_task->seed = seed;
|
accel_task->seed = seed;
|
||||||
accel_task->nbytes = nbytes;
|
|
||||||
accel_task->flags = flags;
|
accel_task->flags = flags;
|
||||||
accel_task->op_code = ACCEL_OPC_COPY_CRC32C;
|
accel_task->op_code = ACCEL_OPC_COPY_CRC32C;
|
||||||
accel_task->src_domain = NULL;
|
accel_task->src_domain = NULL;
|
||||||
|
@ -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,
|
_sw_accel_copy_iovs(struct iovec *dst_iovs, uint32_t dst_iovcnt,
|
||||||
struct iovec *src_iovs, uint32_t src_iovcnt, int flags)
|
struct iovec *src_iovs, uint32_t src_iovcnt, int flags)
|
||||||
{
|
{
|
||||||
if (spdk_unlikely(dst_iovcnt != 1 || src_iovcnt != 1)) {
|
struct spdk_ioviter iter;
|
||||||
return -EINVAL;
|
void *src, *dst;
|
||||||
}
|
size_t len;
|
||||||
|
|
||||||
if (spdk_unlikely(dst_iovs[0].iov_len != src_iovs[0].iov_len)) {
|
for (len = spdk_ioviter_first(&iter, src_iovs, src_iovcnt,
|
||||||
return -EINVAL;
|
dst_iovs, dst_iovcnt, &src, &dst);
|
||||||
}
|
len != 0;
|
||||||
|
len = spdk_ioviter_next(&iter, &src, &dst)) {
|
||||||
_sw_accel_copy(dst_iovs[0].iov_base, src_iovs[0].iov_base, dst_iovs[0].iov_len, flags);
|
_sw_accel_copy(dst, src, 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,12 +226,6 @@ _sw_accel_fill(struct iovec *iovs, uint32_t iovcnt, uint8_t fill, int flags)
|
|||||||
return 0;
|
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
|
static void
|
||||||
_sw_accel_crc32cv(uint32_t *crc_dst, struct iovec *iov, uint32_t iovcnt, uint32_t seed)
|
_sw_accel_crc32cv(uint32_t *crc_dst, struct iovec *iov, uint32_t iovcnt, uint32_t seed)
|
||||||
{
|
{
|
||||||
@ -520,7 +497,7 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_
|
|||||||
case ACCEL_OPC_COPY:
|
case ACCEL_OPC_COPY:
|
||||||
rc = _check_flags(accel_task->flags);
|
rc = _check_flags(accel_task->flags);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
rc = _sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt,
|
_sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt,
|
||||||
accel_task->s.iovs, accel_task->s.iovcnt,
|
accel_task->s.iovs, accel_task->s.iovcnt,
|
||||||
accel_task->flags);
|
accel_task->flags);
|
||||||
}
|
}
|
||||||
@ -551,13 +528,11 @@ sw_accel_submit_tasks(struct spdk_io_channel *ch, struct spdk_accel_task *accel_
|
|||||||
case ACCEL_OPC_COPY_CRC32C:
|
case ACCEL_OPC_COPY_CRC32C:
|
||||||
rc = _check_flags(accel_task->flags);
|
rc = _check_flags(accel_task->flags);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
if (accel_task->s.iovcnt == 0) {
|
_sw_accel_copy_iovs(accel_task->d.iovs, accel_task->d.iovcnt,
|
||||||
_sw_accel_copy(accel_task->dst, accel_task->src, accel_task->nbytes, accel_task->flags);
|
accel_task->s.iovs, accel_task->s.iovcnt,
|
||||||
_sw_accel_crc32c(accel_task->crc_dst, accel_task->src, accel_task->seed, accel_task->nbytes);
|
accel_task->flags);
|
||||||
} else {
|
_sw_accel_crc32cv(accel_task->crc_dst, accel_task->s.iovs,
|
||||||
_sw_accel_copyv(accel_task->dst, accel_task->s.iovs, accel_task->s.iovcnt, accel_task->flags);
|
accel_task->s.iovcnt, accel_task->seed);
|
||||||
_sw_accel_crc32cv(accel_task->crc_dst, accel_task->s.iovs, accel_task->s.iovcnt, accel_task->seed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_COMPRESS:
|
case ACCEL_OPC_COMPRESS:
|
||||||
|
@ -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_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
||||||
struct idxd_task *idxd_task;
|
struct idxd_task *idxd_task;
|
||||||
int rc = 0;
|
int rc = 0, flags = 0;
|
||||||
struct iovec *iov;
|
|
||||||
uint32_t iovcnt;
|
|
||||||
struct iovec siov = {};
|
|
||||||
struct iovec diov = {};
|
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
idxd_task = SPDK_CONTAINEROF(task, struct idxd_task, task);
|
||||||
idxd_task->chan = chan;
|
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);
|
task->crc_dst, flags, dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
case ACCEL_OPC_COPY_CRC32C:
|
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) {
|
if (task->flags & ACCEL_FLAG_PERSISTENT) {
|
||||||
flags |= SPDK_IDXD_FLAG_PERSISTENT;
|
flags |= SPDK_IDXD_FLAG_PERSISTENT;
|
||||||
flags |= SPDK_IDXD_FLAG_NONTEMPORAL;
|
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,
|
task->seed, task->crc_dst, flags,
|
||||||
dsa_done, idxd_task);
|
dsa_done, idxd_task);
|
||||||
break;
|
break;
|
||||||
|
@ -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,
|
rc = spdk_accel_submit_copy_crc32c(g_ch, dst, src, &crc_dst, seed, nbytes, flags,
|
||||||
NULL, cb_arg);
|
NULL, cb_arg);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
CU_ASSERT(task.dst == dst);
|
|
||||||
CU_ASSERT(task.src == src);
|
|
||||||
CU_ASSERT(task.crc_dst == &crc_dst);
|
CU_ASSERT(task.crc_dst == &crc_dst);
|
||||||
CU_ASSERT(task.s.iovcnt == 0);
|
|
||||||
CU_ASSERT(task.seed == seed);
|
CU_ASSERT(task.seed == seed);
|
||||||
CU_ASSERT(task.nbytes == nbytes);
|
|
||||||
CU_ASSERT(task.flags == 0);
|
CU_ASSERT(task.flags == 0);
|
||||||
CU_ASSERT(task.op_code == ACCEL_OPC_COPY_CRC32C);
|
CU_ASSERT(task.op_code == ACCEL_OPC_COPY_CRC32C);
|
||||||
expected_accel_task = TAILQ_FIRST(&g_sw_ch->tasks_to_complete);
|
expected_accel_task = TAILQ_FIRST(&g_sw_ch->tasks_to_complete);
|
||||||
|
Loading…
Reference in New Issue
Block a user