From dacb66d7f4164feceb53d5ddbb2b0d3a2b353177 Mon Sep 17 00:00:00 2001 From: paul luse Date: Tue, 15 Mar 2022 07:40:24 -0700 Subject: [PATCH] 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 Change-Id: Ia4aab1c6230f35ab88bb8a0e3b8e16dbd93007c7 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11947 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk --- lib/accel/accel_engine.c | 2 +- module/accel/idxd/accel_engine_idxd.c | 2 -- test/unit/lib/accel/accel.c/accel_engine_ut.c | 6 ++++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/accel/accel_engine.c b/lib/accel/accel_engine.c index 058e29ce1..c2e0e34af 100644 --- a/lib/accel/accel_engine.c +++ b/lib/accel/accel_engine.c @@ -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; diff --git a/module/accel/idxd/accel_engine_idxd.c b/module/accel/idxd/accel_engine_idxd.c index f6bf8e0af..330318501 100644 --- a/module/accel/idxd/accel_engine_idxd.c +++ b/module/accel/idxd/accel_engine_idxd.c @@ -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) { diff --git a/test/unit/lib/accel/accel.c/accel_engine_ut.c b/test/unit/lib/accel/accel.c/accel_engine_ut.c index 06eef7ccd..c98d89645 100644 --- a/test/unit/lib/accel/accel.c/accel_engine_ut.c +++ b/test/unit/lib/accel/accel.c/accel_engine_ut.c @@ -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);