@@ -32,9 +32,9 @@ enum cperf_test_type {
};
enum comp_operation {
- COMPRESS_ONLY,
- DECOMPRESS_ONLY,
- COMPRESS_DECOMPRESS
+ COMPRESS = (1 << 0),
+ DECOMPRESS = (1 << 1),
+ COMPRESS_DECOMPRESS = (COMPRESS | DECOMPRESS),
};
struct range_list {
@@ -446,11 +446,11 @@ parse_op_type(struct comp_test_data *test_data, const char *arg)
struct name_id_map optype_namemap[] = {
{
"comp",
- COMPRESS_ONLY
+ COMPRESS
},
{
"decomp",
- DECOMPRESS_ONLY
+ DECOMPRESS
},
{
"comp_and_decomp",
@@ -227,23 +227,43 @@ comp_perf_allocate_memory(struct comp_test_data *test_data,
{
uint16_t comp_mbuf_size;
uint16_t decomp_mbuf_size;
+ size_t comp_data_size;
+ size_t decomp_data_size;
+ size_t output_data_sz;
test_data->out_seg_sz = find_buf_size(test_data->seg_sz);
- /* Number of segments for input and output
- * (compression and decompression)
- */
- test_data->total_segs = DIV_CEIL(test_data->input_data_sz,
- test_data->seg_sz);
+ if (test_data->test_op & COMPRESS) {
+ /*
+ * Number of segments for input and output
+ * (compression and decompression)
+ */
+ test_data->total_segs = DIV_CEIL(test_data->input_data_sz,
+ test_data->seg_sz);
+ } else {
+ /*
+ * When application does decompression only, input data is
+ * compressed and smaller than the output. The expected size of
+ * uncompressed data given by the user in segment size argument.
+ */
+ test_data->total_segs = test_data->max_sgl_segs;
+ }
+
+ output_data_sz = (size_t) test_data->out_seg_sz * test_data->total_segs;
+ output_data_sz =
+ RTE_MAX(output_data_sz, (size_t) MIN_COMPRESSED_BUF_SIZE);
if (test_data->use_external_mbufs != 0) {
if (comp_perf_allocate_external_mbufs(test_data, mem) < 0)
return -1;
comp_mbuf_size = 0;
decomp_mbuf_size = 0;
- } else {
+ } else if (test_data->test_op & COMPRESS) {
comp_mbuf_size = test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM;
decomp_mbuf_size = test_data->seg_sz + RTE_PKTMBUF_HEADROOM;
+ } else {
+ comp_mbuf_size = test_data->seg_sz + RTE_PKTMBUF_HEADROOM;
+ decomp_mbuf_size = test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM;
}
char pool_name[32] = "";
@@ -287,26 +307,28 @@ comp_perf_allocate_memory(struct comp_test_data *test_data,
return -1;
}
- /*
- * Compressed data might be a bit larger than input data,
- * if data cannot be compressed
- */
- mem->compressed_data = rte_zmalloc_socket(NULL,
- RTE_MAX(
- (size_t) test_data->out_seg_sz *
- test_data->total_segs,
- (size_t) MIN_COMPRESSED_BUF_SIZE),
- 0,
- rte_socket_id());
+ if (test_data->test_op & COMPRESS) {
+ /*
+ * Compressed data might be a bit larger than input data,
+ * if data cannot be compressed
+ */
+ comp_data_size = output_data_sz;
+ decomp_data_size = test_data->input_data_sz;
+ } else {
+ comp_data_size = test_data->input_data_sz;
+ decomp_data_size = output_data_sz;
+ }
+
+ mem->compressed_data = rte_zmalloc_socket(NULL, comp_data_size, 0,
+ rte_socket_id());
if (mem->compressed_data == NULL) {
RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
"file could not be allocated\n");
return -1;
}
- mem->decompressed_data = rte_zmalloc_socket(NULL,
- test_data->input_data_sz, 0,
- rte_socket_id());
+ mem->decompressed_data = rte_zmalloc_socket(NULL, decomp_data_size, 0,
+ rte_socket_id());
if (mem->decompressed_data == NULL) {
RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
"file could not be allocated\n");
@@ -351,6 +373,7 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
uint16_t segs_per_mbuf = 0;
uint32_t cmz = 0;
uint32_t dmz = 0;
+ bool decompress_only = !!(test_data->test_op == DECOMPRESS);
for (i = 0; i < mem->total_bufs; i++) {
/* Allocate data in input mbuf and copy data from input file */
@@ -361,8 +384,6 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
return -1;
}
- data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
-
if (test_data->use_external_mbufs != 0) {
rte_pktmbuf_attach_extbuf(mem->decomp_bufs[i],
mem->decomp_memzones[dmz]->addr,
@@ -372,16 +393,23 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
dmz++;
}
+ if (!decompress_only)
+ data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
+ else
+ data_sz = test_data->out_seg_sz;
+
data_addr = (uint8_t *) rte_pktmbuf_append(
mem->decomp_bufs[i], data_sz);
if (data_addr == NULL) {
RTE_LOG(ERR, USER1, "Could not append data\n");
return -1;
}
- rte_memcpy(data_addr, input_data_ptr, data_sz);
- input_data_ptr += data_sz;
- remaining_data -= data_sz;
+ if (!decompress_only) {
+ rte_memcpy(data_addr, input_data_ptr, data_sz);
+ input_data_ptr += data_sz;
+ remaining_data -= data_sz;
+ }
/* Already one segment in the mbuf */
segs_per_mbuf = 1;
@@ -398,8 +426,6 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
return -1;
}
- data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
-
if (test_data->use_external_mbufs != 0) {
rte_pktmbuf_attach_extbuf(
next_seg,
@@ -410,6 +436,12 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
dmz++;
}
+ if (!decompress_only)
+ data_sz = RTE_MIN(remaining_data,
+ test_data->seg_sz);
+ else
+ data_sz = test_data->out_seg_sz;
+
data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
data_sz);
@@ -418,9 +450,11 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
return -1;
}
- rte_memcpy(data_addr, input_data_ptr, data_sz);
- input_data_ptr += data_sz;
- remaining_data -= data_sz;
+ if (!decompress_only) {
+ rte_memcpy(data_addr, input_data_ptr, data_sz);
+ input_data_ptr += data_sz;
+ remaining_data -= data_sz;
+ }
if (rte_pktmbuf_chain(mem->decomp_bufs[i],
next_seg) < 0) {
@@ -447,16 +481,26 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
cmz++;
}
- data_addr = (uint8_t *) rte_pktmbuf_append(
- mem->comp_bufs[i],
- test_data->out_seg_sz);
+ if (decompress_only)
+ data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
+ else
+ data_sz = test_data->out_seg_sz;
+
+ data_addr = (uint8_t *) rte_pktmbuf_append(mem->comp_bufs[i],
+ data_sz);
if (data_addr == NULL) {
RTE_LOG(ERR, USER1, "Could not append data\n");
return -1;
}
+ if (decompress_only) {
+ rte_memcpy(data_addr, input_data_ptr, data_sz);
+ input_data_ptr += data_sz;
+ remaining_data -= data_sz;
+ }
+
/* Chain mbufs if needed for output mbufs */
- for (j = 1; j < segs_per_mbuf; j++) {
+ for (j = 1; j < segs_per_mbuf && remaining_data > 0; j++) {
struct rte_mbuf *next_seg =
rte_pktmbuf_alloc(mem->comp_buf_pool);
@@ -476,13 +520,25 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
cmz++;
}
+ if (decompress_only)
+ data_sz = RTE_MIN(remaining_data,
+ test_data->seg_sz);
+ else
+ data_sz = test_data->out_seg_sz;
+
data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
- test_data->out_seg_sz);
+ data_sz);
if (data_addr == NULL) {
RTE_LOG(ERR, USER1, "Could not append data\n");
return -1;
}
+ if (decompress_only) {
+ rte_memcpy(data_addr, input_data_ptr, data_sz);
+ input_data_ptr += data_sz;
+ remaining_data -= data_sz;
+ }
+
if (rte_pktmbuf_chain(mem->comp_bufs[i],
next_seg) < 0) {
RTE_LOG(ERR, USER1, "Could not chain mbufs\n");
@@ -514,38 +514,55 @@ cperf_cyclecount_test_runner(void *test_ctx)
if (cperf_verify_test_runner(&ctx->ver))
return EXIT_FAILURE;
- /*
- * Run the tests twice, discarding the first performance
- * results, before the cache is warmed up
- */
-
- /* C O M P R E S S */
- for (i = 0; i < 2; i++) {
- if (main_loop(ctx, RTE_COMP_COMPRESS) < 0)
- return EXIT_FAILURE;
- }
+ if (test_data->test_op & COMPRESS) {
+ /*
+ * Run the test twice, discarding the first performance
+ * results, before the cache is warmed up
+ */
+ for (i = 0; i < 2; i++) {
+ if (main_loop(ctx, RTE_COMP_COMPRESS) < 0)
+ return EXIT_FAILURE;
+ }
- ops_enq_retries_comp = ctx->ops_enq_retries;
- ops_deq_retries_comp = ctx->ops_deq_retries;
+ ops_enq_retries_comp = ctx->ops_enq_retries;
+ ops_deq_retries_comp = ctx->ops_deq_retries;
- duration_enq_per_op_comp = ctx->duration_enq /
- (ctx->ver.mem.total_bufs * test_data->num_iter);
- duration_deq_per_op_comp = ctx->duration_deq /
- (ctx->ver.mem.total_bufs * test_data->num_iter);
+ duration_enq_per_op_comp = ctx->duration_enq /
+ (ctx->ver.mem.total_bufs * test_data->num_iter);
+ duration_deq_per_op_comp = ctx->duration_deq /
+ (ctx->ver.mem.total_bufs * test_data->num_iter);
+ } else {
+ ops_enq_retries_comp = 0;
+ ops_deq_retries_comp = 0;
- /* D E C O M P R E S S */
- for (i = 0; i < 2; i++) {
- if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0)
- return EXIT_FAILURE;
+ duration_enq_per_op_comp = 0;
+ duration_deq_per_op_comp = 0;
}
- ops_enq_retries_decomp = ctx->ops_enq_retries;
- ops_deq_retries_decomp = ctx->ops_deq_retries;
+ if (test_data->test_op & DECOMPRESS) {
+ /*
+ * Run the test twice, discarding the first performance
+ * results, before the cache is warmed up
+ */
+ for (i = 0; i < 2; i++) {
+ if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0)
+ return EXIT_FAILURE;
+ }
- duration_enq_per_op_decomp = ctx->duration_enq /
- (ctx->ver.mem.total_bufs * test_data->num_iter);
- duration_deq_per_op_decomp = ctx->duration_deq /
- (ctx->ver.mem.total_bufs * test_data->num_iter);
+ ops_enq_retries_decomp = ctx->ops_enq_retries;
+ ops_deq_retries_decomp = ctx->ops_deq_retries;
+
+ duration_enq_per_op_decomp = ctx->duration_enq /
+ (ctx->ver.mem.total_bufs * test_data->num_iter);
+ duration_deq_per_op_decomp = ctx->duration_deq /
+ (ctx->ver.mem.total_bufs * test_data->num_iter);
+ } else {
+ ops_enq_retries_decomp = 0;
+ ops_deq_retries_decomp = 0;
+
+ duration_enq_per_op_decomp = 0;
+ duration_deq_per_op_decomp = 0;
+ }
duration_setup_per_op = ctx->duration_op /
(ctx->ver.mem.total_bufs * test_data->num_iter);
@@ -359,41 +359,53 @@ cperf_throughput_test_runner(void *test_ctx)
* First the verification part is needed
*/
if (cperf_verify_test_runner(&ctx->ver)) {
- ret = EXIT_FAILURE;
+ ret = EXIT_FAILURE;
goto end;
}
- /*
- * Run the tests twice, discarding the first performance
- * results, before the cache is warmed up
- */
- for (i = 0; i < 2; i++) {
- if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
- ret = EXIT_FAILURE;
- goto end;
+ if (test_data->test_op & COMPRESS) {
+ /*
+ * Run the test twice, discarding the first performance
+ * results, before the cache is warmed up
+ */
+ for (i = 0; i < 2; i++) {
+ if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
+ ret = EXIT_FAILURE;
+ goto end;
+ }
}
- }
- for (i = 0; i < 2; i++) {
- if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
- ret = EXIT_FAILURE;
- goto end;
- }
+ ctx->comp_tsc_byte =
+ (double)(ctx->comp_tsc_duration[test_data->level]) /
+ test_data->input_data_sz;
+ ctx->comp_gbps = rte_get_tsc_hz() / ctx->comp_tsc_byte * 8 /
+ 1000000000;
+ } else {
+ ctx->comp_tsc_byte = 0;
+ ctx->comp_gbps = 0;
}
- ctx->comp_tsc_byte =
- (double)(ctx->comp_tsc_duration[test_data->level]) /
- test_data->input_data_sz;
+ if (test_data->test_op & DECOMPRESS) {
+ /*
+ * Run the test twice, discarding the first performance
+ * results, before the cache is warmed up
+ */
+ for (i = 0; i < 2; i++) {
+ if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
+ ret = EXIT_FAILURE;
+ goto end;
+ }
+ }
- ctx->decomp_tsc_byte =
+ ctx->decomp_tsc_byte =
(double)(ctx->decomp_tsc_duration[test_data->level]) /
- test_data->input_data_sz;
-
- ctx->comp_gbps = rte_get_tsc_hz() / ctx->comp_tsc_byte * 8 /
- 1000000000;
-
- ctx->decomp_gbps = rte_get_tsc_hz() / ctx->decomp_tsc_byte * 8 /
- 1000000000;
+ test_data->input_data_sz;
+ ctx->decomp_gbps = rte_get_tsc_hz() / ctx->decomp_tsc_byte * 8 /
+ 1000000000;
+ } else {
+ ctx->decomp_tsc_byte = 0;
+ ctx->decomp_gbps = 0;
+ }
exp = 0;
if (__atomic_compare_exchange_n(&display_once, &exp, 1, 0,
@@ -114,7 +114,8 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type)
output_data_sz = &ctx->decomp_data_sz;
input_bufs = mem->comp_bufs;
output_bufs = mem->decomp_bufs;
- out_seg_sz = test_data->seg_sz;
+ out_seg_sz = (test_data->test_op & COMPRESS) ?
+ test_data->seg_sz : test_data->out_seg_sz;
}
/* Create private xform */
@@ -392,44 +393,59 @@ cperf_verify_test_runner(void *test_ctx)
int ret = EXIT_SUCCESS;
static uint16_t display_once;
uint32_t lcore = rte_lcore_id();
+ uint16_t exp = 0;
ctx->mem.lcore_id = lcore;
test_data->ratio = 0;
- if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
- ret = EXIT_FAILURE;
- goto end;
+ if (test_data->test_op & COMPRESS) {
+ if (main_loop(ctx, RTE_COMP_COMPRESS) < 0) {
+ ret = EXIT_FAILURE;
+ goto end;
+ }
}
- if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
- ret = EXIT_FAILURE;
- goto end;
- }
+ if (test_data->test_op & DECOMPRESS) {
+ if (main_loop(ctx, RTE_COMP_DECOMPRESS) < 0) {
+ ret = EXIT_FAILURE;
+ goto end;
+ }
- if (ctx->decomp_data_sz != test_data->input_data_sz) {
- RTE_LOG(ERR, USER1,
- "Decompressed data length not equal to input data length\n");
- RTE_LOG(ERR, USER1,
- "Decompressed size = %zu, expected = %zu\n",
- ctx->decomp_data_sz, test_data->input_data_sz);
- ret = EXIT_FAILURE;
- goto end;
- } else {
- if (memcmp(ctx->mem.decompressed_data,
- test_data->input_data,
- test_data->input_data_sz) != 0) {
+ if (!(test_data->test_op & COMPRESS)) {
+ /*
+ * For DECOMPRESS_ONLY mode there is no more
+ * verifications, reset the 'ratio' and 'comp_data_sz'
+ * fields for other tests report.
+ */
+ ctx->comp_data_sz = 0;
+ ctx->ratio = 0;
+ goto end;
+ }
+
+ if (ctx->decomp_data_sz != test_data->input_data_sz) {
+ RTE_LOG(ERR, USER1,
+ "Decompressed data length not equal to input data length\n");
RTE_LOG(ERR, USER1,
- "Decompressed data is not the same as file data\n");
+ "Decompressed size = %zu, expected = %zu\n",
+ ctx->decomp_data_sz, test_data->input_data_sz);
ret = EXIT_FAILURE;
goto end;
+ } else {
+ if (memcmp(ctx->mem.decompressed_data,
+ test_data->input_data,
+ test_data->input_data_sz) != 0) {
+ RTE_LOG(ERR, USER1,
+ "Decompressed data is not the same as file data\n");
+ ret = EXIT_FAILURE;
+ goto end;
+ }
}
}
ctx->ratio = (double) ctx->comp_data_sz /
test_data->input_data_sz * 100;
- uint16_t exp = 0;
if (!ctx->silent) {
if (__atomic_compare_exchange_n(&display_once, &exp, 1, 0,
__ATOMIC_RELAXED, __ATOMIC_RELAXED)) {
@@ -254,6 +254,14 @@ comp_perf_dump_input_data(struct comp_test_data *test_data)
goto end;
}
+ if (!(test_data->test_op & COMPRESS) &&
+ test_data->input_data_sz >
+ (size_t) test_data->seg_sz * (size_t) test_data->max_sgl_segs) {
+ RTE_LOG(ERR, USER1,
+ "Size of input must be less than total segments\n");
+ goto end;
+ }
+
test_data->input_data = rte_zmalloc_socket(NULL,
test_data->input_data_sz, 0, rte_socket_id());