get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/45780/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 45780,
    "url": "http://patches.dpdk.org/api/patches/45780/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1538400427-20164-2-git-send-email-tomaszx.jozwiak@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1538400427-20164-2-git-send-email-tomaszx.jozwiak@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1538400427-20164-2-git-send-email-tomaszx.jozwiak@intel.com",
    "date": "2018-10-01T13:27:05",
    "name": "[1/3] app/compress-perf: add parser",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "af17a0a0bd384c528960e4bc1dd7af9041bdbcce",
    "submitter": {
        "id": 949,
        "url": "http://patches.dpdk.org/api/people/949/?format=api",
        "name": "Tomasz Jozwiak",
        "email": "tomaszx.jozwiak@intel.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1538400427-20164-2-git-send-email-tomaszx.jozwiak@intel.com/mbox/",
    "series": [
        {
            "id": 1615,
            "url": "http://patches.dpdk.org/api/series/1615/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1615",
            "date": "2018-10-01T13:27:04",
            "name": "app: add initial version of compress-perf",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/1615/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/45780/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/45780/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id BBBCC1B293;\n\tMon,  1 Oct 2018 15:27:39 +0200 (CEST)",
            "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n\tby dpdk.org (Postfix) with ESMTP id 01C9F1B204\n\tfor <dev@dpdk.org>; Mon,  1 Oct 2018 15:27:36 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n\tby fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t01 Oct 2018 06:27:35 -0700",
            "from tjozwiax-mobl.ger.corp.intel.com (HELO localhost.localdomain)\n\t([10.103.104.44])\n\tby fmsmga002.fm.intel.com with ESMTP; 01 Oct 2018 06:27:12 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.54,327,1534834800\"; d=\"scan'208\";a=\"91103214\"",
        "From": "Tomasz Jozwiak <tomaszx.jozwiak@intel.com>",
        "To": "dev@dpdk.org, fiona.trahe@intel.com, tomaszx.jozwiak@intel.com,\n\takhil.goyal@nxp.com, pablo.de.lara.guarch@intel.com",
        "Cc": "De@dpdk.org, Lara@dpdk.org, Guarch@dpdk.org",
        "Date": "Mon,  1 Oct 2018 15:27:05 +0200",
        "Message-Id": "<1538400427-20164-2-git-send-email-tomaszx.jozwiak@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1538400427-20164-1-git-send-email-tomaszx.jozwiak@intel.com>",
        "References": "<1538400427-20164-1-git-send-email-tomaszx.jozwiak@intel.com>",
        "Subject": "[dpdk-dev] [PATCH 1/3] app/compress-perf: add parser",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Added parser part into compression perf. test.\n\nSigned-off-by: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>\nSigned-off-by: Tomasz Jozwiak <tomaszx.jozwiak@intel.com>\n---\n app/Makefile                                     |   4 +\n app/meson.build                                  |   1 +\n app/test-compress-perf/Makefile                  |  16 +\n app/test-compress-perf/comp_perf_options.h       |  59 +++\n app/test-compress-perf/comp_perf_options_parse.c | 596 +++++++++++++++++++++++\n app/test-compress-perf/main.c                    |  52 ++\n app/test-compress-perf/meson.build               |   7 +\n config/common_base                               |   5 +\n 8 files changed, 740 insertions(+)\n create mode 100644 app/test-compress-perf/Makefile\n create mode 100644 app/test-compress-perf/comp_perf_options.h\n create mode 100644 app/test-compress-perf/comp_perf_options_parse.c\n create mode 100644 app/test-compress-perf/main.c\n create mode 100644 app/test-compress-perf/meson.build",
    "diff": "diff --git a/app/Makefile b/app/Makefile\nindex 069fa98..d6641ef 100644\n--- a/app/Makefile\n+++ b/app/Makefile\n@@ -11,6 +11,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_BBDEV),y)\n DIRS-$(CONFIG_RTE_TEST_BBDEV) += test-bbdev\n endif\n \n+ifeq ($(CONFIG_RTE_LIBRTE_COMPRESSDEV),y)\n+DIRS-$(CONFIG_RTE_APP_COMPRESS_PERF) += test-compress-perf\n+endif\n+\n ifeq ($(CONFIG_RTE_LIBRTE_CRYPTODEV),y)\n DIRS-$(CONFIG_RTE_APP_CRYPTO_PERF) += test-crypto-perf\n endif\ndiff --git a/app/meson.build b/app/meson.build\nindex 99e0b93..c2ebb11 100644\n--- a/app/meson.build\n+++ b/app/meson.build\n@@ -4,6 +4,7 @@\n apps = ['pdump',\n \t'proc-info',\n \t'test-bbdev',\n+\t'test-compress-perf',\n \t'test-crypto-perf',\n \t'test-eventdev',\n \t'test-pmd']\ndiff --git a/app/test-compress-perf/Makefile b/app/test-compress-perf/Makefile\nnew file mode 100644\nindex 0000000..8aa7a22\n--- /dev/null\n+++ b/app/test-compress-perf/Makefile\n@@ -0,0 +1,16 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2018 Intel Corporation\n+\n+include $(RTE_SDK)/mk/rte.vars.mk\n+\n+APP = dpdk-test-compress-perf\n+\n+CFLAGS += $(WERROR_FLAGS)\n+CFLAGS += -DALLOW_EXPERIMENTAL_API\n+CFLAGS += -O3\n+\n+# all source are stored in SRCS-y\n+SRCS-y := main.c\n+SRCS-y += comp_perf_options_parse.c\n+\n+include $(RTE_SDK)/mk/rte.app.mk\ndiff --git a/app/test-compress-perf/comp_perf_options.h b/app/test-compress-perf/comp_perf_options.h\nnew file mode 100644\nindex 0000000..7516ea0\n--- /dev/null\n+++ b/app/test-compress-perf/comp_perf_options.h\n@@ -0,0 +1,59 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#define MAX_DRIVER_NAME\t\t64\n+#define MAX_INPUT_FILE_NAME\t64\n+#define MAX_LIST\t\t32\n+\n+enum comp_operation {\n+\tCOMPRESS_ONLY,\n+\tDECOMPRESS_ONLY,\n+\tCOMPRESS_DECOMPRESS\n+};\n+\n+struct range_list {\n+\tuint8_t min;\n+\tuint8_t max;\n+\tuint8_t inc;\n+\tuint8_t count;\n+\tuint8_t list[MAX_LIST];\n+};\n+\n+struct comp_test_data {\n+\tchar driver_name[64];\n+\tchar input_file[64];\n+\tstruct rte_mbuf **comp_bufs;\n+\tstruct rte_mbuf **decomp_bufs;\n+\tuint32_t total_bufs;\n+\tuint8_t *input_data;\n+\tsize_t input_data_sz;\n+\tuint8_t *compressed_data;\n+\tuint8_t *decompressed_data;\n+\tstruct rte_mempool *comp_buf_pool;\n+\tstruct rte_mempool *decomp_buf_pool;\n+\tstruct rte_mempool *op_pool;\n+\tint8_t cdev_id;\n+\tuint16_t seg_sz;\n+\tuint16_t burst_sz;\n+\tuint32_t pool_sz;\n+\tuint32_t num_iter;\n+\tuint16_t max_sgl_segs;\n+\tenum rte_comp_huffman huffman_enc;\n+\tenum comp_operation test_op;\n+\tint window_sz;\n+\tstruct range_list level;\n+\t/* Store TSC duration for all levels (including level 0) */\n+\tuint64_t comp_tsc_duration[RTE_COMP_LEVEL_MAX + 1];\n+\tuint64_t decomp_tsc_duration[RTE_COMP_LEVEL_MAX + 1];\n+};\n+\n+int\n+comp_perf_options_parse(struct comp_test_data *test_data, int argc,\n+\t\t\tchar **argv);\n+\n+void\n+comp_perf_options_default(struct comp_test_data *test_data);\n+\n+int\n+comp_perf_options_check(struct comp_test_data *test_data);\ndiff --git a/app/test-compress-perf/comp_perf_options_parse.c b/app/test-compress-perf/comp_perf_options_parse.c\nnew file mode 100644\nindex 0000000..bef4d2f\n--- /dev/null\n+++ b/app/test-compress-perf/comp_perf_options_parse.c\n@@ -0,0 +1,596 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#include <getopt.h>\n+#include <stdint.h>\n+#include <stdio.h>\n+#include <string.h>\n+#include <inttypes.h>\n+#include <stdlib.h>\n+#include <errno.h>\n+\n+#include <rte_string_fns.h>\n+#include <rte_comp.h>\n+\n+#include \"comp_perf_options.h\"\n+\n+#define CPERF_DRIVER_NAME\t(\"driver-name\")\n+#define CPERF_TEST_FILE\t\t(\"input-file\")\n+#define CPERF_SEG_SIZE\t\t(\"seg-sz\")\n+#define CPERF_BURST_SIZE\t(\"burst-sz\")\n+#define CPERF_EXTENDED_SIZE\t(\"extended-input-sz\")\n+#define CPERF_POOL_SIZE\t\t(\"pool-sz\")\n+#define CPERF_MAX_SGL_SEGS\t(\"max-num-sgl-segs\")\n+#define CPERF_NUM_ITER\t\t(\"num-iter\")\n+#define CPERF_OPTYPE\t\t(\"operation\")\n+#define CPERF_HUFFMAN_ENC\t(\"huffman-enc\")\n+#define CPERF_LEVEL\t\t(\"compress-level\")\n+#define CPERF_WINDOW_SIZE\t(\"window-sz\")\n+\n+struct name_id_map {\n+\tconst char *name;\n+\tuint32_t id;\n+};\n+\n+static void\n+usage(char *progname)\n+{\n+\tprintf(\"%s [EAL options] --\\n\"\n+\t\t\" --driver-name NAME: compress driver to use\\n\"\n+\t\t\" --input-file NAME: file to compress and decompress\\n\"\n+\t\t\" --extended-input-sz N: extend file data up to this size (default: no extension)\\n\"\n+\t\t\" --seg-sz N: size of segment to store the data (default: 2048)\\n\"\n+\t\t\" --burst-sz N: compress operation burst size\\n\"\n+\t\t\" --pool-sz N: mempool size for compress operations/mbufs\\n\"\n+\t\t\"\t\t(default: 8192)\\n\"\n+\t\t\" --max-num-sgl-segs N: maximum number of segments for each mbuf\\n\"\n+\t\t\"\t\t(default: 65535)\\n\"\n+\t\t\" --num-iter N: number of times the file will be\\n\"\n+\t\t\"\t\tcompressed/decompressed (default: 10000)\\n\"\n+\t\t\" --operation [comp/decomp/comp_and_decomp]: perform test on\\n\"\n+\t\t\"\t\tcompression, decompression or both operations\\n\"\n+\t\t\" --huffman-enc [fixed/dynamic/default]: Huffman encoding\\n\"\n+\t\t\"\t\t(default: dynamic)\\n\"\n+\t\t\" --compress-level N: compression level, which could be a single value, list or range\\n\"\n+\t\t\"\t\t(default: range between 1 and 9)\\n\"\n+\t\t\" --window-sz N: base two log value of compression window size\\n\"\n+\t\t\"\t\t(e.g.: 15 => 32k, default: max supported by PMD)\\n\"\n+\t\t\" -h: prints this help\\n\",\n+\t\tprogname);\n+}\n+\n+static int\n+get_str_key_id_mapping(struct name_id_map *map, unsigned int map_len,\n+\t\tconst char *str_key)\n+{\n+\tunsigned int i;\n+\n+\tfor (i = 0; i < map_len; i++) {\n+\n+\t\tif (strcmp(str_key, map[i].name) == 0)\n+\t\t\treturn map[i].id;\n+\t}\n+\n+\treturn -1;\n+}\n+\n+static int\n+parse_uint32_t(uint32_t *value, const char *arg)\n+{\n+\tchar *end = NULL;\n+\tunsigned long n = strtoul(arg, &end, 10);\n+\n+\tif ((optarg[0] == '\\0') || (end == NULL) || (*end != '\\0'))\n+\t\treturn -1;\n+\n+\tif (n > UINT32_MAX)\n+\t\treturn -ERANGE;\n+\n+\t*value = (uint32_t) n;\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_uint16_t(uint16_t *value, const char *arg)\n+{\n+\tuint32_t val = 0;\n+\tint ret = parse_uint32_t(&val, arg);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tif (val > UINT16_MAX)\n+\t\treturn -ERANGE;\n+\n+\t*value = (uint16_t) val;\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_range(const char *arg, uint8_t *min, uint8_t *max, uint8_t *inc)\n+{\n+\tchar *token;\n+\tuint8_t number;\n+\n+\tchar *copy_arg = strdup(arg);\n+\n+\tif (copy_arg == NULL)\n+\t\treturn -1;\n+\n+\terrno = 0;\n+\ttoken = strtok(copy_arg, \":\");\n+\n+\t/* Parse minimum value */\n+\tif (token != NULL) {\n+\t\tnumber = strtoul(token, NULL, 10);\n+\n+\t\tif (errno == EINVAL || errno == ERANGE)\n+\t\t\tgoto err_range;\n+\n+\t\t*min = number;\n+\t} else\n+\t\tgoto err_range;\n+\n+\ttoken = strtok(NULL, \":\");\n+\n+\t/* Parse increment value */\n+\tif (token != NULL) {\n+\t\tnumber = strtoul(token, NULL, 10);\n+\n+\t\tif (errno == EINVAL || errno == ERANGE ||\n+\t\t\t\tnumber == 0)\n+\t\t\tgoto err_range;\n+\n+\t\t*inc = number;\n+\t} else\n+\t\tgoto err_range;\n+\n+\ttoken = strtok(NULL, \":\");\n+\n+\t/* Parse maximum value */\n+\tif (token != NULL) {\n+\t\tnumber = strtoul(token, NULL, 10);\n+\n+\t\tif (errno == EINVAL || errno == ERANGE ||\n+\t\t\t\tnumber < *min)\n+\t\t\tgoto err_range;\n+\n+\t\t*max = number;\n+\t} else\n+\t\tgoto err_range;\n+\n+\tif (strtok(NULL, \":\") != NULL)\n+\t\tgoto err_range;\n+\n+\tfree(copy_arg);\n+\treturn 0;\n+\n+err_range:\n+\tfree(copy_arg);\n+\treturn -1;\n+}\n+\n+static int\n+parse_list(const char *arg, uint8_t *list, uint8_t *min, uint8_t *max)\n+{\n+\tchar *token;\n+\tuint32_t number;\n+\tuint8_t count = 0;\n+\tuint32_t temp_min;\n+\tuint32_t temp_max;\n+\n+\tchar *copy_arg = strdup(arg);\n+\n+\tif (copy_arg == NULL)\n+\t\treturn -1;\n+\n+\terrno = 0;\n+\ttoken = strtok(copy_arg, \",\");\n+\n+\t/* Parse first value */\n+\tif (token != NULL) {\n+\t\tnumber = strtoul(token, NULL, 10);\n+\n+\t\tif (errno == EINVAL || errno == ERANGE)\n+\t\t\tgoto err_list;\n+\n+\t\tlist[count++] = number;\n+\t\ttemp_min = number;\n+\t\ttemp_max = number;\n+\t} else\n+\t\tgoto err_list;\n+\n+\ttoken = strtok(NULL, \",\");\n+\n+\twhile (token != NULL) {\n+\t\tif (count == MAX_LIST) {\n+\t\t\tRTE_LOG(WARNING, USER1,\n+\t\t\t\t\"Using only the first %u sizes\\n\",\n+\t\t\t\t\tMAX_LIST);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tnumber = strtoul(token, NULL, 10);\n+\n+\t\tif (errno == EINVAL || errno == ERANGE)\n+\t\t\tgoto err_list;\n+\n+\t\tlist[count++] = number;\n+\n+\t\tif (number < temp_min)\n+\t\t\ttemp_min = number;\n+\t\tif (number > temp_max)\n+\t\t\ttemp_max = number;\n+\n+\t\ttoken = strtok(NULL, \",\");\n+\t}\n+\n+\tif (min)\n+\t\t*min = temp_min;\n+\tif (max)\n+\t\t*max = temp_max;\n+\n+\tfree(copy_arg);\n+\treturn count;\n+\n+err_list:\n+\tfree(copy_arg);\n+\treturn -1;\n+}\n+\n+static int\n+parse_num_iter(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint32_t(&test_data->num_iter, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse total iteration count\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (test_data->num_iter == 0) {\n+\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\t\"Total number of iterations must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static int\n+parse_pool_sz(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint32_t(&test_data->pool_sz, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse pool size\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (test_data->pool_sz == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Pool size must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static int\n+parse_burst_sz(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint16_t(&test_data->burst_sz, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse burst size/s\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (test_data->burst_sz == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Burst size must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_extended_input_sz(struct comp_test_data *test_data, const char *arg)\n+{\n+\tuint32_t tmp;\n+\tint ret = parse_uint32_t(&tmp, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse extended input size\\n\");\n+\t\treturn -1;\n+\t}\n+\ttest_data->input_data_sz = tmp;\n+\n+\tif (tmp == 0) {\n+\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\"Extended file size must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+\n+static int\n+parse_seg_sz(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint16_t(&test_data->seg_sz, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse segment size\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (test_data->seg_sz == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Segment size must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_max_num_sgl_segs(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint16_t(&test_data->max_sgl_segs, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\"Failed to parse max number of segments per mbuf chain\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (test_data->max_sgl_segs == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Max number of segments per mbuf chain \"\n+\t\t\t\"must be higher than 0\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_window_sz(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret = parse_uint16_t((uint16_t *)&test_data->window_sz, arg);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed to parse window size\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_driver_name(struct comp_test_data *test_data, const char *arg)\n+{\n+\tif (strlen(arg) > (sizeof(test_data->driver_name) - 1))\n+\t\treturn -1;\n+\n+\trte_strlcpy(test_data->driver_name, arg,\n+\t\t\tsizeof(test_data->driver_name));\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_test_file(struct comp_test_data *test_data, const char *arg)\n+{\n+\tif (strlen(arg) > (sizeof(test_data->input_file) - 1))\n+\t\treturn -1;\n+\n+\trte_strlcpy(test_data->input_file, arg, sizeof(test_data->input_file));\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_op_type(struct comp_test_data *test_data, const char *arg)\n+{\n+\tstruct name_id_map optype_namemap[] = {\n+\t\t{\n+\t\t\t\"comp\",\n+\t\t\tCOMPRESS_ONLY\n+\t\t},\n+\t\t{\n+\t\t\t\"decomp\",\n+\t\t\tDECOMPRESS_ONLY\n+\t\t},\n+\t\t{\n+\t\t\t\"comp_and_decomp\",\n+\t\t\tCOMPRESS_DECOMPRESS\n+\t\t}\n+\t};\n+\n+\tint id = get_str_key_id_mapping(optype_namemap,\n+\t\t\tRTE_DIM(optype_namemap), arg);\n+\tif (id < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Invalid operation type specified\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\ttest_data->test_op = (enum comp_operation)id;\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_huffman_enc(struct comp_test_data *test_data, const char *arg)\n+{\n+\tstruct name_id_map huffman_namemap[] = {\n+\t\t{\n+\t\t\t\"default\",\n+\t\t\tRTE_COMP_HUFFMAN_DEFAULT\n+\t\t},\n+\t\t{\n+\t\t\t\"fixed\",\n+\t\t\tRTE_COMP_HUFFMAN_FIXED\n+\t\t},\n+\t\t{\n+\t\t\t\"dynamic\",\n+\t\t\tRTE_COMP_HUFFMAN_DYNAMIC\n+\t\t}\n+\t};\n+\n+\tint id = get_str_key_id_mapping(huffman_namemap,\n+\t\t\tRTE_DIM(huffman_namemap), arg);\n+\tif (id < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Invalid Huffmane encoding specified\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\ttest_data->huffman_enc = (enum rte_comp_huffman)id;\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_level(struct comp_test_data *test_data, const char *arg)\n+{\n+\tint ret;\n+\n+\t/*\n+\t * Try parsing the argument as a range, if it fails,\n+\t * arse it as a list\n+\t */\n+\tif (parse_range(arg, &test_data->level.min, &test_data->level.max,\n+\t\t\t&test_data->level.inc) < 0) {\n+\t\tret = parse_list(arg, test_data->level.list,\n+\t\t\t\t\t&test_data->level.min,\n+\t\t\t\t\t&test_data->level.max);\n+\t\tif (ret < 0) {\n+\t\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\t\"Failed to parse compression level/s\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\ttest_data->level.count = ret;\n+\n+\t\tif (test_data->level.max > RTE_COMP_LEVEL_MAX) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Level cannot be higher than %u\\n\",\n+\t\t\t\t\tRTE_COMP_LEVEL_MAX);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+typedef int (*option_parser_t)(struct comp_test_data *test_data,\n+\t\tconst char *arg);\n+\n+struct long_opt_parser {\n+\tconst char *lgopt_name;\n+\toption_parser_t parser_fn;\n+\n+};\n+\n+static struct option lgopts[] = {\n+\n+\t{ CPERF_DRIVER_NAME, required_argument, 0, 0 },\n+\t{ CPERF_TEST_FILE, required_argument, 0, 0 },\n+\t{ CPERF_SEG_SIZE, required_argument, 0, 0 },\n+\t{ CPERF_BURST_SIZE, required_argument, 0, 0 },\n+\t{ CPERF_EXTENDED_SIZE, required_argument, 0, 0 },\n+\t{ CPERF_POOL_SIZE, required_argument, 0, 0 },\n+\t{ CPERF_MAX_SGL_SEGS, required_argument, 0, 0},\n+\t{ CPERF_NUM_ITER, required_argument, 0, 0 },\n+\t{ CPERF_OPTYPE,\trequired_argument, 0, 0 },\n+\t{ CPERF_HUFFMAN_ENC, required_argument, 0, 0 },\n+\t{ CPERF_LEVEL, required_argument, 0, 0 },\n+\t{ CPERF_WINDOW_SIZE, required_argument, 0, 0 },\n+\t{ NULL, 0, 0, 0 }\n+};\n+static int\n+comp_perf_opts_parse_long(int opt_idx, struct comp_test_data *test_data)\n+{\n+\tstruct long_opt_parser parsermap[] = {\n+\t\t{ CPERF_DRIVER_NAME,\tparse_driver_name },\n+\t\t{ CPERF_TEST_FILE,\tparse_test_file },\n+\t\t{ CPERF_SEG_SIZE,\tparse_seg_sz },\n+\t\t{ CPERF_BURST_SIZE,\tparse_burst_sz },\n+\t\t{ CPERF_EXTENDED_SIZE,\tparse_extended_input_sz },\n+\t\t{ CPERF_POOL_SIZE,\tparse_pool_sz },\n+\t\t{ CPERF_MAX_SGL_SEGS,\tparse_max_num_sgl_segs },\n+\t\t{ CPERF_NUM_ITER,\tparse_num_iter },\n+\t\t{ CPERF_OPTYPE,\t\tparse_op_type },\n+\t\t{ CPERF_HUFFMAN_ENC,\tparse_huffman_enc },\n+\t\t{ CPERF_LEVEL,\t\tparse_level },\n+\t\t{ CPERF_WINDOW_SIZE,\tparse_window_sz },\n+\t};\n+\tunsigned int i;\n+\n+\tfor (i = 0; i < RTE_DIM(parsermap); i++) {\n+\t\tif (strncmp(lgopts[opt_idx].name, parsermap[i].lgopt_name,\n+\t\t\t\tstrlen(lgopts[opt_idx].name)) == 0)\n+\t\t\treturn parsermap[i].parser_fn(test_data, optarg);\n+\t}\n+\n+\treturn -EINVAL;\n+}\n+\n+int\n+comp_perf_options_parse(struct comp_test_data *test_data, int argc, char **argv)\n+{\n+\tint opt, retval, opt_idx;\n+\n+\twhile ((opt = getopt_long(argc, argv, \"h\", lgopts, &opt_idx)) != EOF) {\n+\t\tswitch (opt) {\n+\t\tcase 'h':\n+\t\t\tusage(argv[0]);\n+\t\t\trte_exit(EXIT_SUCCESS, \"Displayed help\\n\");\n+\t\t\tbreak;\n+\t\t/* long options */\n+\t\tcase 0:\n+\t\t\tretval = comp_perf_opts_parse_long(opt_idx, test_data);\n+\t\t\tif (retval != 0)\n+\t\t\t\treturn retval;\n+\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\tusage(argv[0]);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void\n+comp_perf_options_default(struct comp_test_data *test_data)\n+{\n+\ttest_data->cdev_id = -1;\n+\ttest_data->seg_sz = 2048;\n+\ttest_data->burst_sz = 32;\n+\ttest_data->pool_sz = 8192;\n+\ttest_data->max_sgl_segs = UINT16_MAX;\n+\ttest_data->num_iter = 10000;\n+\ttest_data->huffman_enc = RTE_COMP_HUFFMAN_DYNAMIC;\n+\ttest_data->test_op = COMPRESS_DECOMPRESS;\n+\ttest_data->window_sz = -1;\n+\ttest_data->level.min = 1;\n+\ttest_data->level.max = 9;\n+\ttest_data->level.inc = 1;\n+}\n+\n+int\n+comp_perf_options_check(struct comp_test_data *test_data)\n+{\n+\tif (strcmp(test_data->driver_name, \"\") == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Driver name has to be set\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (strcmp(test_data->input_file, \"\") == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Input file name has to be set\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/app/test-compress-perf/main.c b/app/test-compress-perf/main.c\nnew file mode 100644\nindex 0000000..f52b98d\n--- /dev/null\n+++ b/app/test-compress-perf/main.c\n@@ -0,0 +1,52 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#include <rte_malloc.h>\n+#include <rte_eal.h>\n+#include <rte_log.h>\n+#include <rte_compressdev.h>\n+\n+#include \"comp_perf_options.h\"\n+\n+int\n+main(int argc, char **argv)\n+{\n+\tint ret;\n+\tstruct comp_test_data *test_data;\n+\n+\t/* Initialise DPDK EAL */\n+\tret = rte_eal_init(argc, argv);\n+\tif (ret < 0)\n+\t\trte_exit(EXIT_FAILURE, \"Invalid EAL arguments!\\n\");\n+\targc -= ret;\n+\targv += ret;\n+\n+\ttest_data = rte_zmalloc_socket(NULL, sizeof(struct comp_test_data),\n+\t\t\t\t\t0, rte_socket_id());\n+\n+\tif (test_data == NULL)\n+\t\trte_exit(EXIT_FAILURE, \"Cannot reserve memory in socket %d\\n\",\n+\t\t\t\trte_socket_id());\n+\n+\tcomp_perf_options_default(test_data);\n+\n+\tif (comp_perf_options_parse(test_data, argc, argv) < 0) {\n+\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\"Parsing one or more user options failed\\n\");\n+\t\tret = EXIT_FAILURE;\n+\t\tgoto err;\n+\t}\n+\n+\tif (comp_perf_options_check(test_data) < 0) {\n+\t\tret = EXIT_FAILURE;\n+\t\tgoto err;\n+\t}\n+\n+\tret = EXIT_SUCCESS;\n+\n+err:\n+\trte_free(test_data);\n+\n+\treturn ret;\n+}\ndiff --git a/app/test-compress-perf/meson.build b/app/test-compress-perf/meson.build\nnew file mode 100644\nindex 0000000..ba6d64d\n--- /dev/null\n+++ b/app/test-compress-perf/meson.build\n@@ -0,0 +1,7 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2018 Intel Corporation\n+\n+allow_experimental_apis = true\n+sources = files('comp_perf_options_parse.c',\n+\t\t'main.c')\n+deps = ['compressdev']\ndiff --git a/config/common_base b/config/common_base\nindex 155c7d4..23bf58a0 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -902,6 +902,11 @@ CONFIG_RTE_TEST_PMD_RECORD_BURST_STATS=n\n CONFIG_RTE_TEST_BBDEV=y\n \n #\n+# Compile the compression performance application\n+#\n+CONFIG_RTE_APP_COMPRESS_PERF=y\n+\n+#\n # Compile the crypto performance application\n #\n CONFIG_RTE_APP_CRYPTO_PERF=y\n",
    "prefixes": [
        "1/3"
    ]
}