app/compress-perf: prevent output buffer overflow

This patch fixes the issue of memory overwrite after the end of
the output buffer by calculating its size as the number of all
segments multipled by the output segment size.
Additionally buffer overflow errors returned by PMD driver are
detected and shown, ending the test.

Also the output buffer size multiplier was increased from 105%
to 110% to allow running the tests on noncompressible files that
expand to over 107% of original size during the compression.

The changes were made in the verification part of the flow and
they don't affect the benchmark results.

Fixes: 424dd6c8c1 ("app/compress-perf: add weak functions for multicore test")

Signed-off-by: Adam Dybkowski <adamx.dybkowski@intel.com>
Acked-by: Fiona Trahe <fiona.trahe@intel.com>
This commit is contained in:
Adam Dybkowski 2019-07-23 11:53:28 +02:00 committed by Akhil Goyal
parent 6f1e5d809a
commit 971d89f511
3 changed files with 25 additions and 7 deletions

View File

@ -7,7 +7,7 @@
#define MAX_LIST 32 #define MAX_LIST 32
#define MIN_COMPRESSED_BUF_SIZE 8 #define MIN_COMPRESSED_BUF_SIZE 8
#define EXPANSE_RATIO 1.05 #define EXPANSE_RATIO 1.1
#define MAX_MBUF_DATA_SIZE (UINT16_MAX - RTE_PKTMBUF_HEADROOM) #define MAX_MBUF_DATA_SIZE (UINT16_MAX - RTE_PKTMBUF_HEADROOM)
#define MAX_SEG_SIZE ((int)(MAX_MBUF_DATA_SIZE / EXPANSE_RATIO)) #define MAX_SEG_SIZE ((int)(MAX_MBUF_DATA_SIZE / EXPANSE_RATIO))

View File

@ -147,8 +147,10 @@ comp_perf_allocate_memory(struct comp_test_data *test_data,
* if data cannot be compressed * if data cannot be compressed
*/ */
mem->compressed_data = rte_zmalloc_socket(NULL, mem->compressed_data = rte_zmalloc_socket(NULL,
test_data->input_data_sz * EXPANSE_RATIO RTE_MAX(
+ MIN_COMPRESSED_BUF_SIZE, 0, (size_t) test_data->out_seg_sz * total_segs,
(size_t) MIN_COMPRESSED_BUF_SIZE),
0,
rte_socket_id()); rte_socket_id());
if (mem->compressed_data == NULL) { if (mem->compressed_data == NULL) {
RTE_LOG(ERR, USER1, "Memory to hold the data from the input " RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
@ -287,7 +289,6 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
data_addr = (uint8_t *)rte_pktmbuf_append(next_seg, data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
test_data->out_seg_sz); test_data->out_seg_sz);
if (data_addr == NULL) { if (data_addr == NULL) {
RTE_LOG(ERR, USER1, "Could not append data\n"); RTE_LOG(ERR, USER1, "Could not append data\n");
return -1; return -1;

View File

@ -217,7 +217,16 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type)
for (i = 0; i < num_deq; i++) { for (i = 0; i < num_deq; i++) {
struct rte_comp_op *op = deq_ops[i]; struct rte_comp_op *op = deq_ops[i];
if (op->status != RTE_COMP_OP_STATUS_SUCCESS) { if (op->status ==
RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
op->status ==
RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
RTE_LOG(ERR, USER1,
"Out of space error occurred due to uncompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n");
res = -1;
goto end;
} else if (op->status !=
RTE_COMP_OP_STATUS_SUCCESS) {
RTE_LOG(ERR, USER1, RTE_LOG(ERR, USER1,
"Some operations were not successful\n"); "Some operations were not successful\n");
goto end; goto end;
@ -293,12 +302,20 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type)
for (i = 0; i < num_deq; i++) { for (i = 0; i < num_deq; i++) {
struct rte_comp_op *op = deq_ops[i]; struct rte_comp_op *op = deq_ops[i];
if (op->status != RTE_COMP_OP_STATUS_SUCCESS) { if (op->status ==
RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED ||
op->status ==
RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
RTE_LOG(ERR, USER1,
"Out of space error occurred due to uncompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n");
res = -1;
goto end;
} else if (op->status !=
RTE_COMP_OP_STATUS_SUCCESS) {
RTE_LOG(ERR, USER1, RTE_LOG(ERR, USER1,
"Some operations were not successful\n"); "Some operations were not successful\n");
goto end; goto end;
} }
const void *read_data_addr = const void *read_data_addr =
rte_pktmbuf_read(op->m_dst, rte_pktmbuf_read(op->m_dst,
op->dst.offset, op->dst.offset,