* [dpdk-dev] [PATCH 1/2] compress/qat: overflow catching @ 2019-09-06 11:11 Artur Trybula 2019-09-06 11:11 ` [dpdk-dev] [PATCH 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula 0 siblings, 2 replies; 16+ messages in thread From: Artur Trybula @ 2019-09-06 11:11 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal Out-of-space recoverable feature added to QuickAssist compressdev driver Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- drivers/compress/qat/qat_comp.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/compress/qat/qat_comp.c b/drivers/compress/qat/qat_comp.c index 835aaa838..aa43df6b1 100644 --- a/drivers/compress/qat/qat_comp.c +++ b/drivers/compress/qat/qat_comp.c @@ -259,10 +259,29 @@ qat_comp_process_response(void **op, uint8_t *resp, void *op_cookie, (!cmp_err_code && xlat_err_code == ERR_CODE_OVERFLOW_ERROR) || (cmp_err_code == ERR_CODE_OVERFLOW_ERROR && - xlat_err_code == ERR_CODE_OVERFLOW_ERROR)) - rx_op->status = + xlat_err_code == ERR_CODE_OVERFLOW_ERROR)) { + + struct icp_qat_fw_resp_comp_pars *comp_resp = + (struct icp_qat_fw_resp_comp_pars *)&resp_msg->comp_resp_pars; + + if (comp_resp->input_byte_counter) { + if ((qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_FIXED_COMP_STATELESS) || + (qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS)) { + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; + rx_op->consumed = + comp_resp->input_byte_counter; + rx_op->produced = + comp_resp->output_byte_counter; + } else + rx_op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; - else + } else + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; + } else rx_op->status = RTE_COMP_OP_STATUS_ERROR; ++(*dequeue_err_count); -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH 2/2] test/compress: unit test for stateless overflow recovery 2019-09-06 11:11 [dpdk-dev] [PATCH 1/2] compress/qat: overflow catching Artur Trybula @ 2019-09-06 11:11 ` Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula 1 sibling, 0 replies; 16+ messages in thread From: Artur Trybula @ 2019-09-06 11:11 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal Added unit test to check out-of-space recoverable feature. Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- app/test/test_compressdev.c | 264 +++++++++++++++++++++++++++++------- 1 file changed, 216 insertions(+), 48 deletions(-) diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c index 992eac8e0..3a655164f 100644 --- a/app/test/test_compressdev.c +++ b/app/test/test_compressdev.c @@ -30,6 +30,7 @@ * due to the compress block headers */ #define COMPRESS_BUF_SIZE_RATIO 1.3 +#define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2 #define NUM_LARGE_MBUFS 16 #define SMALL_SEG_SIZE 256 #define MAX_SEGS 16 @@ -65,6 +66,12 @@ enum zlib_direction { ZLIB_ALL }; +enum overflow_test { + OVERFLOW_DISABLED, + OVERFLOW_ENABLED +}; + + enum varied_buff { LB_BOTH = 0, /* both input and output are linear*/ SGL_BOTH, /* both input and output are chained */ @@ -100,6 +107,7 @@ struct test_data_params { enum zlib_direction zlib_dir; unsigned int out_of_space; unsigned int big_data; + enum overflow_test overflow; }; static struct comp_testsuite_params testsuite_params = { 0 }; @@ -644,6 +652,7 @@ prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf, data_size = remaining_data; else data_size = seg_size; + buf_ptr = rte_pktmbuf_append(head_buf, data_size); if (buf_ptr == NULL) { RTE_LOG(ERR, USER1, @@ -710,6 +719,50 @@ prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf, return 0; } + +static int +test_run_enqueue_dequeue(struct rte_comp_op **ops, unsigned int num_bufs, + struct rte_comp_op **ops_processed) +{ + uint16_t num_enqd, num_deqd, num_total_deqd; + unsigned int deqd_retries = 0; + + /* Enqueue and dequeue all operations */ + num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); + if (num_enqd < num_bufs) { + RTE_LOG(ERR, USER1, + "Some operations could not be enqueued\n"); + return -1; + } + + num_total_deqd = 0; + do { + /* + * If retrying a dequeue call, wait for 10 ms to allow + * enough time to the driver to process the operations + */ + if (deqd_retries != 0) { + /* + * Avoid infinite loop if not all the + * operations get out of the device + */ + if (deqd_retries == MAX_DEQD_RETRIES) { + RTE_LOG(ERR, USER1, + "Not all operations could be dequeued\n"); + return -1; + } + usleep(DEQUEUE_WAIT_TIME); + } + num_deqd = rte_compressdev_dequeue_burst(0, 0, + &ops_processed[num_total_deqd], num_bufs); + num_total_deqd += num_deqd; + deqd_retries++; + + } while (num_total_deqd < num_enqd); + + return 0; +} + /* * Compresses and decompresses buffer with compressdev API and Zlib API */ @@ -729,6 +782,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, unsigned int out_of_space = test_data->out_of_space; unsigned int big_data = test_data->big_data; enum zlib_direction zlib_dir = test_data->zlib_dir; + enum overflow_test overflow_tst = test_data->overflow; int ret_status = -1; int ret; struct rte_mbuf *uncomp_bufs[num_bufs]; @@ -754,6 +808,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); char *contig_buf = NULL; uint64_t compress_checksum[num_bufs]; + uint32_t compressed_data_size[num_bufs]; if (capa == NULL) { RTE_LOG(ERR, USER1, @@ -767,6 +822,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, memset(ops, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(ops_processed, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(priv_xforms, 0, sizeof(void *) * num_bufs); + memset(compressed_data_size, 0, sizeof(uint32_t) * num_bufs); if (big_data) buf_pool = ts_params->big_mbuf_pool; @@ -799,7 +855,13 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, } else { for (i = 0; i < num_bufs; i++) { data_size = strlen(test_bufs[i]) + 1; + buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the source mbuf failed\n"); + goto exit; + } strlcpy(buf_ptr, test_bufs[i], data_size); } } @@ -835,11 +897,22 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space == 1 && oos_zlib_decompress) data_size = OUT_OF_SPACE_BUF; - else - (data_size = strlen(test_bufs[i]) * - COMPRESS_BUF_SIZE_RATIO); - - rte_pktmbuf_append(comp_bufs[i], data_size); + else { + float ratio = + ((test_data->zlib_dir == ZLIB_DECOMPRESS || + test_data->zlib_dir == ZLIB_NONE) && + overflow_tst == OVERFLOW_ENABLED) ? + COMPRESS_BUF_SIZE_RATIO_OVERFLOW : + COMPRESS_BUF_SIZE_RATIO; + + data_size = strlen(test_bufs[i]) * ratio; + } + buf_ptr = rte_pktmbuf_append(comp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the destination mbuf failed\n"); + goto exit; + } } } @@ -852,7 +925,6 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, goto exit; } - for (i = 0; i < num_bufs; i++) { ops[i]->m_src = uncomp_bufs[i]; ops[i]->m_dst = comp_bufs[i]; @@ -928,41 +1000,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) ops[i]->private_xform = priv_xforms[i]; } - - /* Enqueue and dequeue all operations */ - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); - if (num_enqd < num_bufs) { +recovery_lb: + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); + if (ret < 0) { RTE_LOG(ERR, USER1, - "The operations could not be enqueued\n"); + "Enqueue/dequeue operation failed\n"); goto exit; } - num_total_deqd = 0; - do { - /* - * If retrying a dequeue call, wait for 10 ms to allow - * enough time to the driver to process the operations - */ - if (deqd_retries != 0) { - /* - * Avoid infinite loop if not all the - * operations get out of the device - */ - if (deqd_retries == MAX_DEQD_RETRIES) { + for (i = 0; i < num_bufs; i++) { + compressed_data_size[i] += ops_processed[i]->produced; + + if (ops_processed[i]->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + + ops[i]->status = + RTE_COMP_OP_STATUS_NOT_PROCESSED; + ops[i]->src.offset += + ops_processed[i]->consumed; + ops[i]->src.length -= + ops_processed[i]->consumed; + ops[i]->dst.offset += + ops_processed[i]->produced; + + buf_ptr = rte_pktmbuf_append( + ops[i]->m_dst, + ops_processed[i]->produced); + + if (buf_ptr == NULL) { RTE_LOG(ERR, USER1, - "Not all operations could be " - "dequeued\n"); + "Data recovery: append extra bytes to the current mbuf failed\n"); goto exit; } - usleep(DEQUEUE_WAIT_TIME); + goto recovery_lb; } - num_deqd = rte_compressdev_dequeue_burst(0, 0, - &ops_processed[num_total_deqd], num_bufs); - num_total_deqd += num_deqd; - deqd_retries++; - - } while (num_total_deqd < num_enqd); - + } deqd_retries = 0; /* Free compress private xforms */ @@ -1006,7 +1078,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space && oos_zlib_decompress) { if (ops_processed[i]->status != - RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { ret_status = -1; RTE_LOG(ERR, USER1, @@ -1071,7 +1143,13 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, data_size = strlen(test_bufs[priv_data->orig_idx]) + 1; - rte_pktmbuf_append(uncomp_bufs[i], data_size); + buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the decompressed mbuf failed\n"); + goto exit; + } + } } @@ -1093,7 +1171,12 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, * Set the length of the compressed data to the * number of bytes that were produced in the previous stage */ - ops[i]->src.length = ops_processed[i]->produced; + + if (compressed_data_size[i]) + ops[i]->src.length = compressed_data_size[i]; + else + ops[i]->src.length = ops_processed[i]->produced; + ops[i]->dst.offset = 0; if (state == RTE_COMP_OP_STATELESS) { ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL; @@ -1147,7 +1230,8 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, num_priv_xforms++; } - if (capa->comp_feature_flags & RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { + if (capa->comp_feature_flags & + RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { /* Attach shareable private xform data to ops */ for (i = 0; i < num_bufs; i++) { priv_data = (struct priv_op_data *)(ops[i] + 1); @@ -1206,9 +1290,10 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, usleep(DEQUEUE_WAIT_TIME); } num_deqd = rte_compressdev_dequeue_burst(0, 0, - &ops_processed[num_total_deqd], num_bufs); + &ops_processed[num_total_deqd], num_bufs); num_total_deqd += num_deqd; deqd_retries++; + } while (num_total_deqd < num_enqd); deqd_retries = 0; @@ -1233,7 +1318,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space && oos_zlib_compress) { if (ops_processed[i]->status != - RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { ret_status = -1; RTE_LOG(ERR, USER1, @@ -1358,7 +1443,8 @@ test_compressdev_deflate_stateless_fixed(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1429,7 +1515,8 @@ test_compressdev_deflate_stateless_dynamic(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1483,7 +1570,8 @@ test_compressdev_deflate_stateless_multi_op(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1533,7 +1621,8 @@ test_compressdev_deflate_stateless_multi_level(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1623,7 +1712,8 @@ test_compressdev_deflate_stateless_multi_xform(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1669,7 +1759,8 @@ test_compressdev_deflate_stateless_sgl(void) SGL_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1777,7 +1868,8 @@ test_compressdev_deflate_stateless_checksum(void) LB_BOTH, ZLIB_DECOMPRESS, 0, - 0 + 0, + OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -1908,7 +2000,8 @@ test_compressdev_out_of_space_buffer(void) LB_BOTH, ZLIB_DECOMPRESS, 1, /* run out-of-space test */ - 0 + 0, + OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ test_data.zlib_dir = ZLIB_DECOMPRESS; @@ -1989,7 +2082,8 @@ test_compressdev_deflate_stateless_dynamic_big(void) SGL_BOTH, ZLIB_DECOMPRESS, 0, - 1 + 1, + OVERFLOW_DISABLED }; ts_params->def_comp_xform->compress.deflate.huffman = @@ -2023,6 +2117,78 @@ test_compressdev_deflate_stateless_dynamic_big(void) } +static int +test_compressdev_deflate_stateless_fixed_overflow(void) +{ + struct comp_testsuite_params *ts_params = &testsuite_params; + uint16_t i; + int ret; + const struct rte_compressdev_capabilities *capab; + + capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); + TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities"); + + if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0) + return -ENOTSUP; + + struct rte_comp_xform *compress_xform = + rte_malloc(NULL, sizeof(struct rte_comp_xform), 0); + + if (compress_xform == NULL) { + RTE_LOG(ERR, USER1, + "Compress xform could not be created\n"); + ret = TEST_FAILED; + goto exit; + } + + memcpy(compress_xform, ts_params->def_comp_xform, + sizeof(struct rte_comp_xform)); + compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED; + + struct interim_data_params int_data = { + NULL, + 1, + NULL, + &compress_xform, + &ts_params->def_decomp_xform, + 1 + }; + + struct test_data_params test_data = { + RTE_COMP_OP_STATELESS, + LB_BOTH, + ZLIB_DECOMPRESS, + 0, + 0, + OVERFLOW_ENABLED + }; + + for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { + int_data.test_bufs = &compress_test_bufs[i]; + int_data.buf_idx = &i; + + /* Compress with compressdev, decompress with Zlib */ + test_data.zlib_dir = ZLIB_DECOMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + + /* Compress with Zlib, decompress with compressdev */ + test_data.zlib_dir = ZLIB_COMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + } + + ret = TEST_SUCCESS; + +exit: + rte_free(compress_xform); + return ret; +} + static struct unit_test_suite compressdev_testsuite = { .suite_name = "compressdev unit test suite", .setup = testsuite_setup, @@ -2048,6 +2214,8 @@ static struct unit_test_suite compressdev_testsuite = { test_compressdev_deflate_stateless_checksum), TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, test_compressdev_out_of_space_buffer), + TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, + test_compressdev_deflate_stateless_fixed_overflow), TEST_CASES_END() /**< NULL terminate unit test array */ } }; -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression 2019-09-06 11:11 [dpdk-dev] [PATCH 1/2] compress/qat: overflow catching Artur Trybula 2019-09-06 11:11 ` [dpdk-dev] [PATCH 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula @ 2019-09-26 9:32 ` Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 1/2] compress/qat: overflow catch " Artur Trybula ` (2 more replies) 1 sibling, 3 replies; 16+ messages in thread From: Artur Trybula @ 2019-09-26 9:32 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver. Unit test was also created to verify the new feature. v2: - rebasing over the external mbufs This patch depends on http://patches.dpdk.org/cover/59680/ Artur Trybula (2): compress/qat: overflow catch for stateless compression test/compress: unit test for stateless overflow recovery app/test/test_compressdev.c | 261 ++++++++++++++++++++++++++------ drivers/compress/qat/qat_comp.c | 28 +++- 2 files changed, 240 insertions(+), 49 deletions(-) -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v2 1/2] compress/qat: overflow catch for stateless compression 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula @ 2019-09-26 9:32 ` Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula 2 siblings, 0 replies; 16+ messages in thread From: Artur Trybula @ 2019-09-26 9:32 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- drivers/compress/qat/qat_comp.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/drivers/compress/qat/qat_comp.c b/drivers/compress/qat/qat_comp.c index 8717b7432..533e34f6b 100644 --- a/drivers/compress/qat/qat_comp.c +++ b/drivers/compress/qat/qat_comp.c @@ -324,10 +324,32 @@ qat_comp_process_response(void **op, uint8_t *resp, void *op_cookie, (!cmp_err_code && xlat_err_code == ERR_CODE_OVERFLOW_ERROR) || (cmp_err_code == ERR_CODE_OVERFLOW_ERROR && - xlat_err_code == ERR_CODE_OVERFLOW_ERROR)) - rx_op->status = + xlat_err_code == ERR_CODE_OVERFLOW_ERROR)){ + + struct icp_qat_fw_resp_comp_pars *comp_resp = + (struct icp_qat_fw_resp_comp_pars *)&resp_msg->comp_resp_pars; + + /* handle recoverable out-of-buffer condition */ + /* in stateless compression scenario */ + if (comp_resp->input_byte_counter) { + if ((qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_FIXED_COMP_STATELESS) || + (qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS)) { + + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; + rx_op->consumed = + comp_resp->input_byte_counter; + rx_op->produced = + comp_resp->output_byte_counter; + } else + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; + } else + rx_op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; - else + } else rx_op->status = RTE_COMP_OP_STATUS_ERROR; ++(*dequeue_err_count); -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v2 2/2] test/compress: unit test for stateless overflow recovery 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 1/2] compress/qat: overflow catch " Artur Trybula @ 2019-09-26 9:32 ` Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula 2 siblings, 0 replies; 16+ messages in thread From: Artur Trybula @ 2019-09-26 9:32 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal Added unit test to check out-of-space recoverable feature. Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- app/test/test_compressdev.c | 261 +++++++++++++++++++++++++++++------- 1 file changed, 215 insertions(+), 46 deletions(-) diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c index d470c34b9..0a5c76721 100644 --- a/app/test/test_compressdev.c +++ b/app/test/test_compressdev.c @@ -30,6 +30,7 @@ * due to the compress block headers */ #define COMPRESS_BUF_SIZE_RATIO 1.3 +#define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2 #define NUM_LARGE_MBUFS 16 #define SMALL_SEG_SIZE 256 #define MAX_SEGS 16 @@ -72,6 +73,11 @@ enum varied_buff { LB_TO_SGL /* output buffer is chained */ }; +enum overflow_test { + OVERFLOW_DISABLED, + OVERFLOW_ENABLED +}; + struct priv_op_data { uint16_t orig_idx; }; @@ -110,6 +116,8 @@ struct test_data_params { const struct rte_memzone *inbuf_memzone; const struct rte_memzone *compbuf_memzone; const struct rte_memzone *uncompbuf_memzone; + /* overflow test activation */ + enum overflow_test overflow; }; static struct comp_testsuite_params testsuite_params = { 0 }; @@ -725,6 +733,49 @@ extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused) { } +static int +test_run_enqueue_dequeue(struct rte_comp_op **ops, unsigned int num_bufs, + struct rte_comp_op **ops_processed) +{ + uint16_t num_enqd, num_deqd, num_total_deqd; + unsigned int deqd_retries = 0; + + /* Enqueue and dequeue all operations */ + num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); + if (num_enqd < num_bufs) { + RTE_LOG(ERR, USER1, + "Some operations could not be enqueued\n"); + return -1; + } + + num_total_deqd = 0; + do { + /* + * If retrying a dequeue call, wait for 10 ms to allow + * enough time to the driver to process the operations + */ + if (deqd_retries != 0) { + /* + * Avoid infinite loop if not all the + * operations get out of the device + */ + if (deqd_retries == MAX_DEQD_RETRIES) { + RTE_LOG(ERR, USER1, + "Not all operations could be dequeued\n"); + return -1; + } + usleep(DEQUEUE_WAIT_TIME); + } + num_deqd = rte_compressdev_dequeue_burst(0, 0, + &ops_processed[num_total_deqd], num_bufs); + num_total_deqd += num_deqd; + deqd_retries++; + + } while (num_total_deqd < num_enqd); + + return 0; +} + /* * Compresses and decompresses buffer with compressdev API and Zlib API */ @@ -745,6 +796,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, unsigned int out_of_space = test_data->out_of_space; unsigned int big_data = test_data->big_data; enum zlib_direction zlib_dir = test_data->zlib_dir; + enum overflow_test overflow_tst = test_data->overflow; int ret_status = TEST_FAILED; struct rte_mbuf_ext_shared_info inbuf_info; struct rte_mbuf_ext_shared_info compbuf_info; @@ -773,6 +825,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); char *contig_buf = NULL; uint64_t compress_checksum[num_bufs]; + uint32_t compressed_data_size[num_bufs]; void *stream = NULL; char *all_decomp_data = NULL; unsigned int decomp_produced_data_size = 0; @@ -793,6 +846,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, memset(ops, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(ops_processed, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(priv_xforms, 0, sizeof(void *) * num_bufs); + memset(compressed_data_size, 0, sizeof(uint32_t) * num_bufs); if (decompress_state == RTE_COMP_OP_STATEFUL) { data_size = strlen(test_bufs[0]) + 1; @@ -845,6 +899,11 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { data_size = strlen(test_bufs[i]) + 1; buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the source mbuf failed\n"); + goto exit; + } strlcpy(buf_ptr, test_bufs[i], data_size); } } @@ -893,11 +952,23 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space == 1 && oos_zlib_decompress) data_size = OUT_OF_SPACE_BUF; - else - (data_size = strlen(test_bufs[i]) * - COMPRESS_BUF_SIZE_RATIO); + else { + float ratio = + ((test_data->zlib_dir == ZLIB_DECOMPRESS || + test_data->zlib_dir == ZLIB_NONE) && + overflow_tst == OVERFLOW_ENABLED) ? + COMPRESS_BUF_SIZE_RATIO_OVERFLOW : + COMPRESS_BUF_SIZE_RATIO; + + data_size = strlen(test_bufs[i]) * ratio; + } + buf_ptr = rte_pktmbuf_append(comp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the destination mbuf failed\n"); + goto exit; + } - rte_pktmbuf_append(comp_bufs[i], data_size); } } @@ -963,7 +1034,8 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, num_priv_xforms++; } - if (capa->comp_feature_flags & RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { + if (capa->comp_feature_flags & + RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { /* Attach shareable private xform data to ops */ for (i = 0; i < num_bufs; i++) ops[i]->private_xform = priv_xforms[i % num_xforms]; @@ -987,40 +1059,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, ops[i]->private_xform = priv_xforms[i]; } - /* Enqueue and dequeue all operations */ - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); - if (num_enqd < num_bufs) { +recovery_lb: + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); + if (ret < 0) { RTE_LOG(ERR, USER1, - "The operations could not be enqueued\n"); + "Enqueue/dequeue operation failed\n"); goto exit; } - num_total_deqd = 0; - do { - /* - * If retrying a dequeue call, wait for 10 ms to allow - * enough time to the driver to process the operations - */ - if (deqd_retries != 0) { - /* - * Avoid infinite loop if not all the - * operations get out of the device - */ - if (deqd_retries == MAX_DEQD_RETRIES) { + for (i = 0; i < num_bufs; i++) { + compressed_data_size[i] += ops_processed[i]->produced; + + if (ops_processed[i]->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + + ops[i]->status = + RTE_COMP_OP_STATUS_NOT_PROCESSED; + ops[i]->src.offset += + ops_processed[i]->consumed; + ops[i]->src.length -= + ops_processed[i]->consumed; + ops[i]->dst.offset += + ops_processed[i]->produced; + + buf_ptr = rte_pktmbuf_append( + ops[i]->m_dst, + ops_processed[i]->produced); + + if (buf_ptr == NULL) { RTE_LOG(ERR, USER1, - "Not all operations could be " - "dequeued\n"); + "Data recovery: append extra bytes to the current mbuf failed\n"); goto exit; } - usleep(DEQUEUE_WAIT_TIME); + goto recovery_lb; } - num_deqd = rte_compressdev_dequeue_burst(0, 0, - &ops_processed[num_total_deqd], num_bufs); - num_total_deqd += num_deqd; - deqd_retries++; - - } while (num_total_deqd < num_enqd); - + } deqd_retries = 0; /* Free compress private xforms */ @@ -1064,7 +1137,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space && oos_zlib_decompress) { if (ops_processed[i]->status != - RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { ret_status = TEST_FAILED; RTE_LOG(ERR, USER1, "Operation without expected out of " @@ -1147,7 +1220,12 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, data_size = strlen(test_bufs[priv_data->orig_idx]) + 1; - rte_pktmbuf_append(uncomp_bufs[i], data_size); + buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the decompressed mbuf failed\n"); + goto exit; + } } } @@ -1169,7 +1247,10 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, * Set the length of the compressed data to the * number of bytes that were produced in the previous stage */ - ops[i]->src.length = ops_processed[i]->produced; + if (compressed_data_size[i]) + ops[i]->src.length = compressed_data_size[i]; + else + ops[i]->src.length = ops_processed[i]->produced; ops[i]->dst.offset = 0; if (decompress_state == RTE_COMP_OP_STATELESS) { @@ -1541,7 +1622,8 @@ test_compressdev_deflate_stateless_fixed(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1611,7 +1693,8 @@ test_compressdev_deflate_stateless_dynamic(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1665,7 +1748,8 @@ test_compressdev_deflate_stateless_multi_op(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1718,7 +1802,8 @@ test_compressdev_deflate_stateless_multi_level(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1807,7 +1892,8 @@ test_compressdev_deflate_stateless_multi_xform(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1855,7 +1941,8 @@ test_compressdev_deflate_stateless_sgl(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1965,7 +2052,8 @@ test_compressdev_deflate_stateless_checksum(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2082,7 +2170,8 @@ test_compressdev_out_of_space_buffer(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 1, /* run out-of-space test */ - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ test_data.zlib_dir = ZLIB_DECOMPRESS; @@ -2159,7 +2248,8 @@ test_compressdev_deflate_stateless_dynamic_big(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 1 + .big_data = 1, + .overflow = OVERFLOW_DISABLED }; ts_params->def_comp_xform->compress.deflate.huffman = @@ -2223,7 +2313,8 @@ test_compressdev_deflate_stateful_decomp(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Compress with Zlib, decompress with compressdev */ @@ -2305,7 +2396,8 @@ test_compressdev_deflate_stateful_decomp_checksum(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2386,6 +2478,7 @@ test_compressdev_deflate_stateful_decomp_checksum(void) return ret; } + static const struct rte_memzone * make_memzone(const char *name, size_t size) { @@ -2441,7 +2534,8 @@ test_compressdev_external_mbufs(void) .inbuf_memzone = make_memzone("inbuf", data_len), .compbuf_memzone = make_memzone("compbuf", data_len * COMPRESS_BUF_SIZE_RATIO), - .uncompbuf_memzone = make_memzone("decompbuf", data_len) + .uncompbuf_memzone = make_memzone("decompbuf", data_len), + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -2472,6 +2566,79 @@ test_compressdev_external_mbufs(void) return ret; } +static int +test_compressdev_deflate_stateless_fixed_overflow(void) +{ + struct comp_testsuite_params *ts_params = &testsuite_params; + uint16_t i; + int ret; + const struct rte_compressdev_capabilities *capab; + + capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); + TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities"); + + if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0) + return -ENOTSUP; + + struct rte_comp_xform *compress_xform = + rte_malloc(NULL, sizeof(struct rte_comp_xform), 0); + + if (compress_xform == NULL) { + RTE_LOG(ERR, USER1, + "Compress xform could not be created\n"); + ret = TEST_FAILED; + goto exit; + } + + memcpy(compress_xform, ts_params->def_comp_xform, + sizeof(struct rte_comp_xform)); + compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED; + + struct interim_data_params int_data = { + NULL, + 1, + NULL, + &compress_xform, + &ts_params->def_decomp_xform, + 1 + }; + + struct test_data_params test_data = { + .compress_state = RTE_COMP_OP_STATELESS, + .decompress_state = RTE_COMP_OP_STATELESS, + .buff_type = LB_BOTH, + .zlib_dir = ZLIB_DECOMPRESS, + .out_of_space = 0, + .big_data = 0, + .overflow = OVERFLOW_ENABLED + }; + + for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { + int_data.test_bufs = &compress_test_bufs[i]; + int_data.buf_idx = &i; + + /* Compress with compressdev, decompress with Zlib */ + test_data.zlib_dir = ZLIB_DECOMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + + /* Compress with Zlib, decompress with compressdev */ + test_data.zlib_dir = ZLIB_COMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + } + + ret = TEST_SUCCESS; + +exit: + rte_free(compress_xform); + return ret; +} + static struct unit_test_suite compressdev_testsuite = { .suite_name = "compressdev unit test suite", .setup = testsuite_setup, @@ -2503,6 +2670,8 @@ static struct unit_test_suite compressdev_testsuite = { test_compressdev_deflate_stateful_decomp_checksum), TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, test_compressdev_external_mbufs), + TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, + test_compressdev_deflate_stateless_fixed_overflow), TEST_CASES_END() /**< NULL terminate unit test array */ } }; -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 1/2] compress/qat: overflow catch " Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula @ 2019-10-11 17:46 ` Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch " Artur Trybula ` (2 more replies) 2 siblings, 3 replies; 16+ messages in thread From: Artur Trybula @ 2019-10-11 17:46 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver. Unit test was also created to verify the new feature. v3: - rebasing onto the recent master v2: - rebasing over the external mbufs Artur Trybula (2): compress/qat: overflow catch for stateless compression test/compress: unit test for stateless overflow recovery app/test/test_compressdev.c | 261 ++++++++++++++++++++++++++------ drivers/compress/qat/qat_comp.c | 28 +++- 2 files changed, 239 insertions(+), 50 deletions(-) -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch for stateless compression 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula @ 2019-10-11 17:46 ` Artur Trybula 2019-10-14 13:38 ` Trahe, Fiona 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula 2 siblings, 1 reply; 16+ messages in thread From: Artur Trybula @ 2019-10-11 17:46 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- drivers/compress/qat/qat_comp.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/drivers/compress/qat/qat_comp.c b/drivers/compress/qat/qat_comp.c index 8717b7432..533e34f6b 100644 --- a/drivers/compress/qat/qat_comp.c +++ b/drivers/compress/qat/qat_comp.c @@ -324,10 +324,32 @@ qat_comp_process_response(void **op, uint8_t *resp, void *op_cookie, (!cmp_err_code && xlat_err_code == ERR_CODE_OVERFLOW_ERROR) || (cmp_err_code == ERR_CODE_OVERFLOW_ERROR && - xlat_err_code == ERR_CODE_OVERFLOW_ERROR)) - rx_op->status = + xlat_err_code == ERR_CODE_OVERFLOW_ERROR)){ + + struct icp_qat_fw_resp_comp_pars *comp_resp = + (struct icp_qat_fw_resp_comp_pars *)&resp_msg->comp_resp_pars; + + /* handle recoverable out-of-buffer condition */ + /* in stateless compression scenario */ + if (comp_resp->input_byte_counter) { + if ((qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_FIXED_COMP_STATELESS) || + (qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS)) { + + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; + rx_op->consumed = + comp_resp->input_byte_counter; + rx_op->produced = + comp_resp->output_byte_counter; + } else + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; + } else + rx_op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; - else + } else rx_op->status = RTE_COMP_OP_STATUS_ERROR; ++(*dequeue_err_count); -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch for stateless compression 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch " Artur Trybula @ 2019-10-14 13:38 ` Trahe, Fiona 0 siblings, 0 replies; 16+ messages in thread From: Trahe, Fiona @ 2019-10-14 13:38 UTC (permalink / raw) To: Trybula, ArturX, dev, shallyv, Dybkowski, AdamX, akhil.goyal; +Cc: Trahe, Fiona > -----Original Message----- > From: Trybula, ArturX > Sent: Friday, October 11, 2019 6:46 PM > To: dev@dpdk.org; Trahe, Fiona <fiona.trahe@intel.com>; shallyv@marvell.com; Dybkowski, AdamX > <adamx.dybkowski@intel.com>; Trybula, ArturX <arturx.trybula@intel.com>; akhil.goyal@nxp.com > Subject: [PATCH v3 1/2] compress/qat: overflow catch for stateless compression > > This patch adds out-of-space recoverable feature for stateless > compression scenario to QuickAssist compressdev driver > > Signed-off-by: Artur Trybula <arturx.trybula@intel.com> Acked-by: Fiona Trahe <fiona.trahe@intel.com> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch " Artur Trybula @ 2019-10-11 17:46 ` Artur Trybula 2019-10-14 13:48 ` Trahe, Fiona 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula 2 siblings, 1 reply; 16+ messages in thread From: Artur Trybula @ 2019-10-11 17:46 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal Added unit test to check out-of-space recoverable feature. Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- app/test/test_compressdev.c | 261 +++++++++++++++++++++++++++++------- 1 file changed, 214 insertions(+), 47 deletions(-) diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c index d470c34b9..335deb263 100644 --- a/app/test/test_compressdev.c +++ b/app/test/test_compressdev.c @@ -30,6 +30,7 @@ * due to the compress block headers */ #define COMPRESS_BUF_SIZE_RATIO 1.3 +#define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2 #define NUM_LARGE_MBUFS 16 #define SMALL_SEG_SIZE 256 #define MAX_SEGS 16 @@ -72,6 +73,11 @@ enum varied_buff { LB_TO_SGL /* output buffer is chained */ }; +enum overflow_test { + OVERFLOW_DISABLED, + OVERFLOW_ENABLED +}; + struct priv_op_data { uint16_t orig_idx; }; @@ -110,6 +116,8 @@ struct test_data_params { const struct rte_memzone *inbuf_memzone; const struct rte_memzone *compbuf_memzone; const struct rte_memzone *uncompbuf_memzone; + /* overflow test activation */ + enum overflow_test overflow; }; static struct comp_testsuite_params testsuite_params = { 0 }; @@ -725,6 +733,49 @@ extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused) { } +static int +test_run_enqueue_dequeue(struct rte_comp_op **ops, unsigned int num_bufs, + struct rte_comp_op **ops_processed) +{ + uint16_t num_enqd, num_deqd, num_total_deqd; + unsigned int deqd_retries = 0; + + /* Enqueue and dequeue all operations */ + num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); + if (num_enqd < num_bufs) { + RTE_LOG(ERR, USER1, + "Some operations could not be enqueued\n"); + return -1; + } + + num_total_deqd = 0; + do { + /* + * If retrying a dequeue call, wait for 10 ms to allow + * enough time to the driver to process the operations + */ + if (deqd_retries != 0) { + /* + * Avoid infinite loop if not all the + * operations get out of the device + */ + if (deqd_retries == MAX_DEQD_RETRIES) { + RTE_LOG(ERR, USER1, + "Not all operations could be dequeued\n"); + return -1; + } + usleep(DEQUEUE_WAIT_TIME); + } + num_deqd = rte_compressdev_dequeue_burst(0, 0, + &ops_processed[num_total_deqd], num_bufs); + num_total_deqd += num_deqd; + deqd_retries++; + + } while (num_total_deqd < num_enqd); + + return 0; +} + /* * Compresses and decompresses buffer with compressdev API and Zlib API */ @@ -745,6 +796,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, unsigned int out_of_space = test_data->out_of_space; unsigned int big_data = test_data->big_data; enum zlib_direction zlib_dir = test_data->zlib_dir; + enum overflow_test overflow_tst = test_data->overflow; int ret_status = TEST_FAILED; struct rte_mbuf_ext_shared_info inbuf_info; struct rte_mbuf_ext_shared_info compbuf_info; @@ -773,6 +825,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); char *contig_buf = NULL; uint64_t compress_checksum[num_bufs]; + uint32_t compressed_data_size[num_bufs]; void *stream = NULL; char *all_decomp_data = NULL; unsigned int decomp_produced_data_size = 0; @@ -793,6 +846,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, memset(ops, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(ops_processed, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(priv_xforms, 0, sizeof(void *) * num_bufs); + memset(compressed_data_size, 0, sizeof(uint32_t) * num_bufs); if (decompress_state == RTE_COMP_OP_STATEFUL) { data_size = strlen(test_bufs[0]) + 1; @@ -845,6 +899,11 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { data_size = strlen(test_bufs[i]) + 1; buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the source mbuf failed\n"); + goto exit; + } strlcpy(buf_ptr, test_bufs[i], data_size); } } @@ -893,11 +952,22 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space == 1 && oos_zlib_decompress) data_size = OUT_OF_SPACE_BUF; - else - (data_size = strlen(test_bufs[i]) * - COMPRESS_BUF_SIZE_RATIO); - - rte_pktmbuf_append(comp_bufs[i], data_size); + else { + float ratio = + ((test_data->zlib_dir == ZLIB_DECOMPRESS || + test_data->zlib_dir == ZLIB_NONE) && + overflow_tst == OVERFLOW_ENABLED) ? + COMPRESS_BUF_SIZE_RATIO_OVERFLOW : + COMPRESS_BUF_SIZE_RATIO; + + data_size = strlen(test_bufs[i]) * ratio; + } + buf_ptr = rte_pktmbuf_append(comp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the destination mbuf failed\n"); + goto exit; + } } } @@ -963,7 +1033,8 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, num_priv_xforms++; } - if (capa->comp_feature_flags & RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { + if (capa->comp_feature_flags & + RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { /* Attach shareable private xform data to ops */ for (i = 0; i < num_bufs; i++) ops[i]->private_xform = priv_xforms[i % num_xforms]; @@ -987,40 +1058,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, ops[i]->private_xform = priv_xforms[i]; } - /* Enqueue and dequeue all operations */ - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); - if (num_enqd < num_bufs) { +recovery_lb: + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); + if (ret < 0) { RTE_LOG(ERR, USER1, - "The operations could not be enqueued\n"); + "Enqueue/dequeue operation failed\n"); goto exit; } - num_total_deqd = 0; - do { - /* - * If retrying a dequeue call, wait for 10 ms to allow - * enough time to the driver to process the operations - */ - if (deqd_retries != 0) { - /* - * Avoid infinite loop if not all the - * operations get out of the device - */ - if (deqd_retries == MAX_DEQD_RETRIES) { + for (i = 0; i < num_bufs; i++) { + compressed_data_size[i] += ops_processed[i]->produced; + + if (ops_processed[i]->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + + ops[i]->status = + RTE_COMP_OP_STATUS_NOT_PROCESSED; + ops[i]->src.offset += + ops_processed[i]->consumed; + ops[i]->src.length -= + ops_processed[i]->consumed; + ops[i]->dst.offset += + ops_processed[i]->produced; + + buf_ptr = rte_pktmbuf_append( + ops[i]->m_dst, + ops_processed[i]->produced); + + if (buf_ptr == NULL) { RTE_LOG(ERR, USER1, - "Not all operations could be " - "dequeued\n"); + "Data recovery: append extra bytes to the current mbuf failed\n"); goto exit; } - usleep(DEQUEUE_WAIT_TIME); + goto recovery_lb; } - num_deqd = rte_compressdev_dequeue_burst(0, 0, - &ops_processed[num_total_deqd], num_bufs); - num_total_deqd += num_deqd; - deqd_retries++; - - } while (num_total_deqd < num_enqd); - + } deqd_retries = 0; /* Free compress private xforms */ @@ -1064,7 +1136,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space && oos_zlib_decompress) { if (ops_processed[i]->status != - RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { ret_status = TEST_FAILED; RTE_LOG(ERR, USER1, "Operation without expected out of " @@ -1147,7 +1219,12 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, data_size = strlen(test_bufs[priv_data->orig_idx]) + 1; - rte_pktmbuf_append(uncomp_bufs[i], data_size); + buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the decompressed mbuf failed\n"); + goto exit; + } } } @@ -1169,7 +1246,10 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, * Set the length of the compressed data to the * number of bytes that were produced in the previous stage */ - ops[i]->src.length = ops_processed[i]->produced; + if (compressed_data_size[i]) + ops[i]->src.length = compressed_data_size[i]; + else + ops[i]->src.length = ops_processed[i]->produced; ops[i]->dst.offset = 0; if (decompress_state == RTE_COMP_OP_STATELESS) { @@ -1541,7 +1621,8 @@ test_compressdev_deflate_stateless_fixed(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1611,7 +1692,8 @@ test_compressdev_deflate_stateless_dynamic(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1665,7 +1747,8 @@ test_compressdev_deflate_stateless_multi_op(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1718,7 +1801,8 @@ test_compressdev_deflate_stateless_multi_level(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1807,7 +1891,8 @@ test_compressdev_deflate_stateless_multi_xform(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1855,7 +1940,8 @@ test_compressdev_deflate_stateless_sgl(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1965,7 +2051,8 @@ test_compressdev_deflate_stateless_checksum(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2082,7 +2169,8 @@ test_compressdev_out_of_space_buffer(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 1, /* run out-of-space test */ - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ test_data.zlib_dir = ZLIB_DECOMPRESS; @@ -2159,7 +2247,8 @@ test_compressdev_deflate_stateless_dynamic_big(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 1 + .big_data = 1, + .overflow = OVERFLOW_DISABLED }; ts_params->def_comp_xform->compress.deflate.huffman = @@ -2223,7 +2312,8 @@ test_compressdev_deflate_stateful_decomp(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Compress with Zlib, decompress with compressdev */ @@ -2305,7 +2395,8 @@ test_compressdev_deflate_stateful_decomp_checksum(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2441,7 +2532,8 @@ test_compressdev_external_mbufs(void) .inbuf_memzone = make_memzone("inbuf", data_len), .compbuf_memzone = make_memzone("compbuf", data_len * COMPRESS_BUF_SIZE_RATIO), - .uncompbuf_memzone = make_memzone("decompbuf", data_len) + .uncompbuf_memzone = make_memzone("decompbuf", data_len), + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -2472,6 +2564,79 @@ test_compressdev_external_mbufs(void) return ret; } +static int +test_compressdev_deflate_stateless_fixed_overflow(void) +{ + struct comp_testsuite_params *ts_params = &testsuite_params; + uint16_t i; + int ret; + const struct rte_compressdev_capabilities *capab; + + capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); + TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities"); + + if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0) + return -ENOTSUP; + + struct rte_comp_xform *compress_xform = + rte_malloc(NULL, sizeof(struct rte_comp_xform), 0); + + if (compress_xform == NULL) { + RTE_LOG(ERR, USER1, + "Compress xform could not be created\n"); + ret = TEST_FAILED; + goto exit; + } + + memcpy(compress_xform, ts_params->def_comp_xform, + sizeof(struct rte_comp_xform)); + compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED; + + struct interim_data_params int_data = { + NULL, + 1, + NULL, + &compress_xform, + &ts_params->def_decomp_xform, + 1 + }; + + struct test_data_params test_data = { + .compress_state = RTE_COMP_OP_STATELESS, + .decompress_state = RTE_COMP_OP_STATELESS, + .buff_type = LB_BOTH, + .zlib_dir = ZLIB_DECOMPRESS, + .out_of_space = 0, + .big_data = 0, + .overflow = OVERFLOW_ENABLED + }; + + for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { + int_data.test_bufs = &compress_test_bufs[i]; + int_data.buf_idx = &i; + + /* Compress with compressdev, decompress with Zlib */ + test_data.zlib_dir = ZLIB_DECOMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + + /* Compress with Zlib, decompress with compressdev */ + test_data.zlib_dir = ZLIB_COMPRESS; + if (test_deflate_comp_decomp(&int_data, &test_data) < 0) { + ret = TEST_FAILED; + goto exit; + } + } + + ret = TEST_SUCCESS; + +exit: + rte_free(compress_xform); + return ret; +} + static struct unit_test_suite compressdev_testsuite = { .suite_name = "compressdev unit test suite", .setup = testsuite_setup, @@ -2503,6 +2668,8 @@ static struct unit_test_suite compressdev_testsuite = { test_compressdev_deflate_stateful_decomp_checksum), TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, test_compressdev_external_mbufs), + TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, + test_compressdev_deflate_stateless_fixed_overflow), TEST_CASES_END() /**< NULL terminate unit test array */ } }; -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula @ 2019-10-14 13:48 ` Trahe, Fiona 2019-10-14 14:20 ` Trybula, ArturX 0 siblings, 1 reply; 16+ messages in thread From: Trahe, Fiona @ 2019-10-14 13:48 UTC (permalink / raw) To: Trybula, ArturX, dev, shallyv, Dybkowski, AdamX, akhil.goyal; +Cc: Trahe, Fiona Hi Artur, > -----Original Message----- > From: Trybula, ArturX > Sent: Friday, October 11, 2019 6:46 PM > To: dev@dpdk.org; Trahe, Fiona <fiona.trahe@intel.com>; shallyv@marvell.com; Dybkowski, AdamX > <adamx.dybkowski@intel.com>; Trybula, ArturX <arturx.trybula@intel.com>; akhil.goyal@nxp.com > Subject: [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery > > Added unit test to check out-of-space recoverable feature. > > Signed-off-by: Artur Trybula <arturx.trybula@intel.com> > --- > app/test/test_compressdev.c | 261 +++++++++++++++++++++++++++++------- > 1 file changed, 214 insertions(+), 47 deletions(-) //snip// > @@ -987,40 +1058,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, > ops[i]->private_xform = priv_xforms[i]; > } > > - /* Enqueue and dequeue all operations */ > - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); > - if (num_enqd < num_bufs) { > +recovery_lb: > + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); > + if (ret < 0) { > RTE_LOG(ERR, USER1, > - "The operations could not be enqueued\n"); > + "Enqueue/dequeue operation failed\n"); > goto exit; > } > > - num_total_deqd = 0; > - do { > - /* > - * If retrying a dequeue call, wait for 10 ms to allow > - * enough time to the driver to process the operations > - */ > - if (deqd_retries != 0) { > - /* > - * Avoid infinite loop if not all the > - * operations get out of the device > - */ > - if (deqd_retries == MAX_DEQD_RETRIES) { > + for (i = 0; i < num_bufs; i++) { > + compressed_data_size[i] += ops_processed[i]->produced; > + > + if (ops_processed[i]->status == > + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { > + > + ops[i]->status = > + RTE_COMP_OP_STATUS_NOT_PROCESSED; > + ops[i]->src.offset += > + ops_processed[i]->consumed; > + ops[i]->src.length -= > + ops_processed[i]->consumed; > + ops[i]->dst.offset += > + ops_processed[i]->produced; > + > + buf_ptr = rte_pktmbuf_append( > + ops[i]->m_dst, > + ops_processed[i]->produced); > + > + if (buf_ptr == NULL) { > RTE_LOG(ERR, USER1, > - "Not all operations could be " > - "dequeued\n"); > + "Data recovery: append extra bytes to the current > mbuf failed\n"); > goto exit; > } > - usleep(DEQUEUE_WAIT_TIME); > + goto recovery_lb; > } > - num_deqd = rte_compressdev_dequeue_burst(0, 0, > - &ops_processed[num_total_deqd], num_bufs); > - num_total_deqd += num_deqd; > - deqd_retries++; > - > - } while (num_total_deqd < num_enqd); > - > + } > deqd_retries = 0; //snip// Not all drivers support OUT_OF_SPACE_RECOVERABLE - some may return OUT_OF_SPACE_TERMINATED. There's no capability feature-flag which can be checked before running the test. How would this test behave in this case? Ideally it should recognise that OUT_OF_SPACE_TERMINATED is a valid response, but indicates that the driver doesn't support RECOVERABLE status and so return unsupported rather than failed. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery 2019-10-14 13:48 ` Trahe, Fiona @ 2019-10-14 14:20 ` Trybula, ArturX 0 siblings, 0 replies; 16+ messages in thread From: Trybula, ArturX @ 2019-10-14 14:20 UTC (permalink / raw) To: Trahe, Fiona, dev, shallyv, Dybkowski, AdamX, akhil.goyal Hi Fiona, Please find my answer below, -----Original Message----- From: Trahe, Fiona Sent: Monday, October 14, 2019 15:49 To: Trybula, ArturX <arturx.trybula@intel.com>; dev@dpdk.org; shallyv@marvell.com; Dybkowski, AdamX <adamx.dybkowski@intel.com>; akhil.goyal@nxp.com Cc: Trahe, Fiona <fiona.trahe@intel.com> Subject: RE: [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery Hi Artur, > -----Original Message----- > From: Trybula, ArturX > Sent: Friday, October 11, 2019 6:46 PM > To: dev@dpdk.org; Trahe, Fiona <fiona.trahe@intel.com>; > shallyv@marvell.com; Dybkowski, AdamX <adamx.dybkowski@intel.com>; > Trybula, ArturX <arturx.trybula@intel.com>; akhil.goyal@nxp.com > Subject: [PATCH v3 2/2] test/compress: unit test for stateless > overflow recovery > > Added unit test to check out-of-space recoverable feature. > > Signed-off-by: Artur Trybula <arturx.trybula@intel.com> > --- > app/test/test_compressdev.c | 261 > +++++++++++++++++++++++++++++------- > 1 file changed, 214 insertions(+), 47 deletions(-) //snip// > @@ -987,40 +1058,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, > ops[i]->private_xform = priv_xforms[i]; > } > > - /* Enqueue and dequeue all operations */ > - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); > - if (num_enqd < num_bufs) { > +recovery_lb: > + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); > + if (ret < 0) { > RTE_LOG(ERR, USER1, > - "The operations could not be enqueued\n"); > + "Enqueue/dequeue operation failed\n"); > goto exit; > } > > - num_total_deqd = 0; > - do { > - /* > - * If retrying a dequeue call, wait for 10 ms to allow > - * enough time to the driver to process the operations > - */ > - if (deqd_retries != 0) { > - /* > - * Avoid infinite loop if not all the > - * operations get out of the device > - */ > - if (deqd_retries == MAX_DEQD_RETRIES) { > + for (i = 0; i < num_bufs; i++) { > + compressed_data_size[i] += ops_processed[i]->produced; > + > + if (ops_processed[i]->status == > + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { > + > + ops[i]->status = > + RTE_COMP_OP_STATUS_NOT_PROCESSED; > + ops[i]->src.offset += > + ops_processed[i]->consumed; > + ops[i]->src.length -= > + ops_processed[i]->consumed; > + ops[i]->dst.offset += > + ops_processed[i]->produced; > + > + buf_ptr = rte_pktmbuf_append( > + ops[i]->m_dst, > + ops_processed[i]->produced); > + > + if (buf_ptr == NULL) { > RTE_LOG(ERR, USER1, > - "Not all operations could be " > - "dequeued\n"); > + "Data recovery: append extra bytes to the current > mbuf failed\n"); > goto exit; > } > - usleep(DEQUEUE_WAIT_TIME); > + goto recovery_lb; > } > - num_deqd = rte_compressdev_dequeue_burst(0, 0, > - &ops_processed[num_total_deqd], num_bufs); > - num_total_deqd += num_deqd; > - deqd_retries++; > - > - } while (num_total_deqd < num_enqd); > - > + } > deqd_retries = 0; //snip// Not all drivers support OUT_OF_SPACE_RECOVERABLE - some may return OUT_OF_SPACE_TERMINATED. There's no capability feature-flag which can be checked before running the test. How would this test behave in this case? Ideally it should recognise that OUT_OF_SPACE_TERMINATED is a valid response, but indicates that the driver doesn't support RECOVERABLE status and so return unsupported rather than failed. [Artur] It can fail if a device doesn't support overflow capability. Tomorrow I will run tests using ISAL. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch " Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula @ 2019-10-16 9:40 ` Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 1/2] compress/qat: overflow catch " Artur Trybula ` (2 more replies) 2 siblings, 3 replies; 16+ messages in thread From: Artur Trybula @ 2019-10-16 9:40 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver. Unit test was also created to verify the new feature. v4: - if a device doesn't support out-of-space recoverable feature, then instead of "failed", "unsupported" result will be printed out on the screen v3: - rebasing onto the recent master v2: - rebasing over the external mbufs Artur Trybula (2): compress/qat: overflow catch for stateless compression test/compress: unit test for stateless overflow recovery app/test/test_compressdev.c | 280 ++++++++++++++++++++++++++------ drivers/compress/qat/qat_comp.c | 28 +++- 2 files changed, 258 insertions(+), 50 deletions(-) -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 1/2] compress/qat: overflow catch for stateless compression 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula @ 2019-10-16 9:40 ` Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-16 11:16 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Trahe, Fiona 2 siblings, 0 replies; 16+ messages in thread From: Artur Trybula @ 2019-10-16 9:40 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal This patch adds out-of-space recoverable feature for stateless compression scenario to QuickAssist compressdev driver Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- drivers/compress/qat/qat_comp.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/drivers/compress/qat/qat_comp.c b/drivers/compress/qat/qat_comp.c index 8717b7432..533e34f6b 100644 --- a/drivers/compress/qat/qat_comp.c +++ b/drivers/compress/qat/qat_comp.c @@ -324,10 +324,32 @@ qat_comp_process_response(void **op, uint8_t *resp, void *op_cookie, (!cmp_err_code && xlat_err_code == ERR_CODE_OVERFLOW_ERROR) || (cmp_err_code == ERR_CODE_OVERFLOW_ERROR && - xlat_err_code == ERR_CODE_OVERFLOW_ERROR)) - rx_op->status = + xlat_err_code == ERR_CODE_OVERFLOW_ERROR)){ + + struct icp_qat_fw_resp_comp_pars *comp_resp = + (struct icp_qat_fw_resp_comp_pars *)&resp_msg->comp_resp_pars; + + /* handle recoverable out-of-buffer condition */ + /* in stateless compression scenario */ + if (comp_resp->input_byte_counter) { + if ((qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_FIXED_COMP_STATELESS) || + (qat_xform->qat_comp_request_type + == QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS)) { + + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; + rx_op->consumed = + comp_resp->input_byte_counter; + rx_op->produced = + comp_resp->output_byte_counter; + } else + rx_op->status = + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; + } else + rx_op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; - else + } else rx_op->status = RTE_COMP_OP_STATUS_ERROR; ++(*dequeue_err_count); -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 2/2] test/compress: unit test for stateless overflow recovery 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 1/2] compress/qat: overflow catch " Artur Trybula @ 2019-10-16 9:40 ` Artur Trybula 2019-10-16 11:16 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Trahe, Fiona 2 siblings, 0 replies; 16+ messages in thread From: Artur Trybula @ 2019-10-16 9:40 UTC (permalink / raw) To: dev, fiona.trahe, shallyv, adamx.dybkowski, arturx.trybula, akhil.goyal Added unit test to check out-of-space recoverable feature. Signed-off-by: Artur Trybula <arturx.trybula@intel.com> --- app/test/test_compressdev.c | 280 ++++++++++++++++++++++++++++++------ 1 file changed, 233 insertions(+), 47 deletions(-) diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c index d470c34b9..283c64971 100644 --- a/app/test/test_compressdev.c +++ b/app/test/test_compressdev.c @@ -30,6 +30,7 @@ * due to the compress block headers */ #define COMPRESS_BUF_SIZE_RATIO 1.3 +#define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2 #define NUM_LARGE_MBUFS 16 #define SMALL_SEG_SIZE 256 #define MAX_SEGS 16 @@ -72,6 +73,11 @@ enum varied_buff { LB_TO_SGL /* output buffer is chained */ }; +enum overflow_test { + OVERFLOW_DISABLED, + OVERFLOW_ENABLED +}; + struct priv_op_data { uint16_t orig_idx; }; @@ -110,6 +116,8 @@ struct test_data_params { const struct rte_memzone *inbuf_memzone; const struct rte_memzone *compbuf_memzone; const struct rte_memzone *uncompbuf_memzone; + /* overflow test activation */ + enum overflow_test overflow; }; static struct comp_testsuite_params testsuite_params = { 0 }; @@ -725,6 +733,49 @@ extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused) { } +static int +test_run_enqueue_dequeue(struct rte_comp_op **ops, unsigned int num_bufs, + struct rte_comp_op **ops_processed) +{ + uint16_t num_enqd, num_deqd, num_total_deqd; + unsigned int deqd_retries = 0; + + /* Enqueue and dequeue all operations */ + num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); + if (num_enqd < num_bufs) { + RTE_LOG(ERR, USER1, + "Some operations could not be enqueued\n"); + return -1; + } + + num_total_deqd = 0; + do { + /* + * If retrying a dequeue call, wait for 10 ms to allow + * enough time to the driver to process the operations + */ + if (deqd_retries != 0) { + /* + * Avoid infinite loop if not all the + * operations get out of the device + */ + if (deqd_retries == MAX_DEQD_RETRIES) { + RTE_LOG(ERR, USER1, + "Not all operations could be dequeued\n"); + return -1; + } + usleep(DEQUEUE_WAIT_TIME); + } + num_deqd = rte_compressdev_dequeue_burst(0, 0, + &ops_processed[num_total_deqd], num_bufs); + num_total_deqd += num_deqd; + deqd_retries++; + + } while (num_total_deqd < num_enqd); + + return 0; +} + /* * Compresses and decompresses buffer with compressdev API and Zlib API */ @@ -745,6 +796,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, unsigned int out_of_space = test_data->out_of_space; unsigned int big_data = test_data->big_data; enum zlib_direction zlib_dir = test_data->zlib_dir; + enum overflow_test overflow_tst = test_data->overflow; int ret_status = TEST_FAILED; struct rte_mbuf_ext_shared_info inbuf_info; struct rte_mbuf_ext_shared_info compbuf_info; @@ -773,6 +825,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); char *contig_buf = NULL; uint64_t compress_checksum[num_bufs]; + uint32_t compressed_data_size[num_bufs]; void *stream = NULL; char *all_decomp_data = NULL; unsigned int decomp_produced_data_size = 0; @@ -793,6 +846,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, memset(ops, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(ops_processed, 0, sizeof(struct rte_comp_op *) * num_bufs); memset(priv_xforms, 0, sizeof(void *) * num_bufs); + memset(compressed_data_size, 0, sizeof(uint32_t) * num_bufs); if (decompress_state == RTE_COMP_OP_STATEFUL) { data_size = strlen(test_bufs[0]) + 1; @@ -845,6 +899,11 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { data_size = strlen(test_bufs[i]) + 1; buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the source mbuf failed\n"); + goto exit; + } strlcpy(buf_ptr, test_bufs[i], data_size); } } @@ -893,11 +952,22 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space == 1 && oos_zlib_decompress) data_size = OUT_OF_SPACE_BUF; - else - (data_size = strlen(test_bufs[i]) * - COMPRESS_BUF_SIZE_RATIO); - - rte_pktmbuf_append(comp_bufs[i], data_size); + else { + float ratio = + ((test_data->zlib_dir == ZLIB_DECOMPRESS || + test_data->zlib_dir == ZLIB_NONE) && + overflow_tst == OVERFLOW_ENABLED) ? + COMPRESS_BUF_SIZE_RATIO_OVERFLOW : + COMPRESS_BUF_SIZE_RATIO; + + data_size = strlen(test_bufs[i]) * ratio; + } + buf_ptr = rte_pktmbuf_append(comp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the destination mbuf failed\n"); + goto exit; + } } } @@ -963,7 +1033,8 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, num_priv_xforms++; } - if (capa->comp_feature_flags & RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { + if (capa->comp_feature_flags & + RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { /* Attach shareable private xform data to ops */ for (i = 0; i < num_bufs; i++) ops[i]->private_xform = priv_xforms[i % num_xforms]; @@ -987,40 +1058,41 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, ops[i]->private_xform = priv_xforms[i]; } - /* Enqueue and dequeue all operations */ - num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs); - if (num_enqd < num_bufs) { +recovery_lb: + ret = test_run_enqueue_dequeue(ops, num_bufs, ops_processed); + if (ret < 0) { RTE_LOG(ERR, USER1, - "The operations could not be enqueued\n"); + "Enqueue/dequeue operation failed\n"); goto exit; } - num_total_deqd = 0; - do { - /* - * If retrying a dequeue call, wait for 10 ms to allow - * enough time to the driver to process the operations - */ - if (deqd_retries != 0) { - /* - * Avoid infinite loop if not all the - * operations get out of the device - */ - if (deqd_retries == MAX_DEQD_RETRIES) { + for (i = 0; i < num_bufs; i++) { + compressed_data_size[i] += ops_processed[i]->produced; + + if (ops_processed[i]->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + + ops[i]->status = + RTE_COMP_OP_STATUS_NOT_PROCESSED; + ops[i]->src.offset += + ops_processed[i]->consumed; + ops[i]->src.length -= + ops_processed[i]->consumed; + ops[i]->dst.offset += + ops_processed[i]->produced; + + buf_ptr = rte_pktmbuf_append( + ops[i]->m_dst, + ops_processed[i]->produced); + + if (buf_ptr == NULL) { RTE_LOG(ERR, USER1, - "Not all operations could be " - "dequeued\n"); + "Data recovery: append extra bytes to the current mbuf failed\n"); goto exit; } - usleep(DEQUEUE_WAIT_TIME); + goto recovery_lb; } - num_deqd = rte_compressdev_dequeue_burst(0, 0, - &ops_processed[num_total_deqd], num_bufs); - num_total_deqd += num_deqd; - deqd_retries++; - - } while (num_total_deqd < num_enqd); - + } deqd_retries = 0; /* Free compress private xforms */ @@ -1064,7 +1136,7 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, for (i = 0; i < num_bufs; i++) { if (out_of_space && oos_zlib_decompress) { if (ops_processed[i]->status != - RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { ret_status = TEST_FAILED; RTE_LOG(ERR, USER1, "Operation without expected out of " @@ -1075,6 +1147,16 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, } if (ops_processed[i]->status != RTE_COMP_OP_STATUS_SUCCESS) { + if (overflow_tst == OVERFLOW_ENABLED) { + if (ops_processed[i]->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) { + ret_status = 1; + RTE_LOG(INFO, USER1, + "Out-of-space-recoverable functionality" + " is not supported on this device\n"); + goto exit; + } + } RTE_LOG(ERR, USER1, "Some operations were not successful\n"); goto exit; @@ -1147,7 +1229,12 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, data_size = strlen(test_bufs[priv_data->orig_idx]) + 1; - rte_pktmbuf_append(uncomp_bufs[i], data_size); + buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size); + if (buf_ptr == NULL) { + RTE_LOG(ERR, USER1, + "Append extra bytes to the decompressed mbuf failed\n"); + goto exit; + } } } @@ -1169,7 +1256,10 @@ test_deflate_comp_decomp(const struct interim_data_params *int_data, * Set the length of the compressed data to the * number of bytes that were produced in the previous stage */ - ops[i]->src.length = ops_processed[i]->produced; + if (compressed_data_size[i]) + ops[i]->src.length = compressed_data_size[i]; + else + ops[i]->src.length = ops_processed[i]->produced; ops[i]->dst.offset = 0; if (decompress_state == RTE_COMP_OP_STATELESS) { @@ -1541,7 +1631,8 @@ test_compressdev_deflate_stateless_fixed(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1611,7 +1702,8 @@ test_compressdev_deflate_stateless_dynamic(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1665,7 +1757,8 @@ test_compressdev_deflate_stateless_multi_op(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1718,7 +1811,8 @@ test_compressdev_deflate_stateless_multi_level(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1807,7 +1901,8 @@ test_compressdev_deflate_stateless_multi_xform(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ @@ -1855,7 +1950,8 @@ test_compressdev_deflate_stateless_sgl(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -1965,7 +2061,8 @@ test_compressdev_deflate_stateless_checksum(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2082,7 +2179,8 @@ test_compressdev_out_of_space_buffer(void) .buff_type = LB_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 1, /* run out-of-space test */ - .big_data = 0 + .big_data = 0, + .overflow = OVERFLOW_DISABLED }; /* Compress with compressdev, decompress with Zlib */ test_data.zlib_dir = ZLIB_DECOMPRESS; @@ -2159,7 +2257,8 @@ test_compressdev_deflate_stateless_dynamic_big(void) .buff_type = SGL_BOTH, .zlib_dir = ZLIB_DECOMPRESS, .out_of_space = 0, - .big_data = 1 + .big_data = 1, + .overflow = OVERFLOW_DISABLED }; ts_params->def_comp_xform->compress.deflate.huffman = @@ -2223,7 +2322,8 @@ test_compressdev_deflate_stateful_decomp(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Compress with Zlib, decompress with compressdev */ @@ -2305,7 +2405,8 @@ test_compressdev_deflate_stateful_decomp_checksum(void) .out_of_space = 0, .big_data = 0, .decompress_output_block_size = 2000, - .decompress_steps_max = 4 + .decompress_steps_max = 4, + .overflow = OVERFLOW_DISABLED }; /* Check if driver supports crc32 checksum and test */ @@ -2441,7 +2542,8 @@ test_compressdev_external_mbufs(void) .inbuf_memzone = make_memzone("inbuf", data_len), .compbuf_memzone = make_memzone("compbuf", data_len * COMPRESS_BUF_SIZE_RATIO), - .uncompbuf_memzone = make_memzone("decompbuf", data_len) + .uncompbuf_memzone = make_memzone("decompbuf", data_len), + .overflow = OVERFLOW_DISABLED }; for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { @@ -2472,6 +2574,88 @@ test_compressdev_external_mbufs(void) return ret; } +static int +test_compressdev_deflate_stateless_fixed_oos_recoverable(void) +{ + struct comp_testsuite_params *ts_params = &testsuite_params; + uint16_t i; + int ret; + int comp_result; + const struct rte_compressdev_capabilities *capab; + + capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE); + TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities"); + + if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0) + return -ENOTSUP; + + struct rte_comp_xform *compress_xform = + rte_malloc(NULL, sizeof(struct rte_comp_xform), 0); + + if (compress_xform == NULL) { + RTE_LOG(ERR, USER1, + "Compress xform could not be created\n"); + ret = TEST_FAILED; + goto exit; + } + + memcpy(compress_xform, ts_params->def_comp_xform, + sizeof(struct rte_comp_xform)); + compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED; + + struct interim_data_params int_data = { + NULL, + 1, + NULL, + &compress_xform, + &ts_params->def_decomp_xform, + 1 + }; + + struct test_data_params test_data = { + .compress_state = RTE_COMP_OP_STATELESS, + .decompress_state = RTE_COMP_OP_STATELESS, + .buff_type = LB_BOTH, + .zlib_dir = ZLIB_DECOMPRESS, + .out_of_space = 0, + .big_data = 0, + .overflow = OVERFLOW_ENABLED + }; + + for (i = 0; i < RTE_DIM(compress_test_bufs); i++) { + int_data.test_bufs = &compress_test_bufs[i]; + int_data.buf_idx = &i; + + /* Compress with compressdev, decompress with Zlib */ + test_data.zlib_dir = ZLIB_DECOMPRESS; + comp_result = test_deflate_comp_decomp(&int_data, &test_data); + if (comp_result < 0) { + ret = TEST_FAILED; + goto exit; + } else if (comp_result > 0) { + ret = -ENOTSUP; + goto exit; + } + + /* Compress with Zlib, decompress with compressdev */ + test_data.zlib_dir = ZLIB_COMPRESS; + comp_result = test_deflate_comp_decomp(&int_data, &test_data); + if (comp_result < 0) { + ret = TEST_FAILED; + goto exit; + } else if (comp_result > 0) { + ret = -ENOTSUP; + goto exit; + } + } + + ret = TEST_SUCCESS; + +exit: + rte_free(compress_xform); + return ret; +} + static struct unit_test_suite compressdev_testsuite = { .suite_name = "compressdev unit test suite", .setup = testsuite_setup, @@ -2503,6 +2687,8 @@ static struct unit_test_suite compressdev_testsuite = { test_compressdev_deflate_stateful_decomp_checksum), TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, test_compressdev_external_mbufs), + TEST_CASE_ST(generic_ut_setup, generic_ut_teardown, + test_compressdev_deflate_stateless_fixed_oos_recoverable), TEST_CASES_END() /**< NULL terminate unit test array */ } }; -- 2.17.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 1/2] compress/qat: overflow catch " Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula @ 2019-10-16 11:16 ` Trahe, Fiona 2019-10-16 13:13 ` Akhil Goyal 2 siblings, 1 reply; 16+ messages in thread From: Trahe, Fiona @ 2019-10-16 11:16 UTC (permalink / raw) To: Trybula, ArturX, dev, shallyv, Dybkowski, AdamX, akhil.goyal > -----Original Message----- > From: Trybula, ArturX > Sent: Wednesday, October 16, 2019 10:41 AM > To: dev@dpdk.org; Trahe, Fiona <fiona.trahe@intel.com>; shallyv@marvell.com; Dybkowski, AdamX > <adamx.dybkowski@intel.com>; Trybula, ArturX <arturx.trybula@intel.com>; akhil.goyal@nxp.com > Subject: [PATCH v4 0/2] Add overflow recovery for stateless compression > > This patch adds out-of-space recoverable feature for stateless > compression scenario to QuickAssist compressdev driver. Unit test > was also created to verify the new feature. > > v4: - if a device doesn't support out-of-space recoverable feature, > then instead of "failed", "unsupported" result will be > printed out on the screen > > v3: - rebasing onto the recent master > > v2: - rebasing over the external mbufs > > Artur Trybula (2): > compress/qat: overflow catch for stateless compression > test/compress: unit test for stateless overflow recovery > > app/test/test_compressdev.c | 280 ++++++++++++++++++++++++++------ > drivers/compress/qat/qat_comp.c | 28 +++- > 2 files changed, 258 insertions(+), 50 deletions(-) > > -- > 2.17.1 Series Acked-by: Fiona Trahe <fiona.trahe@intel.com> ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression 2019-10-16 11:16 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Trahe, Fiona @ 2019-10-16 13:13 ` Akhil Goyal 0 siblings, 0 replies; 16+ messages in thread From: Akhil Goyal @ 2019-10-16 13:13 UTC (permalink / raw) To: Trahe, Fiona, Trybula, ArturX, dev, shallyv, Dybkowski, AdamX > > > -----Original Message----- > > From: Trybula, ArturX > > Sent: Wednesday, October 16, 2019 10:41 AM > > To: dev@dpdk.org; Trahe, Fiona <fiona.trahe@intel.com>; > shallyv@marvell.com; Dybkowski, AdamX > > <adamx.dybkowski@intel.com>; Trybula, ArturX <arturx.trybula@intel.com>; > akhil.goyal@nxp.com > > Subject: [PATCH v4 0/2] Add overflow recovery for stateless compression > > > > This patch adds out-of-space recoverable feature for stateless > > compression scenario to QuickAssist compressdev driver. Unit test > > was also created to verify the new feature. > > > > v4: - if a device doesn't support out-of-space recoverable feature, > > then instead of "failed", "unsupported" result will be > > printed out on the screen > > > > v3: - rebasing onto the recent master > > > > v2: - rebasing over the external mbufs > > > > Artur Trybula (2): > > compress/qat: overflow catch for stateless compression > > test/compress: unit test for stateless overflow recovery > > > > app/test/test_compressdev.c | 280 ++++++++++++++++++++++++++------ > > drivers/compress/qat/qat_comp.c | 28 +++- > > 2 files changed, 258 insertions(+), 50 deletions(-) > > > > -- > > 2.17.1 > Series > Acked-by: Fiona Trahe <fiona.trahe@intel.com> Applied to dpdk-next-crypto Thanks. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2019-10-16 13:13 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-09-06 11:11 [dpdk-dev] [PATCH 1/2] compress/qat: overflow catching Artur Trybula 2019-09-06 11:11 ` [dpdk-dev] [PATCH 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 1/2] compress/qat: overflow catch " Artur Trybula 2019-09-26 9:32 ` [dpdk-dev] [PATCH v2 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 1/2] compress/qat: overflow catch " Artur Trybula 2019-10-14 13:38 ` Trahe, Fiona 2019-10-11 17:46 ` [dpdk-dev] [PATCH v3 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-14 13:48 ` Trahe, Fiona 2019-10-14 14:20 ` Trybula, ArturX 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 1/2] compress/qat: overflow catch " Artur Trybula 2019-10-16 9:40 ` [dpdk-dev] [PATCH v4 2/2] test/compress: unit test for stateless overflow recovery Artur Trybula 2019-10-16 11:16 ` [dpdk-dev] [PATCH v4 0/2] Add overflow recovery for stateless compression Trahe, Fiona 2019-10-16 13:13 ` Akhil Goyal
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).