module/accel/ioat: fix bug with 'fill' handling
Fill is sent in as a uint8, we need to populate the full uint64 input with the uint8 pattern or we'll get a miscompare. This is how idxd was doing it, instead of adding the same code to ioat just move it up a layer. Signed-off-by: paul luse <paul.e.luse@intel.com> Change-Id: Ia4aab1c6230f35ab88bb8a0e3b8e16dbd93007c7 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11947 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
parent
9587ded299
commit
dacb66d7f4
@ -298,7 +298,7 @@ spdk_accel_submit_fill(struct spdk_io_channel *ch, void *dst, uint8_t fill, uint
|
||||
}
|
||||
|
||||
accel_task->dst = dst;
|
||||
accel_task->fill_pattern = fill;
|
||||
memset(&accel_task->fill_pattern, fill, sizeof(uint64_t));
|
||||
accel_task->nbytes = nbytes;
|
||||
accel_task->flags = flags;
|
||||
accel_task->op_code = ACCEL_OPCODE_MEMFILL;
|
||||
|
@ -144,7 +144,6 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
||||
{
|
||||
struct idxd_io_channel *chan = spdk_io_channel_get_ctx(ch);
|
||||
int rc = 0;
|
||||
uint8_t fill_pattern = (uint8_t)task->fill_pattern;
|
||||
struct iovec *iov;
|
||||
uint32_t iovcnt;
|
||||
struct iovec siov = {};
|
||||
@ -179,7 +178,6 @@ _process_single_task(struct spdk_io_channel *ch, struct spdk_accel_task *task)
|
||||
rc = spdk_idxd_submit_compare(chan->chan, &siov, 1, &diov, 1, flags, idxd_done, task);
|
||||
break;
|
||||
case ACCEL_OPCODE_MEMFILL:
|
||||
memset(&task->fill_pattern, fill_pattern, sizeof(uint64_t));
|
||||
diov.iov_base = task->dst;
|
||||
diov.iov_len = task->nbytes;
|
||||
if (task->flags & ACCEL_FLAG_PERSISTENT) {
|
||||
|
@ -461,6 +461,7 @@ test_spdk_accel_submit_fill(void)
|
||||
void *dst;
|
||||
void *src;
|
||||
uint8_t fill = 0xf;
|
||||
uint64_t fill64;
|
||||
uint64_t nbytes = TEST_SUBMIT_SIZE;
|
||||
void *cb_arg = NULL;
|
||||
int rc;
|
||||
@ -473,6 +474,7 @@ test_spdk_accel_submit_fill(void)
|
||||
src = calloc(1, TEST_SUBMIT_SIZE);
|
||||
SPDK_CU_ASSERT_FATAL(src != NULL);
|
||||
memset(src, fill, TEST_SUBMIT_SIZE);
|
||||
memset(&fill64, fill, sizeof(uint64_t));
|
||||
|
||||
/* Fail with no tasks on _get_task() */
|
||||
rc = spdk_accel_submit_fill(g_ch, dst, fill, nbytes, flags, dummy_submit_cb_fn, cb_arg);
|
||||
@ -492,7 +494,7 @@ test_spdk_accel_submit_fill(void)
|
||||
rc = spdk_accel_submit_fill(g_ch, dst, fill, nbytes, flags, dummy_submit_cb_fn, cb_arg);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(task.dst == dst);
|
||||
CU_ASSERT(task.fill_pattern == fill);
|
||||
CU_ASSERT(task.fill_pattern == fill64);
|
||||
CU_ASSERT(task.op_code == ACCEL_OPCODE_MEMFILL);
|
||||
CU_ASSERT(task.nbytes == nbytes);
|
||||
CU_ASSERT(task.flags == 0);
|
||||
@ -512,7 +514,7 @@ test_spdk_accel_submit_fill(void)
|
||||
rc = spdk_accel_submit_fill(g_ch, dst, fill, nbytes, flags, dummy_submit_cb_fn, cb_arg);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(task.dst == dst);
|
||||
CU_ASSERT(task.fill_pattern == fill);
|
||||
CU_ASSERT(task.fill_pattern == fill64);
|
||||
CU_ASSERT(task.op_code == ACCEL_OPCODE_MEMFILL);
|
||||
CU_ASSERT(task.nbytes == nbytes);
|
||||
CU_ASSERT(task.flags == 0);
|
||||
|
Loading…
Reference in New Issue
Block a user