From: Lee Daly <lee.daly@intel.com>
To: fiona.trahe@intel.com
Cc: dev@dpdk.org, Lee Daly <lee.daly@intel.com>
Subject: [dpdk-dev] [PATCH v2] test/compress: add mbuf offset unit test
Date: Tue, 27 Nov 2018 10:30:58 +0000 [thread overview]
Message-ID: <1543314658-147566-1-git-send-email-lee.daly@intel.com> (raw)
In-Reply-To: <1532441167-101058-1-git-send-email-lee.daly@intel.com>
added mbuf offset test to compressdev test suite, which tests compression/
decompression with a mbuf containing an offset spanning across mulitple segments
Signed-off-by: Lee Daly <lee.daly@intel.com>
---
test/test/test_compressdev.c | 241 ++++++++++++++++++++++++++++++++++---------
1 file changed, 193 insertions(+), 48 deletions(-)
diff --git a/test/test/test_compressdev.c b/test/test/test_compressdev.c
index 5d5e519..91dd636 100644
--- a/test/test/test_compressdev.c
+++ b/test/test/test_compressdev.c
@@ -35,6 +35,7 @@
#define NUM_MAX_XFORMS 16
#define NUM_MAX_INFLIGHT_OPS 128
#define CACHE_SIZE 0
+#define OFFSET 800
const char *
huffman_type_strings[] = {
@@ -93,7 +94,7 @@ testsuite_setup(void)
for (i = 0; i < RTE_DIM(compress_test_bufs); i++)
max_buf_size = RTE_MAX(max_buf_size,
- strlen(compress_test_bufs[i]) + 1);
+ (strlen(compress_test_bufs[i]) + OFFSET + 1));
/*
* Buffers to be used in compression and decompression.
@@ -347,8 +348,9 @@ compress_zlib(struct rte_comp_op *op,
RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
goto exit;
}
- if (rte_pktmbuf_read(op->m_src, 0,
- rte_pktmbuf_pkt_len(op->m_src),
+ if (rte_pktmbuf_read(op->m_src, op->src.offset,
+ rte_pktmbuf_pkt_len(op->m_src) -
+ op->src.offset,
single_src_buf) == NULL) {
RTE_LOG(ERR, USER1,
"Buffer could not be read entirely\n");
@@ -362,9 +364,11 @@ compress_zlib(struct rte_comp_op *op,
} else {
stream.avail_in = op->src.length;
- stream.next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *);
+ stream.next_in = rte_pktmbuf_mtod_offset(op->m_src, uint8_t *,
+ op->src.offset);
stream.avail_out = op->m_dst->data_len;
- stream.next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *);
+ stream.next_out = rte_pktmbuf_mtod_offset(op->m_dst, uint8_t *,
+ op->dst.offset);
}
/* Stateless operation, all buffer will be compressed in one go */
zlib_flush = map_zlib_flush_flag(op->flush_flag);
@@ -384,9 +388,26 @@ compress_zlib(struct rte_comp_op *op,
uint8_t *src_data = single_dst_buf;
struct rte_mbuf *dst_buf = op->m_dst;
+ uint32_t remaining_offset = op->dst.offset;
+ while (remaining_offset >= dst_buf->data_len) {
+ remaining_offset -= dst_buf->data_len;
+ dst_buf = dst_buf->next;
+ }
+
+ /* First Segment */
+ uint8_t *dst_data = rte_pktmbuf_mtod_offset(dst_buf, uint8_t *,
+ op->dst.offset % dst_buf->data_len);
+ memcpy(dst_data, src_data, dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len));
+ remaining_data -= dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len);
+ src_data += dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len);
+ dst_buf = dst_buf->next;
+
+
while (remaining_data > 0) {
- uint8_t *dst_data = rte_pktmbuf_mtod(dst_buf,
- uint8_t *);
+ dst_data = rte_pktmbuf_mtod(dst_buf, uint8_t *);
/* Last segment */
if (remaining_data < dst_buf->data_len) {
memcpy(dst_data, src_data, remaining_data);
@@ -459,8 +480,9 @@ decompress_zlib(struct rte_comp_op *op,
RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
goto exit;
}
- if (rte_pktmbuf_read(op->m_src, 0,
- rte_pktmbuf_pkt_len(op->m_src),
+ if (rte_pktmbuf_read(op->m_src, op->src.offset,
+ rte_pktmbuf_pkt_len(op->m_src) -
+ op->src.offset,
single_src_buf) == NULL) {
RTE_LOG(ERR, USER1,
"Buffer could not be read entirely\n");
@@ -474,9 +496,11 @@ decompress_zlib(struct rte_comp_op *op,
} else {
stream.avail_in = op->src.length;
- stream.next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *);
+ stream.next_in = rte_pktmbuf_mtod_offset(op->m_src, uint8_t *,
+ op->src.offset);
stream.avail_out = op->m_dst->data_len;
- stream.next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *);
+ stream.next_out = rte_pktmbuf_mtod_offset(op->m_dst, uint8_t *,
+ op->dst.offset);
}
/* Stateless operation, all buffer will be compressed in one go */
@@ -496,8 +520,25 @@ decompress_zlib(struct rte_comp_op *op,
uint8_t *src_data = single_dst_buf;
struct rte_mbuf *dst_buf = op->m_dst;
+ uint32_t remaining_offset = op->dst.offset;
+ while (remaining_offset >= dst_buf->data_len) {
+ remaining_offset -= dst_buf->data_len;
+ dst_buf = dst_buf->next;
+ }
+
+ uint8_t *dst_data = rte_pktmbuf_mtod_offset(dst_buf, uint8_t *,
+ op->dst.offset % dst_buf->data_len);
+ memcpy(dst_data, src_data, dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len));
+ remaining_data -= dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len);
+ src_data += dst_buf->data_len -
+ (op->dst.offset % dst_buf->data_len);
+ dst_buf = dst_buf->next;
+
+
while (remaining_data > 0) {
- uint8_t *dst_data = rte_pktmbuf_mtod(dst_buf,
+ dst_data = rte_pktmbuf_mtod(dst_buf,
uint8_t *);
/* Last segment */
if (remaining_data < dst_buf->data_len) {
@@ -530,17 +571,19 @@ prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf,
uint32_t total_data_size,
struct rte_mempool *small_mbuf_pool,
struct rte_mempool *large_mbuf_pool,
- uint8_t limit_segs_in_sgl)
+ uint8_t limit_segs_in_sgl,
+ uint16_t offset)
{
uint32_t remaining_data = total_data_size;
- uint16_t num_remaining_segs = DIV_CEIL(remaining_data, SMALL_SEG_SIZE);
+ uint16_t num_remaining_segs = DIV_CEIL(remaining_data + offset,
+ SMALL_SEG_SIZE);
struct rte_mempool *pool;
struct rte_mbuf *next_seg;
uint32_t data_size;
char *buf_ptr;
const char *data_ptr = test_buf;
uint16_t i;
- int ret;
+ int ret, remaining_offset;
if (limit_segs_in_sgl != 0 && num_remaining_segs > limit_segs_in_sgl)
num_remaining_segs = limit_segs_in_sgl - 1;
@@ -560,13 +603,14 @@ prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf,
return -1;
}
- if (data_ptr != NULL) {
+ if (data_ptr != NULL && offset < data_size) {
/* Copy characters without NULL terminator */
- strncpy(buf_ptr, data_ptr, data_size);
- data_ptr += data_size;
+ strncpy(buf_ptr + offset, data_ptr, data_size - offset);
+ data_ptr += data_size - offset;
+ remaining_data -= data_size - offset;
}
- remaining_data -= data_size;
num_remaining_segs--;
+ remaining_offset = offset - data_size;
/*
* Allocate the rest of the segments,
@@ -600,12 +644,21 @@ prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf,
rte_pktmbuf_free(next_seg);
return -1;
}
- if (data_ptr != NULL) {
+ if (data_ptr != NULL && remaining_offset < (int)data_size) {
/* Copy characters without NULL terminator */
- strncpy(buf_ptr, data_ptr, data_size);
- data_ptr += data_size;
+ if (remaining_data == total_data_size) {
+ strncpy(buf_ptr + remaining_offset, data_ptr,
+ data_size - remaining_offset);
+ data_ptr += data_size - remaining_offset;
+ remaining_data -= data_size - remaining_offset;
+ } else {
+ strncpy(buf_ptr, data_ptr, data_size);
+ data_ptr += data_size;
+ remaining_data -= data_size;
+ }
}
- remaining_data -= data_size;
+ if (remaining_data == total_data_size)
+ remaining_offset -= data_size;
ret = rte_pktmbuf_chain(head_buf, next_seg);
if (ret != 0) {
@@ -631,7 +684,8 @@ test_deflate_comp_decomp(const char * const test_bufs[],
unsigned int num_xforms,
enum rte_comp_op_type state,
unsigned int sgl,
- enum zlib_direction zlib_dir)
+ enum zlib_direction zlib_dir,
+ uint16_t offset)
{
struct comp_testsuite_params *ts_params = &testsuite_params;
int ret_status = -1;
@@ -682,14 +736,17 @@ test_deflate_comp_decomp(const char * const test_bufs[],
data_size,
ts_params->small_mbuf_pool,
ts_params->large_mbuf_pool,
- MAX_SEGS) < 0)
+ MAX_SEGS,
+ offset) < 0)
goto exit;
}
} 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);
- snprintf(buf_ptr, data_size, "%s", test_bufs[i]);
+ buf_ptr = rte_pktmbuf_append(uncomp_bufs[i],
+ data_size + offset);
+ snprintf(buf_ptr + offset, data_size, "%s",
+ test_bufs[i]);
}
}
@@ -710,7 +767,8 @@ test_deflate_comp_decomp(const char * const test_bufs[],
data_size,
ts_params->small_mbuf_pool,
ts_params->large_mbuf_pool,
- MAX_SEGS) < 0)
+ MAX_SEGS,
+ offset) < 0)
goto exit;
}
@@ -718,7 +776,7 @@ test_deflate_comp_decomp(const char * const test_bufs[],
for (i = 0; i < num_bufs; i++) {
data_size = strlen(test_bufs[i]) *
COMPRESS_BUF_SIZE_RATIO;
- rte_pktmbuf_append(comp_bufs[i], data_size);
+ rte_pktmbuf_append(comp_bufs[i], data_size + offset);
}
}
@@ -734,9 +792,9 @@ test_deflate_comp_decomp(const char * const test_bufs[],
for (i = 0; i < num_bufs; i++) {
ops[i]->m_src = uncomp_bufs[i];
ops[i]->m_dst = comp_bufs[i];
- ops[i]->src.offset = 0;
- ops[i]->src.length = rte_pktmbuf_pkt_len(uncomp_bufs[i]);
- ops[i]->dst.offset = 0;
+ ops[i]->src.offset = offset;
+ ops[i]->src.length = strlen(test_bufs[i]) + 1;
+ ops[i]->dst.offset = offset;
if (state == RTE_COMP_OP_STATELESS) {
ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
} else {
@@ -906,10 +964,11 @@ test_deflate_comp_decomp(const char * const test_bufs[],
(ops_processed[i] + 1);
data_size = strlen(test_bufs[priv_data->orig_idx]) + 1;
if (prepare_sgl_bufs(NULL, uncomp_bufs[i],
- data_size,
+ data_size + offset,
ts_params->small_mbuf_pool,
ts_params->large_mbuf_pool,
- MAX_SEGS) < 0)
+ MAX_SEGS,
+ 0) < 0)
goto exit;
}
@@ -918,7 +977,7 @@ test_deflate_comp_decomp(const char * const test_bufs[],
priv_data = (struct priv_op_data *)
(ops_processed[i] + 1);
data_size = strlen(test_bufs[priv_data->orig_idx]) + 1;
- rte_pktmbuf_append(uncomp_bufs[i], data_size);
+ rte_pktmbuf_append(uncomp_bufs[i], data_size + offset);
}
}
@@ -935,13 +994,13 @@ test_deflate_comp_decomp(const char * const test_bufs[],
for (i = 0; i < num_bufs; i++) {
ops[i]->m_src = ops_processed[i]->m_dst;
ops[i]->m_dst = uncomp_bufs[i];
- ops[i]->src.offset = 0;
+ ops[i]->src.offset = offset;
/*
* 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;
- ops[i]->dst.offset = 0;
+ ops[i]->dst.offset = offset;
if (state == RTE_COMP_OP_STATELESS) {
ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
} else {
@@ -1108,7 +1167,8 @@ test_deflate_comp_decomp(const char * const test_bufs[],
goto exit;
}
- buf2 = rte_pktmbuf_read(ops_processed[i]->m_dst, 0,
+ buf2 = rte_pktmbuf_read(ops_processed[i]->m_dst,
+ ops_processed[i]->dst.offset,
ops_processed[i]->produced, contig_buf);
if (compare_buffers(buf1, strlen(buf1) + 1,
@@ -1178,7 +1238,8 @@ test_compressdev_deflate_stateless_fixed(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_DECOMPRESS) < 0) {
+ ZLIB_DECOMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1191,7 +1252,8 @@ test_compressdev_deflate_stateless_fixed(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_COMPRESS) < 0) {
+ ZLIB_COMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1244,7 +1306,8 @@ test_compressdev_deflate_stateless_dynamic(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_DECOMPRESS) < 0) {
+ ZLIB_DECOMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1257,7 +1320,8 @@ test_compressdev_deflate_stateless_dynamic(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_COMPRESS) < 0) {
+ ZLIB_COMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1289,7 +1353,8 @@ test_compressdev_deflate_stateless_multi_op(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_DECOMPRESS) < 0)
+ ZLIB_DECOMPRESS,
+ 0) < 0)
return TEST_FAILED;
/* Compress with Zlib, decompress with compressdev */
@@ -1300,7 +1365,8 @@ test_compressdev_deflate_stateless_multi_op(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_COMPRESS) < 0)
+ ZLIB_COMPRESS,
+ 0) < 0)
return TEST_FAILED;
return TEST_SUCCESS;
@@ -1340,7 +1406,8 @@ test_compressdev_deflate_stateless_multi_level(void)
1,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_DECOMPRESS) < 0) {
+ ZLIB_DECOMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1411,7 +1478,8 @@ test_compressdev_deflate_stateless_multi_xform(void)
NUM_XFORMS,
RTE_COMP_OP_STATELESS,
0,
- ZLIB_DECOMPRESS) < 0) {
+ ZLIB_DECOMPRESS,
+ 0) < 0) {
ret = TEST_FAILED;
goto exit;
}
@@ -1450,7 +1518,8 @@ test_compressdev_deflate_stateless_sgl(void)
1,
RTE_COMP_OP_STATELESS,
1,
- ZLIB_DECOMPRESS) < 0)
+ ZLIB_COMPRESS,
+ 0) < 0)
return TEST_FAILED;
/* Compress with Zlib, decompress with compressdev */
@@ -1461,7 +1530,81 @@ test_compressdev_deflate_stateless_sgl(void)
1,
RTE_COMP_OP_STATELESS,
1,
- ZLIB_COMPRESS) < 0)
+ ZLIB_DECOMPRESS,
+ 0) < 0)
+ return TEST_FAILED;
+ }
+
+ return TEST_SUCCESS;
+}
+
+static int
+test_compressdev_deflate_stateless_offset(void)
+{
+ struct comp_testsuite_params *ts_params = &testsuite_params;
+ uint16_t i;
+ const char *test_buffer;
+ 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_OOP_SGL_IN_SGL_OUT)) {
+
+ /* Test SGL with offset, which spans across multiple segments */
+ for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
+ test_buffer = compress_test_bufs[i];
+ /* Compress with compressdev, decompress with Zlib */
+ if (test_deflate_comp_decomp(&test_buffer, 1,
+ &i,
+ &ts_params->def_comp_xform,
+ &ts_params->def_decomp_xform,
+ 1,
+ RTE_COMP_OP_STATELESS,
+ 1,
+ ZLIB_DECOMPRESS,
+ OFFSET) < 0)
+ return TEST_FAILED;
+
+ /* Compress with Zlib, decompress with compressdev */
+ if (test_deflate_comp_decomp(&test_buffer, 1,
+ &i,
+ &ts_params->def_comp_xform,
+ &ts_params->def_decomp_xform,
+ 1,
+ RTE_COMP_OP_STATELESS,
+ 1,
+ ZLIB_COMPRESS,
+ OFFSET) < 0)
+ return TEST_FAILED;
+ }
+ }
+
+ /* Test linear buffer with offset */
+ for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
+ test_buffer = compress_test_bufs[i];
+ /* Compress with compressdev, decompress with Zlib */
+ if (test_deflate_comp_decomp(&test_buffer, 1,
+ &i,
+ &ts_params->def_comp_xform,
+ &ts_params->def_decomp_xform,
+ 1,
+ RTE_COMP_OP_STATELESS,
+ 0,
+ ZLIB_DECOMPRESS,
+ OFFSET) < 0)
+ return TEST_FAILED;
+
+ /* Compress with Zlib, decompress with compressdev */
+ if (test_deflate_comp_decomp(&test_buffer, 1,
+ &i,
+ &ts_params->def_comp_xform,
+ &ts_params->def_decomp_xform,
+ 1,
+ RTE_COMP_OP_STATELESS,
+ 0,
+ ZLIB_COMPRESS,
+ OFFSET) < 0)
return TEST_FAILED;
}
@@ -1487,6 +1630,8 @@ static struct unit_test_suite compressdev_testsuite = {
test_compressdev_deflate_stateless_multi_xform),
TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
test_compressdev_deflate_stateless_sgl),
+ TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
+ test_compressdev_deflate_stateless_offset),
TEST_CASES_END() /**< NULL terminate unit test array */
}
};
--
2.7.4
next prev parent reply other threads:[~2018-11-27 10:31 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-24 14:06 [dpdk-dev] [PATCH] test/compress: add offset tests Lee Daly
2018-07-31 15:01 ` Thomas Monjalon
2018-07-31 15:05 ` Daly, Lee
2018-11-27 10:30 ` Lee Daly [this message]
2018-12-05 14:38 ` [dpdk-dev] [PATCH v3] test/compress: add mbuf offset unit test Lee Daly
2018-12-05 15:18 ` Jozwiak, TomaszX
2019-02-24 22:59 ` Thomas Monjalon
2019-02-25 8:56 ` Daly, Lee
2019-02-25 9:32 ` Thomas Monjalon
2019-02-25 9:39 ` Daly, Lee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1543314658-147566-1-git-send-email-lee.daly@intel.com \
--to=lee.daly@intel.com \
--cc=dev@dpdk.org \
--cc=fiona.trahe@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).