1e0b6287cSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause 2e0b6287cSTomasz Jozwiak * Copyright(c) 2018 Intel Corporation 3e0b6287cSTomasz Jozwiak */ 4e0b6287cSTomasz Jozwiak 5e0b6287cSTomasz Jozwiak #include <getopt.h> 6e0b6287cSTomasz Jozwiak #include <stdint.h> 7e0b6287cSTomasz Jozwiak #include <stdio.h> 8e0b6287cSTomasz Jozwiak #include <string.h> 9e0b6287cSTomasz Jozwiak #include <inttypes.h> 10e0b6287cSTomasz Jozwiak #include <stdlib.h> 11e0b6287cSTomasz Jozwiak #include <errno.h> 12e0b6287cSTomasz Jozwiak 13e0b6287cSTomasz Jozwiak #include <rte_string_fns.h> 14e0b6287cSTomasz Jozwiak #include <rte_comp.h> 15e0b6287cSTomasz Jozwiak 16e0b6287cSTomasz Jozwiak #include "comp_perf_options.h" 17e0b6287cSTomasz Jozwiak 181a9b0f35STomasz Jozwiak #define CPERF_PTEST_TYPE ("ptest") 19e0b6287cSTomasz Jozwiak #define CPERF_DRIVER_NAME ("driver-name") 20e0b6287cSTomasz Jozwiak #define CPERF_TEST_FILE ("input-file") 21e0b6287cSTomasz Jozwiak #define CPERF_SEG_SIZE ("seg-sz") 22e0b6287cSTomasz Jozwiak #define CPERF_BURST_SIZE ("burst-sz") 23e0b6287cSTomasz Jozwiak #define CPERF_EXTENDED_SIZE ("extended-input-sz") 24e0b6287cSTomasz Jozwiak #define CPERF_POOL_SIZE ("pool-sz") 25e0b6287cSTomasz Jozwiak #define CPERF_MAX_SGL_SEGS ("max-num-sgl-segs") 26e0b6287cSTomasz Jozwiak #define CPERF_NUM_ITER ("num-iter") 27e0b6287cSTomasz Jozwiak #define CPERF_OPTYPE ("operation") 28e0b6287cSTomasz Jozwiak #define CPERF_HUFFMAN_ENC ("huffman-enc") 29e0b6287cSTomasz Jozwiak #define CPERF_LEVEL ("compress-level") 30e0b6287cSTomasz Jozwiak #define CPERF_WINDOW_SIZE ("window-sz") 31c02e33b0SAdam Dybkowski #define CPERF_EXTERNAL_MBUFS ("external-mbufs") 32e0b6287cSTomasz Jozwiak 332695db95SArtur Trybula /* cyclecount-specific options */ 342695db95SArtur Trybula #define CPERF_CYCLECOUNT_DELAY_US ("cc-delay-us") 352695db95SArtur Trybula 36e0b6287cSTomasz Jozwiak struct name_id_map { 37e0b6287cSTomasz Jozwiak const char *name; 38e0b6287cSTomasz Jozwiak uint32_t id; 39e0b6287cSTomasz Jozwiak }; 40e0b6287cSTomasz Jozwiak 41e0b6287cSTomasz Jozwiak static void 42e0b6287cSTomasz Jozwiak usage(char *progname) 43e0b6287cSTomasz Jozwiak { 44e0b6287cSTomasz Jozwiak printf("%s [EAL options] --\n" 452695db95SArtur Trybula " --ptest throughput / verify / pmd-cyclecount\n" 46e0b6287cSTomasz Jozwiak " --driver-name NAME: compress driver to use\n" 47e0b6287cSTomasz Jozwiak " --input-file NAME: file to compress and decompress\n" 48e0b6287cSTomasz Jozwiak " --extended-input-sz N: extend file data up to this size (default: no extension)\n" 49e0b6287cSTomasz Jozwiak " --seg-sz N: size of segment to store the data (default: 2048)\n" 50e0b6287cSTomasz Jozwiak " --burst-sz N: compress operation burst size\n" 51e0b6287cSTomasz Jozwiak " --pool-sz N: mempool size for compress operations/mbufs\n" 52e0b6287cSTomasz Jozwiak " (default: 8192)\n" 53e0b6287cSTomasz Jozwiak " --max-num-sgl-segs N: maximum number of segments for each mbuf\n" 54e0b6287cSTomasz Jozwiak " (default: 16)\n" 55e0b6287cSTomasz Jozwiak " --num-iter N: number of times the file will be\n" 56e0b6287cSTomasz Jozwiak " compressed/decompressed (default: 10000)\n" 57e0b6287cSTomasz Jozwiak " --operation [comp/decomp/comp_and_decomp]: perform test on\n" 58e0b6287cSTomasz Jozwiak " compression, decompression or both operations\n" 59fedfef43STomasz Jozwiak " --huffman-enc [fixed/dynamic/default]: Huffman encoding\n" 60fedfef43STomasz Jozwiak " (default: dynamic)\n" 61e0b6287cSTomasz Jozwiak " --compress-level N: compression level, which could be a single value, list or range\n" 62e0b6287cSTomasz Jozwiak " (default: range between 1 and 9)\n" 63e0b6287cSTomasz Jozwiak " --window-sz N: base two log value of compression window size\n" 64e0b6287cSTomasz Jozwiak " (e.g.: 15 => 32k, default: max supported by PMD)\n" 65c02e33b0SAdam Dybkowski " --external-mbufs: use memzones as external buffers instead of\n" 66c02e33b0SAdam Dybkowski " keeping the data directly in mbuf area\n" 672695db95SArtur Trybula " --cc-delay-us N: delay between enqueue and dequeue operations in microseconds\n" 682695db95SArtur Trybula " valid only for cyclecount perf test (default: 500 us)\n" 69e0b6287cSTomasz Jozwiak " -h: prints this help\n", 70e0b6287cSTomasz Jozwiak progname); 71e0b6287cSTomasz Jozwiak } 72e0b6287cSTomasz Jozwiak 73e0b6287cSTomasz Jozwiak static int 74e0b6287cSTomasz Jozwiak get_str_key_id_mapping(struct name_id_map *map, unsigned int map_len, 75e0b6287cSTomasz Jozwiak const char *str_key) 76e0b6287cSTomasz Jozwiak { 77e0b6287cSTomasz Jozwiak unsigned int i; 78e0b6287cSTomasz Jozwiak 79e0b6287cSTomasz Jozwiak for (i = 0; i < map_len; i++) { 80e0b6287cSTomasz Jozwiak 81e0b6287cSTomasz Jozwiak if (strcmp(str_key, map[i].name) == 0) 82e0b6287cSTomasz Jozwiak return map[i].id; 83e0b6287cSTomasz Jozwiak } 84e0b6287cSTomasz Jozwiak 85e0b6287cSTomasz Jozwiak return -1; 86e0b6287cSTomasz Jozwiak } 87e0b6287cSTomasz Jozwiak 88e0b6287cSTomasz Jozwiak static int 891a9b0f35STomasz Jozwiak parse_cperf_test_type(struct comp_test_data *test_data, const char *arg) 901a9b0f35STomasz Jozwiak { 911a9b0f35STomasz Jozwiak struct name_id_map cperftest_namemap[] = { 921a9b0f35STomasz Jozwiak { 932695db95SArtur Trybula comp_perf_test_type_strs[CPERF_TEST_TYPE_THROUGHPUT], 942695db95SArtur Trybula CPERF_TEST_TYPE_THROUGHPUT 951a9b0f35STomasz Jozwiak }, 961a9b0f35STomasz Jozwiak { 974fba6df9SLavanya Govindarajan comp_perf_test_type_strs[CPERF_TEST_TYPE_VERIFY], 981a9b0f35STomasz Jozwiak CPERF_TEST_TYPE_VERIFY 992695db95SArtur Trybula }, 1002695db95SArtur Trybula { 1012695db95SArtur Trybula comp_perf_test_type_strs[CPERF_TEST_TYPE_PMDCC], 1022695db95SArtur Trybula CPERF_TEST_TYPE_PMDCC 1031a9b0f35STomasz Jozwiak } 1041a9b0f35STomasz Jozwiak }; 1051a9b0f35STomasz Jozwiak 1061a9b0f35STomasz Jozwiak int id = get_str_key_id_mapping( 1071a9b0f35STomasz Jozwiak (struct name_id_map *)cperftest_namemap, 1081a9b0f35STomasz Jozwiak RTE_DIM(cperftest_namemap), arg); 1091a9b0f35STomasz Jozwiak if (id < 0) { 1101a9b0f35STomasz Jozwiak RTE_LOG(ERR, USER1, "failed to parse test type"); 1111a9b0f35STomasz Jozwiak return -1; 1121a9b0f35STomasz Jozwiak } 1131a9b0f35STomasz Jozwiak 1148c7a3131SArtur Trybula test_data->test = (enum cperf_test_type)id; 1151a9b0f35STomasz Jozwiak 1161a9b0f35STomasz Jozwiak return 0; 1171a9b0f35STomasz Jozwiak } 1181a9b0f35STomasz Jozwiak 1191a9b0f35STomasz Jozwiak static int 120e0b6287cSTomasz Jozwiak parse_uint32_t(uint32_t *value, const char *arg) 121e0b6287cSTomasz Jozwiak { 122e0b6287cSTomasz Jozwiak char *end = NULL; 123e0b6287cSTomasz Jozwiak unsigned long n = strtoul(arg, &end, 10); 124e0b6287cSTomasz Jozwiak 125e0b6287cSTomasz Jozwiak if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0')) 126e0b6287cSTomasz Jozwiak return -1; 127e0b6287cSTomasz Jozwiak 128e0b6287cSTomasz Jozwiak if (n > UINT32_MAX) 129e0b6287cSTomasz Jozwiak return -ERANGE; 130e0b6287cSTomasz Jozwiak 131e0b6287cSTomasz Jozwiak *value = (uint32_t) n; 132e0b6287cSTomasz Jozwiak 133e0b6287cSTomasz Jozwiak return 0; 134e0b6287cSTomasz Jozwiak } 135e0b6287cSTomasz Jozwiak 136e0b6287cSTomasz Jozwiak static int 137e0b6287cSTomasz Jozwiak parse_uint16_t(uint16_t *value, const char *arg) 138e0b6287cSTomasz Jozwiak { 139e0b6287cSTomasz Jozwiak uint32_t val = 0; 140e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&val, arg); 141e0b6287cSTomasz Jozwiak 142e0b6287cSTomasz Jozwiak if (ret < 0) 143e0b6287cSTomasz Jozwiak return ret; 144e0b6287cSTomasz Jozwiak 145e0b6287cSTomasz Jozwiak if (val > UINT16_MAX) 146e0b6287cSTomasz Jozwiak return -ERANGE; 147e0b6287cSTomasz Jozwiak 148e0b6287cSTomasz Jozwiak *value = (uint16_t) val; 149e0b6287cSTomasz Jozwiak 150e0b6287cSTomasz Jozwiak return 0; 151e0b6287cSTomasz Jozwiak } 152e0b6287cSTomasz Jozwiak 153e0b6287cSTomasz Jozwiak static int 154e0b6287cSTomasz Jozwiak parse_range(const char *arg, uint8_t *min, uint8_t *max, uint8_t *inc) 155e0b6287cSTomasz Jozwiak { 156e0b6287cSTomasz Jozwiak char *token; 157e0b6287cSTomasz Jozwiak uint8_t number; 158e0b6287cSTomasz Jozwiak 159e0b6287cSTomasz Jozwiak char *copy_arg = strdup(arg); 160e0b6287cSTomasz Jozwiak 161e0b6287cSTomasz Jozwiak if (copy_arg == NULL) 162e0b6287cSTomasz Jozwiak return -1; 163e0b6287cSTomasz Jozwiak 164e0b6287cSTomasz Jozwiak errno = 0; 165e0b6287cSTomasz Jozwiak token = strtok(copy_arg, ":"); 166e0b6287cSTomasz Jozwiak 167e0b6287cSTomasz Jozwiak /* Parse minimum value */ 168e0b6287cSTomasz Jozwiak if (token != NULL) { 169e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 170e0b6287cSTomasz Jozwiak 171e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 172e0b6287cSTomasz Jozwiak goto err_range; 173e0b6287cSTomasz Jozwiak 174e0b6287cSTomasz Jozwiak *min = number; 175e0b6287cSTomasz Jozwiak } else 176e0b6287cSTomasz Jozwiak goto err_range; 177e0b6287cSTomasz Jozwiak 178e0b6287cSTomasz Jozwiak token = strtok(NULL, ":"); 179e0b6287cSTomasz Jozwiak 180e0b6287cSTomasz Jozwiak /* Parse increment value */ 181e0b6287cSTomasz Jozwiak if (token != NULL) { 182e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 183e0b6287cSTomasz Jozwiak 184e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE || 185e0b6287cSTomasz Jozwiak number == 0) 186e0b6287cSTomasz Jozwiak goto err_range; 187e0b6287cSTomasz Jozwiak 188e0b6287cSTomasz Jozwiak *inc = number; 189e0b6287cSTomasz Jozwiak } else 190e0b6287cSTomasz Jozwiak goto err_range; 191e0b6287cSTomasz Jozwiak 192e0b6287cSTomasz Jozwiak token = strtok(NULL, ":"); 193e0b6287cSTomasz Jozwiak 194e0b6287cSTomasz Jozwiak /* Parse maximum value */ 195e0b6287cSTomasz Jozwiak if (token != NULL) { 196e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 197e0b6287cSTomasz Jozwiak 198e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE || 199e0b6287cSTomasz Jozwiak number < *min) 200e0b6287cSTomasz Jozwiak goto err_range; 201e0b6287cSTomasz Jozwiak 202e0b6287cSTomasz Jozwiak *max = number; 203e0b6287cSTomasz Jozwiak } else 204e0b6287cSTomasz Jozwiak goto err_range; 205e0b6287cSTomasz Jozwiak 206e0b6287cSTomasz Jozwiak if (strtok(NULL, ":") != NULL) 207e0b6287cSTomasz Jozwiak goto err_range; 208e0b6287cSTomasz Jozwiak 209e0b6287cSTomasz Jozwiak free(copy_arg); 210e0b6287cSTomasz Jozwiak return 0; 211e0b6287cSTomasz Jozwiak 212e0b6287cSTomasz Jozwiak err_range: 213e0b6287cSTomasz Jozwiak free(copy_arg); 214e0b6287cSTomasz Jozwiak return -1; 215e0b6287cSTomasz Jozwiak } 216e0b6287cSTomasz Jozwiak 217e0b6287cSTomasz Jozwiak static int 218e0b6287cSTomasz Jozwiak parse_list(const char *arg, uint8_t *list, uint8_t *min, uint8_t *max) 219e0b6287cSTomasz Jozwiak { 220e0b6287cSTomasz Jozwiak char *token; 221e0b6287cSTomasz Jozwiak uint32_t number; 222e0b6287cSTomasz Jozwiak uint8_t count = 0; 223e0b6287cSTomasz Jozwiak uint32_t temp_min; 224e0b6287cSTomasz Jozwiak uint32_t temp_max; 225e0b6287cSTomasz Jozwiak 226e0b6287cSTomasz Jozwiak char *copy_arg = strdup(arg); 227e0b6287cSTomasz Jozwiak 228e0b6287cSTomasz Jozwiak if (copy_arg == NULL) 229e0b6287cSTomasz Jozwiak return -1; 230e0b6287cSTomasz Jozwiak 231e0b6287cSTomasz Jozwiak errno = 0; 232e0b6287cSTomasz Jozwiak token = strtok(copy_arg, ","); 233e0b6287cSTomasz Jozwiak 234e0b6287cSTomasz Jozwiak /* Parse first value */ 235e0b6287cSTomasz Jozwiak if (token != NULL) { 236e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 237e0b6287cSTomasz Jozwiak 238e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 239e0b6287cSTomasz Jozwiak goto err_list; 240e0b6287cSTomasz Jozwiak 241e0b6287cSTomasz Jozwiak list[count++] = number; 242e0b6287cSTomasz Jozwiak temp_min = number; 243e0b6287cSTomasz Jozwiak temp_max = number; 244e0b6287cSTomasz Jozwiak } else 245e0b6287cSTomasz Jozwiak goto err_list; 246e0b6287cSTomasz Jozwiak 247e0b6287cSTomasz Jozwiak token = strtok(NULL, ","); 248e0b6287cSTomasz Jozwiak 249e0b6287cSTomasz Jozwiak while (token != NULL) { 250e0b6287cSTomasz Jozwiak if (count == MAX_LIST) { 251e0b6287cSTomasz Jozwiak RTE_LOG(WARNING, USER1, 252e0b6287cSTomasz Jozwiak "Using only the first %u sizes\n", 253e0b6287cSTomasz Jozwiak MAX_LIST); 254e0b6287cSTomasz Jozwiak break; 255e0b6287cSTomasz Jozwiak } 256e0b6287cSTomasz Jozwiak 257e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 258e0b6287cSTomasz Jozwiak 259e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 260e0b6287cSTomasz Jozwiak goto err_list; 261e0b6287cSTomasz Jozwiak 262e0b6287cSTomasz Jozwiak list[count++] = number; 263e0b6287cSTomasz Jozwiak 264e0b6287cSTomasz Jozwiak if (number < temp_min) 265e0b6287cSTomasz Jozwiak temp_min = number; 266e0b6287cSTomasz Jozwiak if (number > temp_max) 267e0b6287cSTomasz Jozwiak temp_max = number; 268e0b6287cSTomasz Jozwiak 269e0b6287cSTomasz Jozwiak token = strtok(NULL, ","); 270e0b6287cSTomasz Jozwiak } 271e0b6287cSTomasz Jozwiak 272e0b6287cSTomasz Jozwiak if (min) 273e0b6287cSTomasz Jozwiak *min = temp_min; 274e0b6287cSTomasz Jozwiak if (max) 275e0b6287cSTomasz Jozwiak *max = temp_max; 276e0b6287cSTomasz Jozwiak 277e0b6287cSTomasz Jozwiak free(copy_arg); 278e0b6287cSTomasz Jozwiak return count; 279e0b6287cSTomasz Jozwiak 280e0b6287cSTomasz Jozwiak err_list: 281e0b6287cSTomasz Jozwiak free(copy_arg); 282e0b6287cSTomasz Jozwiak return -1; 283e0b6287cSTomasz Jozwiak } 284e0b6287cSTomasz Jozwiak 285e0b6287cSTomasz Jozwiak static int 286e0b6287cSTomasz Jozwiak parse_num_iter(struct comp_test_data *test_data, const char *arg) 287e0b6287cSTomasz Jozwiak { 288e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&test_data->num_iter, arg); 289e0b6287cSTomasz Jozwiak 290e0b6287cSTomasz Jozwiak if (ret) { 291e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse total iteration count\n"); 292e0b6287cSTomasz Jozwiak return -1; 293e0b6287cSTomasz Jozwiak } 294e0b6287cSTomasz Jozwiak 295e0b6287cSTomasz Jozwiak if (test_data->num_iter == 0) { 296e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 297e0b6287cSTomasz Jozwiak "Total number of iterations must be higher than 0\n"); 298e0b6287cSTomasz Jozwiak return -1; 299e0b6287cSTomasz Jozwiak } 300e0b6287cSTomasz Jozwiak 301e0b6287cSTomasz Jozwiak return ret; 302e0b6287cSTomasz Jozwiak } 303e0b6287cSTomasz Jozwiak 304e0b6287cSTomasz Jozwiak static int 305e0b6287cSTomasz Jozwiak parse_pool_sz(struct comp_test_data *test_data, const char *arg) 306e0b6287cSTomasz Jozwiak { 307e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&test_data->pool_sz, arg); 308e0b6287cSTomasz Jozwiak 309e0b6287cSTomasz Jozwiak if (ret) { 310e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse pool size"); 311e0b6287cSTomasz Jozwiak return -1; 312e0b6287cSTomasz Jozwiak } 313e0b6287cSTomasz Jozwiak 314e0b6287cSTomasz Jozwiak if (test_data->pool_sz == 0) { 315e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Pool size must be higher than 0\n"); 316e0b6287cSTomasz Jozwiak return -1; 317e0b6287cSTomasz Jozwiak } 318e0b6287cSTomasz Jozwiak 319e0b6287cSTomasz Jozwiak return ret; 320e0b6287cSTomasz Jozwiak } 321e0b6287cSTomasz Jozwiak 322e0b6287cSTomasz Jozwiak static int 323e0b6287cSTomasz Jozwiak parse_burst_sz(struct comp_test_data *test_data, const char *arg) 324e0b6287cSTomasz Jozwiak { 325e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->burst_sz, arg); 326e0b6287cSTomasz Jozwiak 327e0b6287cSTomasz Jozwiak if (ret) { 328e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse burst size/s\n"); 329e0b6287cSTomasz Jozwiak return -1; 330e0b6287cSTomasz Jozwiak } 331e0b6287cSTomasz Jozwiak 332e0b6287cSTomasz Jozwiak if (test_data->burst_sz == 0) { 333e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Burst size must be higher than 0\n"); 334e0b6287cSTomasz Jozwiak return -1; 335e0b6287cSTomasz Jozwiak } 336e0b6287cSTomasz Jozwiak 337e0b6287cSTomasz Jozwiak return 0; 338e0b6287cSTomasz Jozwiak } 339e0b6287cSTomasz Jozwiak 340e0b6287cSTomasz Jozwiak static int 341e0b6287cSTomasz Jozwiak parse_extended_input_sz(struct comp_test_data *test_data, const char *arg) 342e0b6287cSTomasz Jozwiak { 343e0b6287cSTomasz Jozwiak uint32_t tmp; 344e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&tmp, arg); 345e0b6287cSTomasz Jozwiak 346e0b6287cSTomasz Jozwiak if (ret) { 347e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse extended input size\n"); 348e0b6287cSTomasz Jozwiak return -1; 349e0b6287cSTomasz Jozwiak } 350e0b6287cSTomasz Jozwiak test_data->input_data_sz = tmp; 351e0b6287cSTomasz Jozwiak 352e0b6287cSTomasz Jozwiak if (tmp == 0) { 353e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 354e0b6287cSTomasz Jozwiak "Extended file size must be higher than 0\n"); 355e0b6287cSTomasz Jozwiak return -1; 356e0b6287cSTomasz Jozwiak } 357e0b6287cSTomasz Jozwiak return 0; 358e0b6287cSTomasz Jozwiak } 359e0b6287cSTomasz Jozwiak 360e0b6287cSTomasz Jozwiak static int 361e0b6287cSTomasz Jozwiak parse_seg_sz(struct comp_test_data *test_data, const char *arg) 362e0b6287cSTomasz Jozwiak { 363e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->seg_sz, arg); 364e0b6287cSTomasz Jozwiak 365e0b6287cSTomasz Jozwiak if (ret) { 366e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse segment size\n"); 367e0b6287cSTomasz Jozwiak return -1; 368e0b6287cSTomasz Jozwiak } 369e0b6287cSTomasz Jozwiak 37027cee417STomasz Jozwiak if (test_data->seg_sz < MIN_COMPRESSED_BUF_SIZE) { 37127cee417STomasz Jozwiak RTE_LOG(ERR, USER1, "Segment size must be higher than %d\n", 37227cee417STomasz Jozwiak MIN_COMPRESSED_BUF_SIZE - 1); 37327cee417STomasz Jozwiak return -1; 37427cee417STomasz Jozwiak } 37527cee417STomasz Jozwiak 37627cee417STomasz Jozwiak if (test_data->seg_sz > MAX_SEG_SIZE) { 37727cee417STomasz Jozwiak RTE_LOG(ERR, USER1, "Segment size must be lower than %d\n", 37827cee417STomasz Jozwiak MAX_SEG_SIZE + 1); 379e0b6287cSTomasz Jozwiak return -1; 380e0b6287cSTomasz Jozwiak } 381e0b6287cSTomasz Jozwiak 382e0b6287cSTomasz Jozwiak return 0; 383e0b6287cSTomasz Jozwiak } 384e0b6287cSTomasz Jozwiak 385e0b6287cSTomasz Jozwiak static int 386e0b6287cSTomasz Jozwiak parse_max_num_sgl_segs(struct comp_test_data *test_data, const char *arg) 387e0b6287cSTomasz Jozwiak { 388e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->max_sgl_segs, arg); 389e0b6287cSTomasz Jozwiak 390e0b6287cSTomasz Jozwiak if (ret) { 391e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 392e0b6287cSTomasz Jozwiak "Failed to parse max number of segments per mbuf chain\n"); 393e0b6287cSTomasz Jozwiak return -1; 394e0b6287cSTomasz Jozwiak } 395e0b6287cSTomasz Jozwiak 396e0b6287cSTomasz Jozwiak if (test_data->max_sgl_segs == 0) { 397e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Max number of segments per mbuf chain " 398e0b6287cSTomasz Jozwiak "must be higher than 0\n"); 399e0b6287cSTomasz Jozwiak return -1; 400e0b6287cSTomasz Jozwiak } 401e0b6287cSTomasz Jozwiak 402e0b6287cSTomasz Jozwiak return 0; 403e0b6287cSTomasz Jozwiak } 404e0b6287cSTomasz Jozwiak 405e0b6287cSTomasz Jozwiak static int 406e0b6287cSTomasz Jozwiak parse_window_sz(struct comp_test_data *test_data, const char *arg) 407e0b6287cSTomasz Jozwiak { 4081f04178dSArtur Trybula uint16_t tmp; 4091f04178dSArtur Trybula int ret = parse_uint16_t(&tmp, arg); 410e0b6287cSTomasz Jozwiak 411e0b6287cSTomasz Jozwiak if (ret) { 412e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse window size\n"); 413e0b6287cSTomasz Jozwiak return -1; 414e0b6287cSTomasz Jozwiak } 4151f04178dSArtur Trybula test_data->window_sz = (int)tmp; 416e0b6287cSTomasz Jozwiak 417e0b6287cSTomasz Jozwiak return 0; 418e0b6287cSTomasz Jozwiak } 419e0b6287cSTomasz Jozwiak 420e0b6287cSTomasz Jozwiak static int 421e0b6287cSTomasz Jozwiak parse_driver_name(struct comp_test_data *test_data, const char *arg) 422e0b6287cSTomasz Jozwiak { 423e0b6287cSTomasz Jozwiak if (strlen(arg) > (sizeof(test_data->driver_name) - 1)) 424e0b6287cSTomasz Jozwiak return -1; 425e0b6287cSTomasz Jozwiak 4266e37913fSThomas Monjalon strlcpy(test_data->driver_name, arg, 427e0b6287cSTomasz Jozwiak sizeof(test_data->driver_name)); 428e0b6287cSTomasz Jozwiak 429e0b6287cSTomasz Jozwiak return 0; 430e0b6287cSTomasz Jozwiak } 431e0b6287cSTomasz Jozwiak 432e0b6287cSTomasz Jozwiak static int 433e0b6287cSTomasz Jozwiak parse_test_file(struct comp_test_data *test_data, const char *arg) 434e0b6287cSTomasz Jozwiak { 435e0b6287cSTomasz Jozwiak if (strlen(arg) > (sizeof(test_data->input_file) - 1)) 436e0b6287cSTomasz Jozwiak return -1; 437e0b6287cSTomasz Jozwiak 4386e37913fSThomas Monjalon strlcpy(test_data->input_file, arg, sizeof(test_data->input_file)); 439e0b6287cSTomasz Jozwiak 440e0b6287cSTomasz Jozwiak return 0; 441e0b6287cSTomasz Jozwiak } 442e0b6287cSTomasz Jozwiak 443e0b6287cSTomasz Jozwiak static int 444e0b6287cSTomasz Jozwiak parse_op_type(struct comp_test_data *test_data, const char *arg) 445e0b6287cSTomasz Jozwiak { 446e0b6287cSTomasz Jozwiak struct name_id_map optype_namemap[] = { 447e0b6287cSTomasz Jozwiak { 448e0b6287cSTomasz Jozwiak "comp", 449e0b6287cSTomasz Jozwiak COMPRESS_ONLY 450e0b6287cSTomasz Jozwiak }, 451e0b6287cSTomasz Jozwiak { 452e0b6287cSTomasz Jozwiak "decomp", 453e0b6287cSTomasz Jozwiak DECOMPRESS_ONLY 454e0b6287cSTomasz Jozwiak }, 455e0b6287cSTomasz Jozwiak { 456e0b6287cSTomasz Jozwiak "comp_and_decomp", 457e0b6287cSTomasz Jozwiak COMPRESS_DECOMPRESS 458e0b6287cSTomasz Jozwiak } 459e0b6287cSTomasz Jozwiak }; 460e0b6287cSTomasz Jozwiak 461e0b6287cSTomasz Jozwiak int id = get_str_key_id_mapping(optype_namemap, 462e0b6287cSTomasz Jozwiak RTE_DIM(optype_namemap), arg); 463e0b6287cSTomasz Jozwiak if (id < 0) { 464e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Invalid operation type specified\n"); 465e0b6287cSTomasz Jozwiak return -1; 466e0b6287cSTomasz Jozwiak } 467e0b6287cSTomasz Jozwiak 468e0b6287cSTomasz Jozwiak test_data->test_op = (enum comp_operation)id; 469e0b6287cSTomasz Jozwiak 470e0b6287cSTomasz Jozwiak return 0; 471e0b6287cSTomasz Jozwiak } 472e0b6287cSTomasz Jozwiak 473e0b6287cSTomasz Jozwiak static int 474e0b6287cSTomasz Jozwiak parse_huffman_enc(struct comp_test_data *test_data, const char *arg) 475e0b6287cSTomasz Jozwiak { 476e0b6287cSTomasz Jozwiak struct name_id_map huffman_namemap[] = { 477e0b6287cSTomasz Jozwiak { 478e0b6287cSTomasz Jozwiak "default", 479e0b6287cSTomasz Jozwiak RTE_COMP_HUFFMAN_DEFAULT 480e0b6287cSTomasz Jozwiak }, 481e0b6287cSTomasz Jozwiak { 482e0b6287cSTomasz Jozwiak "fixed", 483e0b6287cSTomasz Jozwiak RTE_COMP_HUFFMAN_FIXED 484fedfef43STomasz Jozwiak }, 485fedfef43STomasz Jozwiak { 486fedfef43STomasz Jozwiak "dynamic", 487fedfef43STomasz Jozwiak RTE_COMP_HUFFMAN_DYNAMIC 488e0b6287cSTomasz Jozwiak } 489e0b6287cSTomasz Jozwiak }; 490e0b6287cSTomasz Jozwiak 491e0b6287cSTomasz Jozwiak int id = get_str_key_id_mapping(huffman_namemap, 492e0b6287cSTomasz Jozwiak RTE_DIM(huffman_namemap), arg); 493e0b6287cSTomasz Jozwiak if (id < 0) { 494*1643fc9bSMichael Baum RTE_LOG(ERR, USER1, "Invalid Huffman encoding specified\n"); 495e0b6287cSTomasz Jozwiak return -1; 496e0b6287cSTomasz Jozwiak } 497e0b6287cSTomasz Jozwiak 498e0b6287cSTomasz Jozwiak test_data->huffman_enc = (enum rte_comp_huffman)id; 499e0b6287cSTomasz Jozwiak 500e0b6287cSTomasz Jozwiak return 0; 501e0b6287cSTomasz Jozwiak } 502e0b6287cSTomasz Jozwiak 503e0b6287cSTomasz Jozwiak static int 504e0b6287cSTomasz Jozwiak parse_level(struct comp_test_data *test_data, const char *arg) 505e0b6287cSTomasz Jozwiak { 506e0b6287cSTomasz Jozwiak int ret; 507e0b6287cSTomasz Jozwiak 508e0b6287cSTomasz Jozwiak /* 509e0b6287cSTomasz Jozwiak * Try parsing the argument as a range, if it fails, 510*1643fc9bSMichael Baum * parse it as a list 511e0b6287cSTomasz Jozwiak */ 512424dd6c8STomasz Jozwiak if (parse_range(arg, &test_data->level_lst.min, 513424dd6c8STomasz Jozwiak &test_data->level_lst.max, 514424dd6c8STomasz Jozwiak &test_data->level_lst.inc) < 0) { 515424dd6c8STomasz Jozwiak ret = parse_list(arg, test_data->level_lst.list, 516424dd6c8STomasz Jozwiak &test_data->level_lst.min, 517424dd6c8STomasz Jozwiak &test_data->level_lst.max); 518e0b6287cSTomasz Jozwiak if (ret < 0) { 519e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 520e0b6287cSTomasz Jozwiak "Failed to parse compression level/s\n"); 521e0b6287cSTomasz Jozwiak return -1; 522e0b6287cSTomasz Jozwiak } 523424dd6c8STomasz Jozwiak test_data->level_lst.count = ret; 524e0b6287cSTomasz Jozwiak 525424dd6c8STomasz Jozwiak if (test_data->level_lst.max > RTE_COMP_LEVEL_MAX) { 526e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Level cannot be higher than %u\n", 527e0b6287cSTomasz Jozwiak RTE_COMP_LEVEL_MAX); 528e0b6287cSTomasz Jozwiak return -1; 529e0b6287cSTomasz Jozwiak } 530e0b6287cSTomasz Jozwiak } 531e0b6287cSTomasz Jozwiak 532e0b6287cSTomasz Jozwiak return 0; 533e0b6287cSTomasz Jozwiak } 534e0b6287cSTomasz Jozwiak 535c02e33b0SAdam Dybkowski static int 536c02e33b0SAdam Dybkowski parse_external_mbufs(struct comp_test_data *test_data, 537c02e33b0SAdam Dybkowski const char *arg __rte_unused) 538c02e33b0SAdam Dybkowski { 539c02e33b0SAdam Dybkowski test_data->use_external_mbufs = 1; 540c02e33b0SAdam Dybkowski return 0; 541c02e33b0SAdam Dybkowski } 542c02e33b0SAdam Dybkowski 5432695db95SArtur Trybula static int 5442695db95SArtur Trybula parse_cyclecount_delay_us(struct comp_test_data *test_data, 5452695db95SArtur Trybula const char *arg) 5462695db95SArtur Trybula { 5472695db95SArtur Trybula int ret = parse_uint32_t(&(test_data->cyclecount_delay), arg); 5482695db95SArtur Trybula 5492695db95SArtur Trybula if (ret) { 5502695db95SArtur Trybula RTE_LOG(ERR, USER1, "Failed to parse cyclecount delay\n"); 5512695db95SArtur Trybula return -1; 5522695db95SArtur Trybula } 5532695db95SArtur Trybula return 0; 5542695db95SArtur Trybula } 5552695db95SArtur Trybula 556e0b6287cSTomasz Jozwiak typedef int (*option_parser_t)(struct comp_test_data *test_data, 557e0b6287cSTomasz Jozwiak const char *arg); 558e0b6287cSTomasz Jozwiak 559e0b6287cSTomasz Jozwiak struct long_opt_parser { 560e0b6287cSTomasz Jozwiak const char *lgopt_name; 561e0b6287cSTomasz Jozwiak option_parser_t parser_fn; 562e0b6287cSTomasz Jozwiak }; 563e0b6287cSTomasz Jozwiak 564e0b6287cSTomasz Jozwiak static struct option lgopts[] = { 5651a9b0f35STomasz Jozwiak { CPERF_PTEST_TYPE, required_argument, 0, 0 }, 566e0b6287cSTomasz Jozwiak { CPERF_DRIVER_NAME, required_argument, 0, 0 }, 567e0b6287cSTomasz Jozwiak { CPERF_TEST_FILE, required_argument, 0, 0 }, 568e0b6287cSTomasz Jozwiak { CPERF_SEG_SIZE, required_argument, 0, 0 }, 569e0b6287cSTomasz Jozwiak { CPERF_BURST_SIZE, required_argument, 0, 0 }, 570e0b6287cSTomasz Jozwiak { CPERF_EXTENDED_SIZE, required_argument, 0, 0 }, 571e0b6287cSTomasz Jozwiak { CPERF_POOL_SIZE, required_argument, 0, 0 }, 572e0b6287cSTomasz Jozwiak { CPERF_MAX_SGL_SEGS, required_argument, 0, 0}, 573e0b6287cSTomasz Jozwiak { CPERF_NUM_ITER, required_argument, 0, 0 }, 574e0b6287cSTomasz Jozwiak { CPERF_OPTYPE, required_argument, 0, 0 }, 575e0b6287cSTomasz Jozwiak { CPERF_HUFFMAN_ENC, required_argument, 0, 0 }, 576e0b6287cSTomasz Jozwiak { CPERF_LEVEL, required_argument, 0, 0 }, 577e0b6287cSTomasz Jozwiak { CPERF_WINDOW_SIZE, required_argument, 0, 0 }, 578c02e33b0SAdam Dybkowski { CPERF_EXTERNAL_MBUFS, 0, 0, 0 }, 5792695db95SArtur Trybula { CPERF_CYCLECOUNT_DELAY_US, required_argument, 0, 0 }, 580e0b6287cSTomasz Jozwiak { NULL, 0, 0, 0 } 581e0b6287cSTomasz Jozwiak }; 582c02e33b0SAdam Dybkowski 583e0b6287cSTomasz Jozwiak static int 584e0b6287cSTomasz Jozwiak comp_perf_opts_parse_long(int opt_idx, struct comp_test_data *test_data) 585e0b6287cSTomasz Jozwiak { 586e0b6287cSTomasz Jozwiak struct long_opt_parser parsermap[] = { 5871a9b0f35STomasz Jozwiak { CPERF_PTEST_TYPE, parse_cperf_test_type }, 588e0b6287cSTomasz Jozwiak { CPERF_DRIVER_NAME, parse_driver_name }, 589e0b6287cSTomasz Jozwiak { CPERF_TEST_FILE, parse_test_file }, 590e0b6287cSTomasz Jozwiak { CPERF_SEG_SIZE, parse_seg_sz }, 591e0b6287cSTomasz Jozwiak { CPERF_BURST_SIZE, parse_burst_sz }, 592e0b6287cSTomasz Jozwiak { CPERF_EXTENDED_SIZE, parse_extended_input_sz }, 593e0b6287cSTomasz Jozwiak { CPERF_POOL_SIZE, parse_pool_sz }, 594e0b6287cSTomasz Jozwiak { CPERF_MAX_SGL_SEGS, parse_max_num_sgl_segs }, 595e0b6287cSTomasz Jozwiak { CPERF_NUM_ITER, parse_num_iter }, 596e0b6287cSTomasz Jozwiak { CPERF_OPTYPE, parse_op_type }, 597e0b6287cSTomasz Jozwiak { CPERF_HUFFMAN_ENC, parse_huffman_enc }, 598e0b6287cSTomasz Jozwiak { CPERF_LEVEL, parse_level }, 599e0b6287cSTomasz Jozwiak { CPERF_WINDOW_SIZE, parse_window_sz }, 600c02e33b0SAdam Dybkowski { CPERF_EXTERNAL_MBUFS, parse_external_mbufs }, 6012695db95SArtur Trybula { CPERF_CYCLECOUNT_DELAY_US, parse_cyclecount_delay_us }, 602e0b6287cSTomasz Jozwiak }; 603e0b6287cSTomasz Jozwiak unsigned int i; 604e0b6287cSTomasz Jozwiak 605e0b6287cSTomasz Jozwiak for (i = 0; i < RTE_DIM(parsermap); i++) { 606e0b6287cSTomasz Jozwiak if (strncmp(lgopts[opt_idx].name, parsermap[i].lgopt_name, 607e0b6287cSTomasz Jozwiak strlen(lgopts[opt_idx].name)) == 0) 608e0b6287cSTomasz Jozwiak return parsermap[i].parser_fn(test_data, optarg); 609e0b6287cSTomasz Jozwiak } 610e0b6287cSTomasz Jozwiak 611e0b6287cSTomasz Jozwiak return -EINVAL; 612e0b6287cSTomasz Jozwiak } 613e0b6287cSTomasz Jozwiak 614e0b6287cSTomasz Jozwiak int 615e0b6287cSTomasz Jozwiak comp_perf_options_parse(struct comp_test_data *test_data, int argc, char **argv) 616e0b6287cSTomasz Jozwiak { 617e0b6287cSTomasz Jozwiak int opt, retval, opt_idx; 618e0b6287cSTomasz Jozwiak 619e0b6287cSTomasz Jozwiak while ((opt = getopt_long(argc, argv, "h", lgopts, &opt_idx)) != EOF) { 620e0b6287cSTomasz Jozwiak switch (opt) { 621e0b6287cSTomasz Jozwiak case 'h': 622e0b6287cSTomasz Jozwiak usage(argv[0]); 623487cfc24SThomas Monjalon exit(EXIT_SUCCESS); 624e0b6287cSTomasz Jozwiak break; 625e0b6287cSTomasz Jozwiak /* long options */ 626e0b6287cSTomasz Jozwiak case 0: 627e0b6287cSTomasz Jozwiak retval = comp_perf_opts_parse_long(opt_idx, test_data); 628e0b6287cSTomasz Jozwiak if (retval != 0) 629e0b6287cSTomasz Jozwiak return retval; 630e0b6287cSTomasz Jozwiak 631e0b6287cSTomasz Jozwiak break; 632e0b6287cSTomasz Jozwiak 633e0b6287cSTomasz Jozwiak default: 634e0b6287cSTomasz Jozwiak usage(argv[0]); 635e0b6287cSTomasz Jozwiak return -EINVAL; 636e0b6287cSTomasz Jozwiak } 637e0b6287cSTomasz Jozwiak } 638e0b6287cSTomasz Jozwiak 639e0b6287cSTomasz Jozwiak return 0; 640e0b6287cSTomasz Jozwiak } 641e0b6287cSTomasz Jozwiak 642e0b6287cSTomasz Jozwiak void 643e0b6287cSTomasz Jozwiak comp_perf_options_default(struct comp_test_data *test_data) 644e0b6287cSTomasz Jozwiak { 645e0b6287cSTomasz Jozwiak test_data->seg_sz = 2048; 646e0b6287cSTomasz Jozwiak test_data->burst_sz = 32; 647e0b6287cSTomasz Jozwiak test_data->pool_sz = 8192; 648b68a8242STomasz Jozwiak test_data->max_sgl_segs = 16; 649e0b6287cSTomasz Jozwiak test_data->num_iter = 10000; 650fedfef43STomasz Jozwiak test_data->huffman_enc = RTE_COMP_HUFFMAN_DYNAMIC; 651e0b6287cSTomasz Jozwiak test_data->test_op = COMPRESS_DECOMPRESS; 652e0b6287cSTomasz Jozwiak test_data->window_sz = -1; 6538c7a3131SArtur Trybula test_data->level_lst.min = RTE_COMP_LEVEL_MIN; 6548c7a3131SArtur Trybula test_data->level_lst.max = RTE_COMP_LEVEL_MAX; 655424dd6c8STomasz Jozwiak test_data->level_lst.inc = 1; 6562695db95SArtur Trybula test_data->test = CPERF_TEST_TYPE_THROUGHPUT; 657c02e33b0SAdam Dybkowski test_data->use_external_mbufs = 0; 6582695db95SArtur Trybula test_data->cyclecount_delay = 500; 659e0b6287cSTomasz Jozwiak } 660e0b6287cSTomasz Jozwiak 661e0b6287cSTomasz Jozwiak int 662e0b6287cSTomasz Jozwiak comp_perf_options_check(struct comp_test_data *test_data) 663e0b6287cSTomasz Jozwiak { 664e0b6287cSTomasz Jozwiak if (test_data->driver_name[0] == '\0') { 665e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Driver name has to be set\n"); 666e0b6287cSTomasz Jozwiak return -1; 667e0b6287cSTomasz Jozwiak } 668e0b6287cSTomasz Jozwiak 669e0b6287cSTomasz Jozwiak if (test_data->input_file[0] == '\0') { 670e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Input file name has to be set\n"); 671e0b6287cSTomasz Jozwiak return -1; 672e0b6287cSTomasz Jozwiak } 673e0b6287cSTomasz Jozwiak 674e0b6287cSTomasz Jozwiak return 0; 675e0b6287cSTomasz Jozwiak } 676