bdev/compress: Verify mbuf chain if the driver doesn't suppot SGL

With recent changes libreduce should provide correct buffers
if the driver doesn't support SGL in/out. This patch verifies
that we don't use SGLs when they are not supported.
Since even a single buffer can be split on 2MB page
boundary, it is not enough just to check iovs count.

Added asserts that the first elements of mbufs are
not null to avoid scan build errors

Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com>
Change-Id: I620e43bf5b1abd25cab412fe08346a6d767c9be9
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11973
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
Alexey Marchuk 2022-03-15 20:57:35 +04:00 committed by Tomasz Zawadzki
parent 731ddc7107
commit f530abcab3
2 changed files with 70 additions and 11 deletions

View File

@ -565,6 +565,7 @@ _compress_operation(struct spdk_reduce_backing_dev *backing_dev, struct iovec *s
rc = -ENOMEM;
goto error_get_src;
}
assert(src_mbufs[0]);
rc = rte_pktmbuf_alloc_bulk(g_mbuf_mp, (struct rte_mbuf **)&dst_mbufs[0], dst_iovcnt);
if (rc) {
@ -572,28 +573,48 @@ _compress_operation(struct spdk_reduce_backing_dev *backing_dev, struct iovec *s
rc = -ENOMEM;
goto error_get_dst;
}
assert(dst_mbufs[0]);
/* There is a 1:1 mapping between a bdev_io and a compression operation, but
* all compression PMDs that SPDK uses support chaining so build our mbuf chain
* and associate with our single comp_op.
/* There is a 1:1 mapping between a bdev_io and a compression operation
* Some PMDs that SPDK uses don't support chaining, but reduce library should
* provide correct buffers
* Build our mbuf chain and associate it with our single comp_op.
*/
rc = _setup_compress_mbuf(&src_mbufs[0], &src_mbuf_total, &total_length,
rc = _setup_compress_mbuf(src_mbufs, &src_mbuf_total, &total_length,
src_iovs, src_iovcnt, reduce_cb_arg);
if (rc < 0) {
goto error_src_dst;
}
if (!comp_bdev->backing_dev.sgl_in && src_mbufs[0]->next != NULL) {
if (src_iovcnt == 1) {
SPDK_ERRLOG("Src buffer crosses 2MB boundary but driver %s doesn't support SGL input\n",
comp_bdev->drv_name);
} else {
SPDK_ERRLOG("Driver %s doesn't support SGL input\n", comp_bdev->drv_name);
}
rc = -EINVAL;
goto error_src_dst;
}
comp_op->m_src = src_mbufs[0];
comp_op->src.offset = 0;
comp_op->src.length = total_length;
/* setup dst mbufs, for the current test being used with this code there's only one vector */
rc = _setup_compress_mbuf(&dst_mbufs[0], &dst_mbuf_total, NULL,
rc = _setup_compress_mbuf(dst_mbufs, &dst_mbuf_total, NULL,
dst_iovs, dst_iovcnt, reduce_cb_arg);
if (rc < 0) {
goto error_src_dst;
}
if (!comp_bdev->backing_dev.sgl_out && dst_mbufs[0]->next != NULL) {
if (dst_iovcnt == 1) {
SPDK_ERRLOG("Dst buffer crosses 2MB boundary but driver %s doesn't support SGL output\n",
comp_bdev->drv_name);
} else {
SPDK_ERRLOG("Driver %s doesn't support SGL output\n", comp_bdev->drv_name);
}
rc = -EINVAL;
goto error_src_dst;
}
comp_op->m_dst = dst_mbufs[0];
comp_op->dst.offset = 0;

View File

@ -468,15 +468,12 @@ rte_compressdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id, struct rte_comp_op
case FAKE_ENQUEUE_BUSY:
op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
return 0;
break;
case FAKE_ENQUEUE_SUCCESS:
op->status = RTE_COMP_OP_STATUS_SUCCESS;
return 1;
break;
case FAKE_ENQUEUE_ERROR:
op->status = RTE_COMP_OP_STATUS_ERROR;
return 0;
break;
default:
break;
}
@ -501,7 +498,6 @@ rte_compressdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id, struct rte_comp_op
ut_boundary_alloc = false;
}
for (i = 0; i < num_src_mbufs; i++) {
CU_ASSERT(op_mbuf[i]->buf_addr == exp_mbuf[i]->buf_addr);
CU_ASSERT(op_mbuf[i]->buf_iova == exp_mbuf[i]->buf_iova);
@ -546,6 +542,7 @@ test_setup(void)
thread = spdk_thread_create(NULL, NULL);
spdk_set_thread(thread);
g_comp_bdev.drv_name = "test";
g_comp_bdev.reduce_thread = thread;
g_comp_bdev.backing_dev.unmap = _comp_reduce_unmap;
g_comp_bdev.backing_dev.readv = _comp_reduce_readv;
@ -554,6 +551,8 @@ test_setup(void)
g_comp_bdev.backing_dev.decompress = _comp_reduce_decompress;
g_comp_bdev.backing_dev.blocklen = 512;
g_comp_bdev.backing_dev.blockcnt = 1024 * 16;
g_comp_bdev.backing_dev.sgl_in = true;
g_comp_bdev.backing_dev.sgl_out = true;
g_comp_bdev.device_qp = &g_device_qp;
g_comp_bdev.device_qp->device = &g_device;
@ -758,6 +757,25 @@ test_compress_operation(void)
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
CU_ASSERT(rc == 0);
/* test sgl out failure */
g_comp_bdev.backing_dev.sgl_out = false;
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
rc = _compress_operation(&g_comp_bdev.backing_dev, &src_iovs[0], 1,
&dst_iovs[0], dst_iovcnt, true, &cb_arg);
CU_ASSERT(rc == -EINVAL);
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
g_comp_bdev.backing_dev.sgl_out = true;
/* test sgl in failure */
g_comp_bdev.backing_dev.sgl_in = false;
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
rc = _compress_operation(&g_comp_bdev.backing_dev, &src_iovs[0], src_iovcnt,
&dst_iovs[0], 1, true, &cb_arg);
CU_ASSERT(rc == -EINVAL);
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
g_comp_bdev.backing_dev.sgl_in = true;
}
static void
@ -902,6 +920,26 @@ test_compress_operation_cross_boundary(void)
&dst_iovs[0], dst_iovcnt, false, &cb_arg);
CU_ASSERT(TAILQ_EMPTY(&g_comp_bdev.queued_comp_ops) == true);
CU_ASSERT(rc == 0);
/* Single input iov is split on page boundary, sgl_in is not supported */
g_comp_bdev.backing_dev.sgl_in = false;
g_small_size_counter = 0;
g_small_size_modify = 1;
g_small_size = 0x800;
rc = _compress_operation(&g_comp_bdev.backing_dev, src_iovs, 1,
dst_iovs, 1, false, &cb_arg);
CU_ASSERT(rc == -EINVAL);
g_comp_bdev.backing_dev.sgl_in = true;
/* Single output iov is split on page boundary, sgl_out is not supported */
g_comp_bdev.backing_dev.sgl_out = false;
g_small_size_counter = 0;
g_small_size_modify = 2;
g_small_size = 0x800;
rc = _compress_operation(&g_comp_bdev.backing_dev, src_iovs, 1,
dst_iovs, 1, false, &cb_arg);
CU_ASSERT(rc == -EINVAL);
g_comp_bdev.backing_dev.sgl_out = true;
}
static void