> -----Original Message-----
> From: Artur Trybula <arturx.tryb...@intel.com>
> Sent: Thursday, October 24, 2019 2:46 PM
> To: dev@dpdk.org; fiona.tr...@intel.com; Shally Verma
> <shal...@marvell.com>; adamx.dybkow...@intel.com;
> arturx.tryb...@intel.com; akhil.go...@nxp.com
> Subject: [EXT] [PATCH v3 1/1] test/compress: unit tests refactoring
> 
> External Email
> 
> ----------------------------------------------------------------------
> Core engine refactoring (test_deflate_comp_decomp function).
> Smaller specialized functions created.
> 
> Signed-off-by: Artur Trybula <arturx.tryb...@intel.com>
> ---
>  app/test/test_compressdev.c            | 1118 +++++++++++++++++-------
>  doc/guides/rel_notes/release_19_11.rst |    5 +
>  2 files changed, 826 insertions(+), 297 deletions(-)
> 
> diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c
> index 283c64971..4932bec76 100644
> --- a/app/test/test_compressdev.c
> +++ b/app/test/test_compressdev.c
> @@ -120,6 +120,20 @@ struct test_data_params {
>       enum overflow_test overflow;
>  };
> 
> +struct test_private_arrays {
> +     struct rte_mbuf **uncomp_bufs;
> +     struct rte_mbuf **comp_bufs;
> +     struct rte_comp_op **ops;
> +     struct rte_comp_op **ops_processed;
> +     void **priv_xforms;
> +     uint64_t *compress_checksum;
> +     uint32_t *compressed_data_size;
> +     void **stream;
> +     char **all_decomp_data;
> +     unsigned int *decomp_produced_data_size;
> +     uint16_t num_priv_xforms;
> +};
> +
>  static struct comp_testsuite_params testsuite_params = { 0 };
> 
>  static void
> @@ -662,6 +676,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,
> @@ -734,8 +749,9 @@ 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)
> +test_run_enqueue_dequeue(struct rte_comp_op **ops,
> +                      struct rte_comp_op **ops_processed,
> +                      unsigned int num_bufs)
>  {
>       uint16_t num_enqd, num_deqd, num_total_deqd;
>       unsigned int deqd_retries = 0;
> @@ -776,81 +792,77 @@ test_run_enqueue_dequeue(struct rte_comp_op
> **ops, unsigned int num_bufs,
>       return 0;
>  }
> 
> -/*
> - * Compresses and decompresses buffer with compressdev API and Zlib API
> +/**
> + * Initialize all the arrays used in comp/decomp to NULL.
> + *
> + * If the length is greater than the length of the last segment, the
> + * function will fail and return -1 without modifying the mbuf.
> + *
> + * @param prv
> + *   A container used for aggregation all the arrays.
> + * @param num_bufs
> + *   The number of elements in each array.
> + */
> +static void
> +test_objects_init(struct test_private_arrays *prv,
> +             unsigned int num_bufs)
> +{
> +     /* Initialize all arrays to NULL */
> +     memset(prv->uncomp_bufs, 0, sizeof(struct rte_mbuf *) *
> num_bufs);
> +     memset(prv->comp_bufs, 0, sizeof(struct rte_mbuf *) * num_bufs);
> +     memset(prv->ops, 0, sizeof(struct rte_comp_op *) * num_bufs);
> +     memset(prv->ops_processed, 0, sizeof(struct rte_comp_op *) *
> num_bufs);
> +     memset(prv->priv_xforms, 0, sizeof(void *) * num_bufs);
> +     memset(prv->compressed_data_size, 0, sizeof(uint32_t) *
> num_bufs); }
> +
Does it really matter what pointer is pointing to? Sizeof(any pointer) * 
num_bufs .. should be enough.

> +/**
> + * Source buffers preparation (for compression).
> + *
> + * Memory allocation for each buffer from mempool
> + * -1 returned if function fail, without modifying the mbuf.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 0: On success.
> + *   - -1: On error.
>   */
>  static int
> -test_deflate_comp_decomp(const struct interim_data_params *int_data,
> -             const struct test_data_params *test_data)
> +test_mbufs_source_preparation(const struct interim_data_params
> *int_data,
> +             const struct test_data_params *test_data,
> +             const struct test_private_arrays *priv_arrays)
>  {
> +     /* local variables: */
> +     unsigned int i;
> +     uint32_t data_size;
> +     char *buf_ptr;
> +     int ret;
> +     char **all_decomp_data = priv_arrays->all_decomp_data;
> +
>       struct comp_testsuite_params *ts_params = &testsuite_params;
> +
> +     /* from int_data: */
>       const char * const *test_bufs = int_data->test_bufs;
>       unsigned int num_bufs = int_data->num_bufs;
> -     uint16_t *buf_idx = int_data->buf_idx;
> -     struct rte_comp_xform **compress_xforms = int_data-
> >compress_xforms;
> -     struct rte_comp_xform **decompress_xforms = int_data-
> >decompress_xforms;
> -     unsigned int num_xforms = int_data->num_xforms;
> -     enum rte_comp_op_type compress_state = test_data-
> >compress_state;
> -     enum rte_comp_op_type decompress_state = test_data-
> >decompress_state;
> +
> +     /* from test_data: */
>       unsigned int buff_type = test_data->buff_type;
> -     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;
> -     struct rte_mbuf_ext_shared_info decompbuf_info;
> -     int ret;
> -     struct rte_mbuf *uncomp_bufs[num_bufs];
> -     struct rte_mbuf *comp_bufs[num_bufs];
> -     struct rte_comp_op *ops[num_bufs];
> -     struct rte_comp_op *ops_processed[num_bufs];
> -     void *priv_xforms[num_bufs];
> -     uint16_t num_enqd, num_deqd, num_total_deqd;
> -     uint16_t num_priv_xforms = 0;
> -     unsigned int deqd_retries = 0;
> -     struct priv_op_data *priv_data;
> -     char *buf_ptr;
> -     unsigned int i;
> -     struct rte_mempool *buf_pool;
> -     uint32_t data_size;
> -     /* Compressing with CompressDev */
> -     unsigned int oos_zlib_decompress =
> -                     (zlib_dir == ZLIB_NONE || zlib_dir ==
> ZLIB_DECOMPRESS);
> -     /* Decompressing with CompressDev */
> -     unsigned int oos_zlib_compress =
> -                     (zlib_dir == ZLIB_NONE || zlib_dir ==
> ZLIB_COMPRESS);
> -     const struct rte_compressdev_capabilities *capa =
> -             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;
> -     unsigned int step = 0;
> 
> -     TEST_ASSERT(decompress_state == RTE_COMP_OP_STATELESS ||
> num_bufs == 1,
> -                 "Number of stateful operations in a step should be 1");
> +     /* from priv_arrays: */
> +     struct rte_mbuf **uncomp_bufs = priv_arrays->uncomp_bufs;
> +     struct rte_mempool *buf_pool;
> 
> -     if (capa == NULL) {
> -             RTE_LOG(ERR, USER1,
> -                     "Compress device does not support DEFLATE\n");
> -             return -ENOTSUP;
> -     }
> +     static struct rte_mbuf_ext_shared_info inbuf_info;
> 
> -     /* Initialize all arrays to NULL */
> -     memset(uncomp_bufs, 0, sizeof(struct rte_mbuf *) * num_bufs);
> -     memset(comp_bufs, 0, sizeof(struct rte_mbuf *) * num_bufs);
> -     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) {
> +     if (test_data->decompress_state == RTE_COMP_OP_STATEFUL) {
>               data_size = strlen(test_bufs[0]) + 1;
> -             all_decomp_data = rte_malloc(NULL, data_size,
> +             *all_decomp_data = rte_malloc(NULL, data_size,
>                                            RTE_CACHE_LINE_SIZE);
>       }
> 
> @@ -861,14 +873,15 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>       else
>               buf_pool = ts_params->large_mbuf_pool;
> 
> -     /* Prepare the source mbufs with the data */
> +     /* for compression uncomp_bufs is used as a source buffer */
> +     /* allocation from buf_pool (mempool type) */
>       ret = rte_pktmbuf_alloc_bulk(buf_pool,
>                               uncomp_bufs, num_bufs);
>       if (ret < 0) {
>               RTE_LOG(ERR, USER1,
>                       "Source mbufs could not be allocated "
>                       "from the mempool\n");
> -             goto exit;
> +             return -1;
>       }
> 
>       if (test_data->use_external_mbufs) {
> @@ -881,8 +894,13 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                       test_data->inbuf_memzone->iova,
>                                       test_data->inbuf_data_size,
>                                       &inbuf_info);
> -                     rte_pktmbuf_append(uncomp_bufs[i],
> +                     buf_ptr = rte_pktmbuf_append(uncomp_bufs[i],
>                                       test_data->inbuf_data_size);
> +                     if (buf_ptr == NULL) {
> +                             RTE_LOG(ERR, USER1,
> +                                     "Append extra bytes to the source
> mbuf failed\n");
> +                             return -1;
> +                     }
>               }
>       } else if (buff_type == SGL_BOTH || buff_type == SGL_TO_LB) {
>               for (i = 0; i < num_bufs; i++) {
> @@ -893,106 +911,296 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                           big_data ? buf_pool : ts_params-
> >large_mbuf_pool,
>                           big_data ? 0 : MAX_SEGS,
>                           big_data ? MAX_DATA_MBUF_SIZE :
> SMALL_SEG_SIZE) < 0)
> -                             goto exit;
> +                             return -1;
>               }
>       } 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;
> +                             return -1;
>                       }
>                       strlcpy(buf_ptr, test_bufs[i], data_size);
>               }
>       }
> 
> -     /* Prepare the destination mbufs */
> -     ret = rte_pktmbuf_alloc_bulk(buf_pool, comp_bufs, num_bufs);
> +     return 0;
> +}
> +
> +/**
> + * Data size calculation (for both compression and decompression).
> + *
> + * Developer is requested to provide input params
> + * according to the following rule:
> + *      if ops_processed == NULL -> compression
> + *      if ops_processed != NULL -> decompression
> + * Values bigger than 0 have to be returned to avoid problems
> + * with memory allocation
> + *
> + * @param ops_processed
> + *   Operations created as a result of compression phase. Should be
> + *   set to NULL for compression
> + * @param out_of_space_and_zlib
> + *   Boolean value to switch into "out of space" buffer if set.
> + *   To test "out-of-space" data size, zlib_decompress must be set as well.
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param i
> + *   current buffer index
> + * @return
> + *   - values bigger than 0
> + */
> +static inline uint32_t
> +test_mbufs_calculate_data_size(
> +             struct rte_comp_op *ops_processed[], /*can be equal to
> NULL*/
> +             unsigned int out_of_space_and_zlib,
> +             const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             unsigned int i)
> +{
> +     /* local variables: */
> +     uint32_t data_size = 0;
> +     struct priv_op_data *priv_data;
> +     float ratio;
> +     uint8_t not_zlib_compr; /* true if zlib isn't current compression dev
> */
> +     enum overflow_test overflow = test_data->overflow;
> +
> +     /* from int_data: */
> +     const char * const *test_bufs = int_data->test_bufs;
> +
> +     if (out_of_space_and_zlib)
> +             data_size = OUT_OF_SPACE_BUF;
> +     else {
> +             if (ops_processed == NULL) {
> +
> +                     not_zlib_compr = (test_data->zlib_dir ==
> ZLIB_DECOMPRESS
> +                             || test_data->zlib_dir == ZLIB_NONE);
> +
> +                     ratio = (not_zlib_compr &&
> +                             (overflow == OVERFLOW_ENABLED)) ?
> +                             COMPRESS_BUF_SIZE_RATIO_OVERFLOW :
> +                             COMPRESS_BUF_SIZE_RATIO;
> +
> +                     data_size = strlen(test_bufs[i]) * ratio;
> +
> +             } else {
> +                     priv_data = (struct priv_op_data *)
> +                                     (ops_processed[i] + 1);
> +                     data_size = strlen(test_bufs[priv_data->orig_idx]) +
> 1;
> +             }
> +     }
> +
> +     return data_size;
> +}
> +
> +
> +/**
> + * Memory buffers preparation (for both compression and decompression).
> + *
> + * Memory allocation for comp/decomp buffers from mempool, depending
> on
> + * ops_processed value. Developer is requested to provide input params
> + * according to the following rule:
> + *      if ops_processed == NULL -> current_bufs = comp_bufs[]
> + *      if ops_processed != NULL -> current_bufs = decomp_bufs[]
> + * -1 returned if function fail, without modifying the mbuf.
> + *
> + * @param ops_processed
> + *   Operations created as a result of compression phase. Should be
> + *   set to NULL for compression
> + * @param current_bufs
> + *   mbufs being prepared in the function.
> + * @param out_of_space_and_zlib
> + *   Boolean value to switch into "out of space" buffer if set.
> + *   To test "out-of-space" data size, zlib_decompress must be set as well.
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param current_extbuf_info,
> + *   The structure containing all the information related to external mbufs
> + * @param current_memzone
> + *   memzone used by external buffers
> + * @return
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_mbufs_destination_preparation(
> +             struct rte_comp_op *ops_processed[], /*can be equal to
> NULL*/
> +             struct rte_mbuf *current_bufs[],
> +             unsigned int out_of_space_and_zlib,
> +             const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             struct rte_mbuf_ext_shared_info *current_extbuf_info,
> +             const struct rte_memzone *current_memzone) {
> +     /* local variables: */
> +     unsigned int i;
> +     uint32_t data_size;
> +     int ret;
> +     char *buf_ptr;
> +
> +     struct comp_testsuite_params *ts_params = &testsuite_params;
> +
> +     /* from int_data: */
> +     unsigned int num_bufs = int_data->num_bufs;
> +
> +     /* from test_data: */
> +     unsigned int buff_type = test_data->buff_type;
> +     unsigned int big_data = test_data->big_data;
> +
> +     struct rte_mempool *buf_pool;
> +
> +     if (big_data)
> +             buf_pool = ts_params->big_mbuf_pool;
> +     else if (buff_type == SGL_BOTH)
> +             buf_pool = ts_params->small_mbuf_pool;
> +     else
> +             buf_pool = ts_params->large_mbuf_pool;
> +
> +     /* the mbufs allocation*/
> +     ret = rte_pktmbuf_alloc_bulk(buf_pool, current_bufs, num_bufs);
>       if (ret < 0) {
>               RTE_LOG(ERR, USER1,
>                       "Destination mbufs could not be allocated "
>                       "from the mempool\n");
> -             goto exit;
> +             return -1;
>       }
> 
>       if (test_data->use_external_mbufs) {
> -             compbuf_info.free_cb = extbuf_free_callback;
> -             compbuf_info.fcb_opaque = NULL;
> -             rte_mbuf_ext_refcnt_set(&compbuf_info, 1);
> +             current_extbuf_info->free_cb = extbuf_free_callback;
> +             current_extbuf_info->fcb_opaque = NULL;
> +             rte_mbuf_ext_refcnt_set(current_extbuf_info, 1);
>               for (i = 0; i < num_bufs; i++) {
> -                     rte_pktmbuf_attach_extbuf(comp_bufs[i],
> -                                     test_data->compbuf_memzone-
> >addr,
> -                                     test_data->compbuf_memzone-
> >iova,
> -                                     test_data->compbuf_memzone-
> >len,
> -                                     &compbuf_info);
> -                     rte_pktmbuf_append(comp_bufs[i],
> -                                     test_data->compbuf_memzone-
> >len);
> +                     rte_pktmbuf_attach_extbuf(current_bufs[i],
> +                                     current_memzone->addr,
> +                                     current_memzone->iova,
> +                                     current_memzone->len,
> +                                     current_extbuf_info);
> +                     rte_pktmbuf_append(current_bufs[i],
> +                                     current_memzone->len);
>               }
> -     } else if (buff_type == SGL_BOTH || buff_type == LB_TO_SGL) {
> -             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);
> -
> -                     if (prepare_sgl_bufs(NULL, comp_bufs[i],
> -                           data_size,
> -                           big_data ? buf_pool : ts_params-
> >small_mbuf_pool,
> -                           big_data ? buf_pool : ts_params-
> >large_mbuf_pool,
> -                           big_data ? 0 : MAX_SEGS,
> -                           big_data ? MAX_DATA_MBUF_SIZE :
> SMALL_SEG_SIZE)
> -                                     < 0)
> -                             goto exit;
> -             }
> -
>       } else {
>               for (i = 0; i < num_bufs; i++) {
> -                     if (out_of_space == 1 && oos_zlib_decompress)
> -                             data_size = OUT_OF_SPACE_BUF;
> -                     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;
> +
> +                     /* data size calculation */
> +                     data_size = test_mbufs_calculate_data_size(
> +                                     ops_processed,
> +                                     out_of_space_and_zlib,
> +                                     int_data,
> +                                     test_data,
> +                                     i);
> +
> +                     /* data allocation */
> +                     if (buff_type == SGL_BOTH || buff_type ==
> LB_TO_SGL) {
> +                             ret = prepare_sgl_bufs(NULL,
> current_bufs[i],
> +                                   data_size,
> +                                   big_data ? buf_pool :
> +                                             ts_params-
> >small_mbuf_pool,
> +                                   big_data ? buf_pool :
> +                                             ts_params-
> >large_mbuf_pool,
> +                                   big_data ? 0 : MAX_SEGS,
> +                                   big_data ? MAX_DATA_MBUF_SIZE :
> +                                              SMALL_SEG_SIZE);
> +                             if (ret < 0)
> +                                     return -1;
> +                     } else {
> +                             buf_ptr =
> rte_pktmbuf_append(current_bufs[i],
> +                                             data_size);
> +                             if (buf_ptr == NULL) {
> +                                     RTE_LOG(ERR, USER1,
> +                                             "Append extra bytes to the
> destination mbuf failed\n");
> +                                     return -1;
> +                             }
>                       }
>               }
>       }
> 
> +     return 0;
> +}
> +
> +/**
> + * The main compression function.
> + *
> + * Operation(s) configuration, depending on CLI parameters.
> + * Operation(s) processing.
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_deflate_comp_run(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             const struct test_private_arrays *priv_arrays) {
> +     /* local variables: */
> +     struct priv_op_data *priv_data;
> +     unsigned int i;
> +     uint16_t num_priv_xforms = 0;
> +     int ret;
> +     int ret_status = 0;
> +     char *buf_ptr;
> +
> +     struct comp_testsuite_params *ts_params = &testsuite_params;
> +
> +     /* from test_data: */
> +     enum rte_comp_op_type operation_type = test_data-
> >compress_state;
> +     unsigned int zlib_compress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_COMPRESS);
> +
> +     /* from int_data: */
> +     struct rte_comp_xform **compress_xforms = int_data-
> >compress_xforms;
> +     unsigned int num_xforms = int_data->num_xforms;
> +     unsigned int num_bufs = int_data->num_bufs;
> +
> +     /* from priv_arrays: */
> +     struct rte_mbuf **comp_bufs = priv_arrays->comp_bufs;
> +     struct rte_mbuf **uncomp_bufs = priv_arrays->uncomp_bufs;
> +     struct rte_comp_op **ops = priv_arrays->ops;
> +     struct rte_comp_op **ops_processed = priv_arrays-
> >ops_processed;
> +     void **priv_xforms = priv_arrays->priv_xforms;
> +
> +     const struct rte_compressdev_capabilities *capa =
> +             rte_compressdev_capability_get(0,
> RTE_COMP_ALGO_DEFLATE);
> +
>       /* Build the compression operations */
>       ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops,
> num_bufs);
>       if (ret < 0) {
>               RTE_LOG(ERR, USER1,
>                       "Compress operations could not be allocated "
>                       "from the mempool\n");
> +             ret_status = -1;
>               goto exit;
>       }
> 
> -
>       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;
> -             if (compress_state == RTE_COMP_OP_STATELESS)
> +
> +             if (operation_type == RTE_COMP_OP_STATELESS) {
>                       ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
> -             else {
> +             } else {
>                       RTE_LOG(ERR, USER1,
> -                             "Stateful operations are not supported "
> -                             "in these tests yet\n");
> +                             "Compression: stateful operations are not "
> +                             "supported in these tests yet\n");
> +                     ret_status = -1;
>                       goto exit;
>               }
>               ops[i]->input_chksum = 0;
> @@ -1007,14 +1215,16 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>       }
> 
>       /* Compress data (either with Zlib API or compressdev API */
> -     if (zlib_dir == ZLIB_COMPRESS || zlib_dir == ZLIB_ALL) {
> +     if (zlib_compress) {
>               for (i = 0; i < num_bufs; i++) {
>                       const struct rte_comp_xform *compress_xform =
>                               compress_xforms[i % num_xforms];
>                       ret = compress_zlib(ops[i], compress_xform,
>                                       DEFAULT_MEM_LEVEL);
> -                     if (ret < 0)
> +                     if (ret < 0) {
> +                             ret_status = -1;
>                               goto exit;
> +                     }
> 
>                       ops_processed[i] = ops[i];
>               }
> @@ -1022,24 +1232,26 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>               /* Create compress private xform data */
>               for (i = 0; i < num_xforms; i++) {
>                       ret = rte_compressdev_private_xform_create(0,
> -                             (const struct rte_comp_xform
> *)compress_xforms[i],
> +                             (const struct rte_comp_xform *)
> +                                     compress_xforms[i],
>                               &priv_xforms[i]);
>                       if (ret < 0) {
>                               RTE_LOG(ERR, USER1,
>                                       "Compression private xform "
>                                       "could not be created\n");
> +                             ret_status = -1;
>                               goto exit;
>                       }
>                       num_priv_xforms++;
>               }
> -
>               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];
> +                             ops[i]->private_xform =
> +                                             priv_xforms[i %
> num_xforms];
>               } else {
> -                     /* Create rest of the private xforms for the other ops
> */
> +             /* Create rest of the private xforms for the other ops */
>                       for (i = num_xforms; i < num_bufs; i++) {
>                               ret =
> rte_compressdev_private_xform_create(0,
>                                       compress_xforms[i % num_xforms],
> @@ -1048,26 +1260,28 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                       RTE_LOG(ERR, USER1,
>                                               "Compression private xform "
>                                               "could not be created\n");
> +                                     ret_status = -1;
>                                       goto exit;
>                               }
>                               num_priv_xforms++;
>                       }
> -
>                       /* Attach non shareable private xform data to ops */
>                       for (i = 0; i < num_bufs; i++)
>                               ops[i]->private_xform = priv_xforms[i];
>               }
> 
>  recovery_lb:
> -             ret = test_run_enqueue_dequeue(ops, num_bufs,
> ops_processed);
> +             ret = test_run_enqueue_dequeue(ops, ops_processed,
> num_bufs);
>               if (ret < 0) {
>                       RTE_LOG(ERR, USER1,
> -                             "Enqueue/dequeue operation failed\n");
> +                             "Compression: enqueue/dequeue operation
> failed\n");
> +                     ret_status = -1;
>                       goto exit;
>               }
> 
>               for (i = 0; i < num_bufs; i++) {
> -                     compressed_data_size[i] += ops_processed[i]-
> >produced;
> +                     priv_arrays->compressed_data_size[i] +=
> +                                     ops_processed[i]->produced;
> 
>                       if (ops_processed[i]->status ==
> 
>       RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { @@ -
> 1088,21 +1302,83 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                               if (buf_ptr == NULL) {
>                                       RTE_LOG(ERR, USER1,
>                                               "Data recovery: append extra
> bytes to the current mbuf failed\n");
> +                                     ret_status = -1;
>                                       goto exit;
>                               }
>                               goto recovery_lb;
>                       }
>               }
> -             deqd_retries = 0;
> +     }
> +
> +exit:
> +     /* Free resources */
> +     if (ret_status < 0)
> +             for (i = 0; i < num_bufs; i++) {
> +                     rte_comp_op_free(ops[i]);
> +                     ops_processed[i] = NULL;
> +             }
> 
> -             /* Free compress private xforms */
> -             for (i = 0; i < num_priv_xforms; i++) {
> +     /* Free compress private xforms */
> +     for (i = 0; i < num_priv_xforms; i++) {
> +             if (priv_xforms[i] != NULL) {
>                       rte_compressdev_private_xform_free(0,
> priv_xforms[i]);
>                       priv_xforms[i] = NULL;
>               }
> -             num_priv_xforms = 0;
>       }
> 
> +     return ret_status;
> +}
> +
> +/**
> + * Prints out the test report. Memory freeing.
> + *
> + * Called after successful compression.
> + * Operation(s) status validation and decompression buffers freeing.
> +
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 2: Some operation is not supported
> + *   - 1: Decompression should be skipped
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_deflate_comp_finalize(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             const struct test_private_arrays *priv_arrays) {
> +     /* local variables: */
> +     unsigned int i;
> +     struct priv_op_data *priv_data;
> +
> +     /* from int_data: */
> +     unsigned int num_xforms = int_data->num_xforms;
> +     struct rte_comp_xform **compress_xforms = int_data-
> >compress_xforms;
> +     uint16_t *buf_idx = int_data->buf_idx;
> +     unsigned int num_bufs = int_data->num_bufs;
> +
> +     /* from priv_arrays: */
> +     struct rte_comp_op **ops_processed = priv_arrays-
> >ops_processed;
> +     uint64_t *compress_checksum = priv_arrays->compress_checksum;
> +     struct rte_mbuf **uncomp_bufs = priv_arrays->uncomp_bufs;
> +     struct rte_comp_op **ops = priv_arrays->ops;
> +
> +     /* from test_data: */
> +     unsigned int out_of_space = test_data->out_of_space;
> +     unsigned int zlib_compress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_COMPRESS);
> +     unsigned int zlib_decompress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_DECOMPRESS);
> +
>       for (i = 0; i < num_bufs; i++) {
>               priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
>               uint16_t xform_idx = priv_data->orig_idx % num_xforms;
> @@ -1111,7 +1387,7 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>               enum rte_comp_huffman huffman_type =
>                       compress_xform->deflate.huffman;
>               char engine[] = "zlib (directly, not PMD)";
> -             if (zlib_dir != ZLIB_COMPRESS && zlib_dir != ZLIB_ALL)
> +             if (zlib_decompress)
>                       strlcpy(engine, "PMD", sizeof(engine));
> 
>               RTE_LOG(DEBUG, USER1, "Buffer %u compressed by %s from
> %u to"
> @@ -1134,116 +1410,103 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>        * compress operation information is needed for the decompression
> stage)
>        */
>       for (i = 0; i < num_bufs; i++) {
> -             if (out_of_space && oos_zlib_decompress) {
> +             if (out_of_space && !zlib_compress) {
>                       if (ops_processed[i]->status !=
> 
>       RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
> -                             ret_status = TEST_FAILED;
>                               RTE_LOG(ERR, USER1,
>                                       "Operation without expected out of "
>                                       "space status error\n");
> -                             goto exit;
> +                             return -1;
>                       } else
>                               continue;
>               }
> 
>               if (ops_processed[i]->status !=
> RTE_COMP_OP_STATUS_SUCCESS) {
> -                     if (overflow_tst == OVERFLOW_ENABLED) {
> +                     if (test_data->overflow == 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;
> +                                     return 2;
>                               }
>                       }
> +
>                       RTE_LOG(ERR, USER1,
>                               "Some operations were not successful\n");
> -                     goto exit;
> +                     return -1;
>               }
>               priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
>               rte_pktmbuf_free(uncomp_bufs[priv_data->orig_idx]);
>               uncomp_bufs[priv_data->orig_idx] = NULL;
>       }
> 
> -     if (out_of_space && oos_zlib_decompress) {
> -             ret_status = TEST_SUCCESS;
> -             goto exit;
> -     }
> +     if (out_of_space && !zlib_compress)
> +             return 1;
> 
> -     /* Allocate buffers for decompressed data */
> -     ret = rte_pktmbuf_alloc_bulk(buf_pool, uncomp_bufs, num_bufs);
> -     if (ret < 0) {
> -             RTE_LOG(ERR, USER1,
> -                     "Destination mbufs could not be allocated "
> -                     "from the mempool\n");
> -             goto exit;
> -     }
> +     return 0;
> +}
> 
> -     if (test_data->use_external_mbufs) {
> -             decompbuf_info.free_cb = extbuf_free_callback;
> -             decompbuf_info.fcb_opaque = NULL;
> -             rte_mbuf_ext_refcnt_set(&decompbuf_info, 1);
> -             for (i = 0; i < num_bufs; i++) {
> -                     rte_pktmbuf_attach_extbuf(uncomp_bufs[i],
> -                                     test_data->uncompbuf_memzone-
> >addr,
> -                                     test_data->uncompbuf_memzone-
> >iova,
> -                                     test_data->uncompbuf_memzone-
> >len,
> -                                     &decompbuf_info);
> -                     rte_pktmbuf_append(uncomp_bufs[i],
> -                                     test_data->uncompbuf_memzone-
> >len);
> -             }
> -     } else if (buff_type == SGL_BOTH || buff_type == LB_TO_SGL) {
> -             for (i = 0; i < num_bufs; i++) {
> -                     priv_data = (struct priv_op_data *)
> -                                     (ops_processed[i] + 1);
> -                     if (out_of_space == 1 && oos_zlib_compress)
> -                             data_size = OUT_OF_SPACE_BUF;
> -                     else if (test_data->decompress_output_block_size
> != 0)
> -                             data_size =
> -                                     test_data-
> >decompress_output_block_size;
> -                     else
> -                             data_size =
> -                             strlen(test_bufs[priv_data->orig_idx]) + 1;
> -
> -                     if (prepare_sgl_bufs(NULL, uncomp_bufs[i],
> -                            data_size,
> -                            big_data ? buf_pool : ts_params-
> >small_mbuf_pool,
> -                            big_data ? buf_pool : ts_params-
> >large_mbuf_pool,
> -                            big_data ? 0 : MAX_SEGS,
> -                            big_data ? MAX_DATA_MBUF_SIZE :
> SMALL_SEG_SIZE)
> -                                     < 0)
> -                             goto exit;
> -             }
> +/**
> + * The main decompression function.
> + *
> + * Operation(s) configuration, depending on CLI parameters.
> + * Operation(s) processing.
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_deflate_decomp_run(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             struct test_private_arrays *priv_arrays) {
> 
> -     } else {
> -             for (i = 0; i < num_bufs; i++) {
> -                     priv_data = (struct priv_op_data *)
> -                                     (ops_processed[i] + 1);
> -                     if (out_of_space == 1 && oos_zlib_compress)
> -                             data_size = OUT_OF_SPACE_BUF;
> -                     else if (test_data->decompress_output_block_size
> != 0)
> -                             data_size =
> -                                     test_data-
> >decompress_output_block_size;
> -                     else
> -                             data_size =
> -                             strlen(test_bufs[priv_data->orig_idx]) + 1;
> +     /* local variables: */
> +     struct priv_op_data *priv_data;
> +     unsigned int i;
> +     uint16_t num_priv_xforms = 0;
> +     int ret;
> +     int ret_status = 0;
> 
> -                     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;
> -                     }
> -             }
> -     }
> +     struct comp_testsuite_params *ts_params = &testsuite_params;
> +
> +     /* from test_data: */
> +     enum rte_comp_op_type operation_type = test_data-
> >decompress_state;
> +     unsigned int zlib_decompress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_DECOMPRESS);
> +
> +     /* from int_data: */
> +     struct rte_comp_xform **decompress_xforms = int_data-
> >decompress_xforms;
> +     unsigned int num_xforms = int_data->num_xforms;
> +     unsigned int num_bufs = int_data->num_bufs;
> +
> +     /* from priv_arrays: */
> +     struct rte_mbuf **uncomp_bufs = priv_arrays->uncomp_bufs;
> +     struct rte_comp_op **ops = priv_arrays->ops;
> +     struct rte_comp_op **ops_processed = priv_arrays-
> >ops_processed;
> +     void **priv_xforms = priv_arrays->priv_xforms;
> +     uint32_t *compressed_data_size = priv_arrays-
> >compressed_data_size;
> +     void **stream = priv_arrays->stream;
> +
> +     const struct rte_compressdev_capabilities *capa =
> +             rte_compressdev_capability_get(0,
> RTE_COMP_ALGO_DEFLATE);
> 
> -     /* Build the decompression operations */
>       ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops,
> num_bufs);
>       if (ret < 0) {
>               RTE_LOG(ERR, USER1,
>                       "Decompress operations could not be allocated "
>                       "from the mempool\n");
> +             ret_status = -1;
>               goto exit;
>       }
> 
> @@ -1256,22 +1519,25 @@ 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
>                */
> +
>               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) {
> +
> +             if (operation_type == RTE_COMP_OP_STATELESS) {
>                       ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
>                       ops[i]->op_type = RTE_COMP_OP_STATELESS;
> -             } else if (zlib_dir == ZLIB_COMPRESS || zlib_dir ==
> ZLIB_NONE) {
> +             } else if (!zlib_decompress) {
>                       ops[i]->flush_flag = RTE_COMP_FLUSH_SYNC;
>                       ops[i]->op_type = RTE_COMP_OP_STATEFUL;
>               } else {
>                       RTE_LOG(ERR, USER1,
> -                             "Stateful operations are not supported "
> -                             "in these tests yet\n");
> +                             "Decompression: stateful operations are"
> +                             " not supported in these tests yet\n");
> +                     ret_status = -1;
>                       goto exit;
>               }
>               ops[i]->input_chksum = 0;
> @@ -1290,7 +1556,7 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>       rte_comp_op_bulk_free(ops_processed, num_bufs);
> 
>       /* Decompress data (either with Zlib API or compressdev API */
> -     if (zlib_dir == ZLIB_DECOMPRESS || zlib_dir == ZLIB_ALL) {
> +     if (zlib_decompress) {
>               for (i = 0; i < num_bufs; i++) {
>                       priv_data = (struct priv_op_data *)(ops[i] + 1);
>                       uint16_t xform_idx = priv_data->orig_idx %
> num_xforms; @@ -1298,13 +1564,15 @@ test_deflate_comp_decomp(const
> struct interim_data_params *int_data,
>                               decompress_xforms[xform_idx];
> 
>                       ret = decompress_zlib(ops[i], decompress_xform);
> -                     if (ret < 0)
> +                     if (ret < 0) {
> +                             ret_status = -1;
>                               goto exit;
> +                     }
> 
>                       ops_processed[i] = ops[i];
>               }
>       } else {
> -             if (decompress_state == RTE_COMP_OP_STATELESS) {
> +             if (operation_type == RTE_COMP_OP_STATELESS) {
>                       /* Create decompress private xform data */
>                       for (i = 0; i < num_xforms; i++) {
>                               ret =
> rte_compressdev_private_xform_create(0,
> @@ -1315,6 +1583,7 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                       RTE_LOG(ERR, USER1,
>                                               "Decompression private
> xform "
>                                               "could not be created\n");
> +                                     ret_status = -1;
>                                       goto exit;
>                               }
>                               num_priv_xforms++;
> @@ -1341,7 +1610,9 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                             &priv_xforms[i]);
>                                       if (ret < 0) {
>                                               RTE_LOG(ERR, USER1,
> -                                                     "Decompression
> private xform could not be created\n");
> +                                                     "Decompression
> private xform"
> +                                                     " could not be
> created\n");
> +                                             ret_status = -1;
>                                               goto exit;
>                                       }
>                                       num_priv_xforms++;
> @@ -1361,59 +1632,86 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>               } else {
>                       /* Create a stream object for stateful decompression
> */
>                       ret = rte_compressdev_stream_create(0,
> -                                     decompress_xforms[0], &stream);
> +                                     decompress_xforms[0], stream);
>                       if (ret < 0) {
>                               RTE_LOG(ERR, USER1,
>                                       "Decompression stream could not be
> created, error %d\n",
>                                       ret);
> +                             ret_status = -1;
>                               goto exit;
>                       }
>                       /* Attach stream to ops */
>                       for (i = 0; i < num_bufs; i++)
> -                             ops[i]->stream = stream;
> +                             ops[i]->stream = *stream;
>               }
> 
> -next_step:
> -             /* 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,
> -                             "The operations could not be enqueued\n");
> -                     goto exit;
> -             }
> +             priv_arrays->num_priv_xforms = num_priv_xforms;
> +     }
> 
> -             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");
> -                                     goto exit;
> -                             }
> -                             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);
> +exit:
> +     return ret_status;
> +}
> 
> -             deqd_retries = 0;
> -     }
> +/**
> + * Prints out the test report. Memory freeing.
> + *
> + * Called after successful decompression.
> + * Operation(s) status validation and compression buffers freeing.
> +
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 2: Next step must be executed by the caller (stateful decompression
> only)
> + *   - 1: On success (caller should stop and exit)
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_deflate_decomp_finalize(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             const struct test_private_arrays *priv_arrays) {
> +     /* local variables: */
> +     unsigned int i;
> +     struct priv_op_data *priv_data;
> +     static unsigned int step;
> +
> +     /* from int_data: */
> +     uint16_t *buf_idx = int_data->buf_idx;
> +     unsigned int num_bufs = int_data->num_bufs;
> +     const char * const *test_bufs = int_data->test_bufs;
> +     struct rte_comp_xform **compress_xforms = int_data-
> >compress_xforms;
> +
> +     /* from priv_arrays: */
> +     struct rte_comp_op **ops_processed = priv_arrays-
> >ops_processed;
> +     struct rte_mbuf **comp_bufs = priv_arrays->comp_bufs;
> +     struct rte_comp_op **ops = priv_arrays->ops;
> +     uint64_t *compress_checksum = priv_arrays->compress_checksum;
> +     unsigned int *decomp_produced_data_size =
> +                     priv_arrays->decomp_produced_data_size;
> +     char **all_decomp_data = priv_arrays->all_decomp_data;
> +
> +     /* from test_data: */
> +     unsigned int out_of_space = test_data->out_of_space;
> +     enum rte_comp_op_type operation_type = test_data-
> >decompress_state;
> +
> +     unsigned int zlib_compress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_COMPRESS);
> +     unsigned int zlib_decompress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_DECOMPRESS);
> 
>       for (i = 0; i < num_bufs; i++) {
>               priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
>               char engine[] = "zlib, (directly, no PMD)";
> -             if (zlib_dir != ZLIB_DECOMPRESS && zlib_dir != ZLIB_ALL)
> +             if (zlib_compress)
>                       strlcpy(engine, "pmd", sizeof(engine));
>               RTE_LOG(DEBUG, USER1,
>                       "Buffer %u decompressed by %s from %u to %u
> bytes\n", @@ -1427,19 +1725,19 @@ test_deflate_comp_decomp(const
> struct interim_data_params *int_data,
>        * compress operation information is still needed)
>        */
>       for (i = 0; i < num_bufs; i++) {
> -             if (out_of_space && oos_zlib_compress) {
> +             if (out_of_space && !zlib_decompress) {
>                       if (ops_processed[i]->status !=
> -
>       RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
> -                             ret_status = TEST_FAILED;
> +
>       RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
> +
>                               RTE_LOG(ERR, USER1,
>                                       "Operation without expected out of "
>                                       "space status error\n");
> -                             goto exit;
> +                             return -1;
>                       } else
>                               continue;
>               }
> 
> -             if (decompress_state == RTE_COMP_OP_STATEFUL
> +             if (operation_type == RTE_COMP_OP_STATEFUL
>                       && (ops_processed[i]->status ==
> 
>       RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE
>                           || ops_processed[i]->status ==
> @@ -1449,28 +1747,29 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                       ops_processed[i]->m_dst,
>                                       ops_processed[i]->dst.offset,
>                                       ops_processed[i]->produced,
> -                                     all_decomp_data +
> -
>       decomp_produced_data_size);
> -                     if (ptr != all_decomp_data +
> decomp_produced_data_size)
> -                             rte_memcpy(all_decomp_data +
> -                                        decomp_produced_data_size,
> +                                     *all_decomp_data +
> +
>       *decomp_produced_data_size);
> +                     if (ptr != *all_decomp_data +
> +                                     *decomp_produced_data_size)
> +                             rte_memcpy(*all_decomp_data +
> +                                        *decomp_produced_data_size,
>                                          ptr, ops_processed[i]->produced);
> -                     decomp_produced_data_size += ops_processed[i]-
> >produced;
> +
> +                     *decomp_produced_data_size +=
> +                                     ops_processed[i]->produced;
>                       if (ops_processed[i]->src.length >
>                                       ops_processed[i]->consumed) {
>                               if (ops_processed[i]->status ==
> 
>       RTE_COMP_OP_STATUS_SUCCESS) {
> -                                     ret_status = -1;
>                                       RTE_LOG(ERR, USER1,
>                                             "Operation finished too early\n");
> -                                     goto exit;
> +                                     return -1;
>                               }
>                               step++;
>                               if (step >= test_data-
> >decompress_steps_max) {
> -                                     ret_status = -1;
>                                       RTE_LOG(ERR, USER1,
>                                         "Operation exceeded maximum
> steps\n");
> -                                     goto exit;
> +                                     return -1;
>                               }
>                               ops[i] = ops_processed[i];
>                               ops[i]->status =
> @@ -1479,7 +1778,9 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                                               ops_processed[i]-
> >consumed;
>                               ops[i]->src.length -=
>                                               ops_processed[i]-
> >consumed;
> -                             goto next_step;
> +                             /* repeat the operation */
> +                             //goto next_step;
> +                             return 2;
>                       } else {
>                               /* Compare the original stream with the */
>                               /* decompressed stream (in size and the
> data) */ @@ -1487,22 +1788,22 @@ test_deflate_comp_decomp(const
> struct interim_data_params *int_data,
>                                               (ops_processed[i] + 1);
>                               const char *buf1 =
>                                               test_bufs[priv_data-
> >orig_idx];
> -                             const char *buf2 = all_decomp_data;
> +                             const char *buf2 = *all_decomp_data;
> 
>                               if (compare_buffers(buf1, strlen(buf1) + 1,
> -                                       buf2, decomp_produced_data_size)
> < 0)
> -                                     goto exit;
> +                                       buf2,
> *decomp_produced_data_size) < 0)
> +                                     return -1;
>                               /* Test checksums */
>                               if (compress_xforms[0]->compress.chksum
>                                               !=
> RTE_COMP_CHECKSUM_NONE) {
>                                       if (ops_processed[i]-
> >output_chksum
>                                                     != compress_checksum[i])
> {
>                                               RTE_LOG(ERR, USER1,
> -                                                     "The checksums
> differ\n"
> -                          "Compression Checksum: %" PRIu64
> "\tDecompression "
> -                             "Checksum: %" PRIu64 "\n",
> compress_checksum[i],
> +                     "The checksums differ\n"
> +                     "Compression Checksum: %" PRIu64
> "\tDecompression "
> +                     "Checksum: %" PRIu64 "\n", compress_checksum[i],
>                                              ops_processed[i]-
> >output_chksum);
> -                                             goto exit;
> +                                             return -1;
>                                       }
>                               }
>                       }
> @@ -1510,18 +1811,58 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>                          RTE_COMP_OP_STATUS_SUCCESS) {
>                       RTE_LOG(ERR, USER1,
>                               "Some operations were not successful\n");
> -                     goto exit;
> +                     return -1;
>               }
>               priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
>               rte_pktmbuf_free(comp_bufs[priv_data->orig_idx]);
>               comp_bufs[priv_data->orig_idx] = NULL;
>       }
> 
> -     if ((out_of_space && oos_zlib_compress)
> -                     || (decompress_state ==
> RTE_COMP_OP_STATEFUL)) {
> -             ret_status = TEST_SUCCESS;
> -             goto exit;
> -     }
> +     if (out_of_space && !zlib_decompress)
> +             return 1;
> +
> +     return 0;
> +}
> +
> +/**
> + * Validation of the output (compression/decompression) data.
> + *
> + * The function compares the source stream with the output stream,
> + * after decompression, to check if compression/decompression
> + * was correct.
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @param priv_arrays
> + *   A container used for aggregation all the private test arrays.
> + * @return
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +static int
> +test_results_validation(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data,
> +             const struct test_private_arrays *priv_arrays) {
> +     /* local variables: */
> +     unsigned int i;
> +     struct priv_op_data *priv_data;
> +     const char *buf1;
> +     const char *buf2;
> +     char *contig_buf = NULL;
> +     uint32_t data_size;
> +
> +     /* from int_data: */
> +     struct rte_comp_xform **compress_xforms = int_data-
> >compress_xforms;
> +     unsigned int num_bufs = int_data->num_bufs;
> +     const char * const *test_bufs = int_data->test_bufs;
> +
> +     /* from priv_arrays: */
> +     uint64_t *compress_checksum = priv_arrays->compress_checksum;
> +     struct rte_comp_op **ops_processed = priv_arrays-
> >ops_processed;
> 
>       /*
>        * Compare the original stream with the decompressed stream @@ -
> 1529,13 +1870,13 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>        */
>       for (i = 0; i < num_bufs; i++) {
>               priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
> -             const char *buf1 = test_data->use_external_mbufs ?
> +             buf1 = test_data->use_external_mbufs ?
>                               test_data->inbuf_memzone->addr :
>                               test_bufs[priv_data->orig_idx];
> -             const char *buf2;
>               data_size = test_data->use_external_mbufs ?
>                               test_data->inbuf_data_size :
>                               strlen(buf1) + 1;
> +
>               contig_buf = rte_malloc(NULL, ops_processed[i]->produced,
> 0);
>               if (contig_buf == NULL) {
>                       RTE_LOG(ERR, USER1, "Contiguous buffer could not "
> @@ -1565,24 +1906,207 @@ test_deflate_comp_decomp(const struct
> interim_data_params *int_data,
>               rte_free(contig_buf);
>               contig_buf = NULL;
>       }
> +     return 0;
> +
> +exit:
> +     rte_free(contig_buf);
> +     return -1;
> +}
> +
> +/**
> + * Compresses and decompresses input stream with compressdev API and
> +Zlib API
> + *
> + * Basic test function. Common for all the functional tests.
> + * -1 returned if function fail.
> + *
> + * @param int_data
> + *   Interim data containing session/transformation objects.
> + * @param test_data
> + *   The test parameters set by users (command line parameters).
> + * @return
> + *   - 1: Some operation not supported
> + *   - 0: On success.
> + *   - -1: On error.
> + */
> +
> +static int
> +test_deflate_comp_decomp(const struct interim_data_params *int_data,
> +             const struct test_data_params *test_data) {
> +     unsigned int num_bufs = int_data->num_bufs;
> +     unsigned int out_of_space = test_data->out_of_space;
> +
> +     void *stream = NULL;
> +     char *all_decomp_data = NULL;
> +     unsigned int decomp_produced_data_size = 0;
> +
> +     int ret_status = -1;
> +     int ret;
> +     struct rte_mbuf *uncomp_bufs[num_bufs];
> +     struct rte_mbuf *comp_bufs[num_bufs];
> +     struct rte_comp_op *ops[num_bufs];
> +     struct rte_comp_op *ops_processed[num_bufs];
> +     void *priv_xforms[num_bufs];
> +     unsigned int i;
> +
> +     uint64_t compress_checksum[num_bufs];
> +     uint32_t compressed_data_size[num_bufs];
> +     char *contig_buf = NULL;
> +
> +     struct rte_mbuf_ext_shared_info compbuf_info;
> +     struct rte_mbuf_ext_shared_info decompbuf_info;
> +
> +     const struct rte_compressdev_capabilities *capa;
> +
> +     /* Compressing with CompressDev */
> +     unsigned int zlib_compress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_COMPRESS);
> +     unsigned int zlib_decompress =
> +                     (test_data->zlib_dir == ZLIB_ALL ||
> +                     test_data->zlib_dir == ZLIB_DECOMPRESS);
> +
> +     struct test_private_arrays priv_arrays;
> +
> +     priv_arrays.uncomp_bufs = uncomp_bufs;
> +     priv_arrays.comp_bufs = comp_bufs;
> +     priv_arrays.ops = ops;
> +     priv_arrays.ops_processed = ops_processed;
> +     priv_arrays.priv_xforms = priv_xforms;
> +     priv_arrays.compress_checksum = compress_checksum;
> +     priv_arrays.compressed_data_size = compressed_data_size;
> +
> +     priv_arrays.stream = &stream;
> +     priv_arrays.all_decomp_data = &all_decomp_data;
> +     priv_arrays.decomp_produced_data_size =
> &decomp_produced_data_size;
> +
> +     priv_arrays.num_priv_xforms = 0; /* it's used for deompression only
> */
> +
> +     capa = rte_compressdev_capability_get(0,
> RTE_COMP_ALGO_DEFLATE);
> +     if (capa == NULL) {
> +             RTE_LOG(ERR, USER1,
> +                     "Compress device does not support DEFLATE\n");
> +             return -1;
> +     }
> +     test_objects_init(&priv_arrays, num_bufs);
Do we need this? Why we just cant call source_prep API? That will also setup 
uncompressed_bufs
> +
> +     /* Prepare the source mbufs with the data */
> +     ret = test_mbufs_source_preparation(int_data, test_data,
> &priv_arrays);
For code readability sake, it could test_setup_uncom_bufs() 

> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +
> +/* COMPRESSION  */
> +
> +     /* Prepare the destination mbufs */
> +     ret = test_mbufs_destination_preparation(
Why we cant keep this prototype same as source_preparation() API for better 
readability?
I mean we can pass priv_arry here too...

> +                     NULL, /*can be equal to NULL*/
> +                     comp_bufs,
> +                     out_of_space == 1 && !zlib_compress,
> +                     int_data,
> +                     test_data,
> +                     &compbuf_info,
> +                     test_data->compbuf_memzone);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +
> +     /* Run compression */
> +     ret = test_deflate_comp_run(int_data, test_data, &priv_arrays);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +
> +     ret = test_deflate_comp_finalize(int_data, test_data, &priv_arrays);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     } else if (ret == 1) {
> +             ret_status = 0;
> +             goto exit;
> +     } else if (ret == 2) {
> +             ret_status = 1;  /* some operation not supported */
> +             goto exit;
> +     }
> +
> +/* DECOMPRESSION  */
> +
> +     /* Allocate buffers for decompressed data */
> +     ret = test_mbufs_destination_preparation(
> +                     ops_processed, /*can be equal to NULL*/
> +                     uncomp_bufs,
> +                     out_of_space == 1 && !zlib_decompress,
> +                     int_data,
> +                     test_data,
> +                     &decompbuf_info,
> +                     test_data->uncompbuf_memzone);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +
> +     /* Run decompression */
> +     ret = test_deflate_decomp_run(int_data, test_data, &priv_arrays);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +
> +     if (!zlib_decompress) {
> +next_step:   /* next step for stateful decompression only */
> +             ret = test_run_enqueue_dequeue(ops, ops_processed,
> num_bufs);
> +             if (ret < 0) {
> +                     ret_status = -1;
> +                     RTE_LOG(ERR, USER1,
> +                             "Decompression: enqueue/dequeue
> operation failed\n");
> +             }
> +     }
> 
> -     ret_status = TEST_SUCCESS;
> +     ret = test_deflate_decomp_finalize(int_data, test_data,
> &priv_arrays);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     } else if (ret == 1) {
> +             ret_status = 0;
> +             goto exit;
> +     } else if (ret == 2) {
> +             goto next_step;
> +     }
> +
> +/* FINAL PROCESSING  */
> +
> +     ret = test_results_validation(int_data, test_data, &priv_arrays);
> +     if (ret < 0) {
> +             ret_status = -1;
> +             goto exit;
> +     }
> +     ret_status = 0;
> 
>  exit:
>       /* Free resources */
> +
> +     if (stream != NULL)
> +             rte_compressdev_stream_free(0, stream);
> +     if (all_decomp_data != NULL)
> +             rte_free(all_decomp_data);
> +
> +     /* Free compress private xforms */
> +     for (i = 0; i < priv_arrays.num_priv_xforms; i++) {
> +             if (priv_xforms[i] != NULL) {
> +                     rte_compressdev_private_xform_free(0,
> priv_xforms[i]);
> +                     priv_xforms[i] = NULL;
> +             }
> +     }
> +
>       for (i = 0; i < num_bufs; i++) {
>               rte_pktmbuf_free(uncomp_bufs[i]);
>               rte_pktmbuf_free(comp_bufs[i]);
>               rte_comp_op_free(ops[i]);
>               rte_comp_op_free(ops_processed[i]);
>       }
> -     for (i = 0; i < num_priv_xforms; i++)
> -             if (priv_xforms[i] != NULL)
> -                     rte_compressdev_private_xform_free(0,
> priv_xforms[i]);
> -     if (stream != NULL)
> -             rte_compressdev_stream_free(0, stream);
> -     if (all_decomp_data != NULL)
> -             rte_free(all_decomp_data);
>       rte_free(contig_buf);
> 
>       return ret_status;
> diff --git a/doc/guides/rel_notes/release_19_11.rst
> b/doc/guides/rel_notes/release_19_11.rst
> index 066bb3c19..5906f8b94 100644
> --- a/doc/guides/rel_notes/release_19_11.rst
> +++ b/doc/guides/rel_notes/release_19_11.rst
> @@ -152,6 +152,11 @@ New Features
>    Added eBPF JIT support for arm64 architecture to improve the eBPF
> program
>    performance.
> 
> +* **Refactored compression unit tests.**
> +
> +  Refactored core function to get clear code structure, better for
> maintenance.
> +  Created smaller specialized functions.
> +
> 
>  Removed Items
>  -------------
> --
> 2.17.1

Reply via email to