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") 31e0b6287cSTomasz Jozwiak 32e0b6287cSTomasz Jozwiak struct name_id_map { 33e0b6287cSTomasz Jozwiak const char *name; 34e0b6287cSTomasz Jozwiak uint32_t id; 35e0b6287cSTomasz Jozwiak }; 36e0b6287cSTomasz Jozwiak 37e0b6287cSTomasz Jozwiak static void 38e0b6287cSTomasz Jozwiak usage(char *progname) 39e0b6287cSTomasz Jozwiak { 40e0b6287cSTomasz Jozwiak printf("%s [EAL options] --\n" 411a9b0f35STomasz Jozwiak " --ptest benchmark / verify :" 42e0b6287cSTomasz Jozwiak " --driver-name NAME: compress driver to use\n" 43e0b6287cSTomasz Jozwiak " --input-file NAME: file to compress and decompress\n" 44e0b6287cSTomasz Jozwiak " --extended-input-sz N: extend file data up to this size (default: no extension)\n" 45e0b6287cSTomasz Jozwiak " --seg-sz N: size of segment to store the data (default: 2048)\n" 46e0b6287cSTomasz Jozwiak " --burst-sz N: compress operation burst size\n" 47e0b6287cSTomasz Jozwiak " --pool-sz N: mempool size for compress operations/mbufs\n" 48e0b6287cSTomasz Jozwiak " (default: 8192)\n" 49e0b6287cSTomasz Jozwiak " --max-num-sgl-segs N: maximum number of segments for each mbuf\n" 50e0b6287cSTomasz Jozwiak " (default: 16)\n" 51e0b6287cSTomasz Jozwiak " --num-iter N: number of times the file will be\n" 52e0b6287cSTomasz Jozwiak " compressed/decompressed (default: 10000)\n" 53e0b6287cSTomasz Jozwiak " --operation [comp/decomp/comp_and_decomp]: perform test on\n" 54e0b6287cSTomasz Jozwiak " compression, decompression or both operations\n" 55fedfef43STomasz Jozwiak " --huffman-enc [fixed/dynamic/default]: Huffman encoding\n" 56fedfef43STomasz Jozwiak " (default: dynamic)\n" 57e0b6287cSTomasz Jozwiak " --compress-level N: compression level, which could be a single value, list or range\n" 58e0b6287cSTomasz Jozwiak " (default: range between 1 and 9)\n" 59e0b6287cSTomasz Jozwiak " --window-sz N: base two log value of compression window size\n" 60e0b6287cSTomasz Jozwiak " (e.g.: 15 => 32k, default: max supported by PMD)\n" 61e0b6287cSTomasz Jozwiak " -h: prints this help\n", 62e0b6287cSTomasz Jozwiak progname); 63e0b6287cSTomasz Jozwiak } 64e0b6287cSTomasz Jozwiak 65e0b6287cSTomasz Jozwiak static int 66e0b6287cSTomasz Jozwiak get_str_key_id_mapping(struct name_id_map *map, unsigned int map_len, 67e0b6287cSTomasz Jozwiak const char *str_key) 68e0b6287cSTomasz Jozwiak { 69e0b6287cSTomasz Jozwiak unsigned int i; 70e0b6287cSTomasz Jozwiak 71e0b6287cSTomasz Jozwiak for (i = 0; i < map_len; i++) { 72e0b6287cSTomasz Jozwiak 73e0b6287cSTomasz Jozwiak if (strcmp(str_key, map[i].name) == 0) 74e0b6287cSTomasz Jozwiak return map[i].id; 75e0b6287cSTomasz Jozwiak } 76e0b6287cSTomasz Jozwiak 77e0b6287cSTomasz Jozwiak return -1; 78e0b6287cSTomasz Jozwiak } 79e0b6287cSTomasz Jozwiak 80e0b6287cSTomasz Jozwiak static int 811a9b0f35STomasz Jozwiak parse_cperf_test_type(struct comp_test_data *test_data, const char *arg) 821a9b0f35STomasz Jozwiak { 831a9b0f35STomasz Jozwiak struct name_id_map cperftest_namemap[] = { 841a9b0f35STomasz Jozwiak { 851a9b0f35STomasz Jozwiak cperf_test_type_strs[CPERF_TEST_TYPE_BENCHMARK], 861a9b0f35STomasz Jozwiak CPERF_TEST_TYPE_BENCHMARK 871a9b0f35STomasz Jozwiak }, 881a9b0f35STomasz Jozwiak { 891a9b0f35STomasz Jozwiak cperf_test_type_strs[CPERF_TEST_TYPE_VERIFY], 901a9b0f35STomasz Jozwiak CPERF_TEST_TYPE_VERIFY 911a9b0f35STomasz Jozwiak } 921a9b0f35STomasz Jozwiak }; 931a9b0f35STomasz Jozwiak 941a9b0f35STomasz Jozwiak int id = get_str_key_id_mapping( 951a9b0f35STomasz Jozwiak (struct name_id_map *)cperftest_namemap, 961a9b0f35STomasz Jozwiak RTE_DIM(cperftest_namemap), arg); 971a9b0f35STomasz Jozwiak if (id < 0) { 981a9b0f35STomasz Jozwiak RTE_LOG(ERR, USER1, "failed to parse test type"); 991a9b0f35STomasz Jozwiak return -1; 1001a9b0f35STomasz Jozwiak } 1011a9b0f35STomasz Jozwiak 102*8c7a3131SArtur Trybula test_data->test = (enum cperf_test_type)id; 1031a9b0f35STomasz Jozwiak 1041a9b0f35STomasz Jozwiak return 0; 1051a9b0f35STomasz Jozwiak } 1061a9b0f35STomasz Jozwiak 1071a9b0f35STomasz Jozwiak static int 108e0b6287cSTomasz Jozwiak parse_uint32_t(uint32_t *value, const char *arg) 109e0b6287cSTomasz Jozwiak { 110e0b6287cSTomasz Jozwiak char *end = NULL; 111e0b6287cSTomasz Jozwiak unsigned long n = strtoul(arg, &end, 10); 112e0b6287cSTomasz Jozwiak 113e0b6287cSTomasz Jozwiak if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0')) 114e0b6287cSTomasz Jozwiak return -1; 115e0b6287cSTomasz Jozwiak 116e0b6287cSTomasz Jozwiak if (n > UINT32_MAX) 117e0b6287cSTomasz Jozwiak return -ERANGE; 118e0b6287cSTomasz Jozwiak 119e0b6287cSTomasz Jozwiak *value = (uint32_t) n; 120e0b6287cSTomasz Jozwiak 121e0b6287cSTomasz Jozwiak return 0; 122e0b6287cSTomasz Jozwiak } 123e0b6287cSTomasz Jozwiak 124e0b6287cSTomasz Jozwiak static int 125e0b6287cSTomasz Jozwiak parse_uint16_t(uint16_t *value, const char *arg) 126e0b6287cSTomasz Jozwiak { 127e0b6287cSTomasz Jozwiak uint32_t val = 0; 128e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&val, arg); 129e0b6287cSTomasz Jozwiak 130e0b6287cSTomasz Jozwiak if (ret < 0) 131e0b6287cSTomasz Jozwiak return ret; 132e0b6287cSTomasz Jozwiak 133e0b6287cSTomasz Jozwiak if (val > UINT16_MAX) 134e0b6287cSTomasz Jozwiak return -ERANGE; 135e0b6287cSTomasz Jozwiak 136e0b6287cSTomasz Jozwiak *value = (uint16_t) val; 137e0b6287cSTomasz Jozwiak 138e0b6287cSTomasz Jozwiak return 0; 139e0b6287cSTomasz Jozwiak } 140e0b6287cSTomasz Jozwiak 141e0b6287cSTomasz Jozwiak static int 142e0b6287cSTomasz Jozwiak parse_range(const char *arg, uint8_t *min, uint8_t *max, uint8_t *inc) 143e0b6287cSTomasz Jozwiak { 144e0b6287cSTomasz Jozwiak char *token; 145e0b6287cSTomasz Jozwiak uint8_t number; 146e0b6287cSTomasz Jozwiak 147e0b6287cSTomasz Jozwiak char *copy_arg = strdup(arg); 148e0b6287cSTomasz Jozwiak 149e0b6287cSTomasz Jozwiak if (copy_arg == NULL) 150e0b6287cSTomasz Jozwiak return -1; 151e0b6287cSTomasz Jozwiak 152e0b6287cSTomasz Jozwiak errno = 0; 153e0b6287cSTomasz Jozwiak token = strtok(copy_arg, ":"); 154e0b6287cSTomasz Jozwiak 155e0b6287cSTomasz Jozwiak /* Parse minimum value */ 156e0b6287cSTomasz Jozwiak if (token != NULL) { 157e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 158e0b6287cSTomasz Jozwiak 159e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 160e0b6287cSTomasz Jozwiak goto err_range; 161e0b6287cSTomasz Jozwiak 162e0b6287cSTomasz Jozwiak *min = number; 163e0b6287cSTomasz Jozwiak } else 164e0b6287cSTomasz Jozwiak goto err_range; 165e0b6287cSTomasz Jozwiak 166e0b6287cSTomasz Jozwiak token = strtok(NULL, ":"); 167e0b6287cSTomasz Jozwiak 168e0b6287cSTomasz Jozwiak /* Parse increment value */ 169e0b6287cSTomasz Jozwiak if (token != NULL) { 170e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 171e0b6287cSTomasz Jozwiak 172e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE || 173e0b6287cSTomasz Jozwiak number == 0) 174e0b6287cSTomasz Jozwiak goto err_range; 175e0b6287cSTomasz Jozwiak 176e0b6287cSTomasz Jozwiak *inc = number; 177e0b6287cSTomasz Jozwiak } else 178e0b6287cSTomasz Jozwiak goto err_range; 179e0b6287cSTomasz Jozwiak 180e0b6287cSTomasz Jozwiak token = strtok(NULL, ":"); 181e0b6287cSTomasz Jozwiak 182e0b6287cSTomasz Jozwiak /* Parse maximum value */ 183e0b6287cSTomasz Jozwiak if (token != NULL) { 184e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 185e0b6287cSTomasz Jozwiak 186e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE || 187e0b6287cSTomasz Jozwiak number < *min) 188e0b6287cSTomasz Jozwiak goto err_range; 189e0b6287cSTomasz Jozwiak 190e0b6287cSTomasz Jozwiak *max = number; 191e0b6287cSTomasz Jozwiak } else 192e0b6287cSTomasz Jozwiak goto err_range; 193e0b6287cSTomasz Jozwiak 194e0b6287cSTomasz Jozwiak if (strtok(NULL, ":") != NULL) 195e0b6287cSTomasz Jozwiak goto err_range; 196e0b6287cSTomasz Jozwiak 197e0b6287cSTomasz Jozwiak free(copy_arg); 198e0b6287cSTomasz Jozwiak return 0; 199e0b6287cSTomasz Jozwiak 200e0b6287cSTomasz Jozwiak err_range: 201e0b6287cSTomasz Jozwiak free(copy_arg); 202e0b6287cSTomasz Jozwiak return -1; 203e0b6287cSTomasz Jozwiak } 204e0b6287cSTomasz Jozwiak 205e0b6287cSTomasz Jozwiak static int 206e0b6287cSTomasz Jozwiak parse_list(const char *arg, uint8_t *list, uint8_t *min, uint8_t *max) 207e0b6287cSTomasz Jozwiak { 208e0b6287cSTomasz Jozwiak char *token; 209e0b6287cSTomasz Jozwiak uint32_t number; 210e0b6287cSTomasz Jozwiak uint8_t count = 0; 211e0b6287cSTomasz Jozwiak uint32_t temp_min; 212e0b6287cSTomasz Jozwiak uint32_t temp_max; 213e0b6287cSTomasz Jozwiak 214e0b6287cSTomasz Jozwiak char *copy_arg = strdup(arg); 215e0b6287cSTomasz Jozwiak 216e0b6287cSTomasz Jozwiak if (copy_arg == NULL) 217e0b6287cSTomasz Jozwiak return -1; 218e0b6287cSTomasz Jozwiak 219e0b6287cSTomasz Jozwiak errno = 0; 220e0b6287cSTomasz Jozwiak token = strtok(copy_arg, ","); 221e0b6287cSTomasz Jozwiak 222e0b6287cSTomasz Jozwiak /* Parse first value */ 223e0b6287cSTomasz Jozwiak if (token != NULL) { 224e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 225e0b6287cSTomasz Jozwiak 226e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 227e0b6287cSTomasz Jozwiak goto err_list; 228e0b6287cSTomasz Jozwiak 229e0b6287cSTomasz Jozwiak list[count++] = number; 230e0b6287cSTomasz Jozwiak temp_min = number; 231e0b6287cSTomasz Jozwiak temp_max = number; 232e0b6287cSTomasz Jozwiak } else 233e0b6287cSTomasz Jozwiak goto err_list; 234e0b6287cSTomasz Jozwiak 235e0b6287cSTomasz Jozwiak token = strtok(NULL, ","); 236e0b6287cSTomasz Jozwiak 237e0b6287cSTomasz Jozwiak while (token != NULL) { 238e0b6287cSTomasz Jozwiak if (count == MAX_LIST) { 239e0b6287cSTomasz Jozwiak RTE_LOG(WARNING, USER1, 240e0b6287cSTomasz Jozwiak "Using only the first %u sizes\n", 241e0b6287cSTomasz Jozwiak MAX_LIST); 242e0b6287cSTomasz Jozwiak break; 243e0b6287cSTomasz Jozwiak } 244e0b6287cSTomasz Jozwiak 245e0b6287cSTomasz Jozwiak number = strtoul(token, NULL, 10); 246e0b6287cSTomasz Jozwiak 247e0b6287cSTomasz Jozwiak if (errno == EINVAL || errno == ERANGE) 248e0b6287cSTomasz Jozwiak goto err_list; 249e0b6287cSTomasz Jozwiak 250e0b6287cSTomasz Jozwiak list[count++] = number; 251e0b6287cSTomasz Jozwiak 252e0b6287cSTomasz Jozwiak if (number < temp_min) 253e0b6287cSTomasz Jozwiak temp_min = number; 254e0b6287cSTomasz Jozwiak if (number > temp_max) 255e0b6287cSTomasz Jozwiak temp_max = number; 256e0b6287cSTomasz Jozwiak 257e0b6287cSTomasz Jozwiak token = strtok(NULL, ","); 258e0b6287cSTomasz Jozwiak } 259e0b6287cSTomasz Jozwiak 260e0b6287cSTomasz Jozwiak if (min) 261e0b6287cSTomasz Jozwiak *min = temp_min; 262e0b6287cSTomasz Jozwiak if (max) 263e0b6287cSTomasz Jozwiak *max = temp_max; 264e0b6287cSTomasz Jozwiak 265e0b6287cSTomasz Jozwiak free(copy_arg); 266e0b6287cSTomasz Jozwiak return count; 267e0b6287cSTomasz Jozwiak 268e0b6287cSTomasz Jozwiak err_list: 269e0b6287cSTomasz Jozwiak free(copy_arg); 270e0b6287cSTomasz Jozwiak return -1; 271e0b6287cSTomasz Jozwiak } 272e0b6287cSTomasz Jozwiak 273e0b6287cSTomasz Jozwiak static int 274e0b6287cSTomasz Jozwiak parse_num_iter(struct comp_test_data *test_data, const char *arg) 275e0b6287cSTomasz Jozwiak { 276e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&test_data->num_iter, arg); 277e0b6287cSTomasz Jozwiak 278e0b6287cSTomasz Jozwiak if (ret) { 279e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse total iteration count\n"); 280e0b6287cSTomasz Jozwiak return -1; 281e0b6287cSTomasz Jozwiak } 282e0b6287cSTomasz Jozwiak 283e0b6287cSTomasz Jozwiak if (test_data->num_iter == 0) { 284e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 285e0b6287cSTomasz Jozwiak "Total number of iterations must be higher than 0\n"); 286e0b6287cSTomasz Jozwiak return -1; 287e0b6287cSTomasz Jozwiak } 288e0b6287cSTomasz Jozwiak 289e0b6287cSTomasz Jozwiak return ret; 290e0b6287cSTomasz Jozwiak } 291e0b6287cSTomasz Jozwiak 292e0b6287cSTomasz Jozwiak static int 293e0b6287cSTomasz Jozwiak parse_pool_sz(struct comp_test_data *test_data, const char *arg) 294e0b6287cSTomasz Jozwiak { 295e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&test_data->pool_sz, arg); 296e0b6287cSTomasz Jozwiak 297e0b6287cSTomasz Jozwiak if (ret) { 298e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse pool size"); 299e0b6287cSTomasz Jozwiak return -1; 300e0b6287cSTomasz Jozwiak } 301e0b6287cSTomasz Jozwiak 302e0b6287cSTomasz Jozwiak if (test_data->pool_sz == 0) { 303e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Pool size must be higher than 0\n"); 304e0b6287cSTomasz Jozwiak return -1; 305e0b6287cSTomasz Jozwiak } 306e0b6287cSTomasz Jozwiak 307e0b6287cSTomasz Jozwiak return ret; 308e0b6287cSTomasz Jozwiak } 309e0b6287cSTomasz Jozwiak 310e0b6287cSTomasz Jozwiak static int 311e0b6287cSTomasz Jozwiak parse_burst_sz(struct comp_test_data *test_data, const char *arg) 312e0b6287cSTomasz Jozwiak { 313e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->burst_sz, arg); 314e0b6287cSTomasz Jozwiak 315e0b6287cSTomasz Jozwiak if (ret) { 316e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse burst size/s\n"); 317e0b6287cSTomasz Jozwiak return -1; 318e0b6287cSTomasz Jozwiak } 319e0b6287cSTomasz Jozwiak 320e0b6287cSTomasz Jozwiak if (test_data->burst_sz == 0) { 321e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Burst size must be higher than 0\n"); 322e0b6287cSTomasz Jozwiak return -1; 323e0b6287cSTomasz Jozwiak } 324e0b6287cSTomasz Jozwiak 325e0b6287cSTomasz Jozwiak return 0; 326e0b6287cSTomasz Jozwiak } 327e0b6287cSTomasz Jozwiak 328e0b6287cSTomasz Jozwiak static int 329e0b6287cSTomasz Jozwiak parse_extended_input_sz(struct comp_test_data *test_data, const char *arg) 330e0b6287cSTomasz Jozwiak { 331e0b6287cSTomasz Jozwiak uint32_t tmp; 332e0b6287cSTomasz Jozwiak int ret = parse_uint32_t(&tmp, arg); 333e0b6287cSTomasz Jozwiak 334e0b6287cSTomasz Jozwiak if (ret) { 335e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse extended input size\n"); 336e0b6287cSTomasz Jozwiak return -1; 337e0b6287cSTomasz Jozwiak } 338e0b6287cSTomasz Jozwiak test_data->input_data_sz = tmp; 339e0b6287cSTomasz Jozwiak 340e0b6287cSTomasz Jozwiak if (tmp == 0) { 341e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 342e0b6287cSTomasz Jozwiak "Extended file size must be higher than 0\n"); 343e0b6287cSTomasz Jozwiak return -1; 344e0b6287cSTomasz Jozwiak } 345e0b6287cSTomasz Jozwiak return 0; 346e0b6287cSTomasz Jozwiak } 347e0b6287cSTomasz Jozwiak 348e0b6287cSTomasz Jozwiak static int 349e0b6287cSTomasz Jozwiak parse_seg_sz(struct comp_test_data *test_data, const char *arg) 350e0b6287cSTomasz Jozwiak { 351e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->seg_sz, arg); 352e0b6287cSTomasz Jozwiak 353e0b6287cSTomasz Jozwiak if (ret) { 354e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse segment size\n"); 355e0b6287cSTomasz Jozwiak return -1; 356e0b6287cSTomasz Jozwiak } 357e0b6287cSTomasz Jozwiak 35827cee417STomasz Jozwiak if (test_data->seg_sz < MIN_COMPRESSED_BUF_SIZE) { 35927cee417STomasz Jozwiak RTE_LOG(ERR, USER1, "Segment size must be higher than %d\n", 36027cee417STomasz Jozwiak MIN_COMPRESSED_BUF_SIZE - 1); 36127cee417STomasz Jozwiak return -1; 36227cee417STomasz Jozwiak } 36327cee417STomasz Jozwiak 36427cee417STomasz Jozwiak if (test_data->seg_sz > MAX_SEG_SIZE) { 36527cee417STomasz Jozwiak RTE_LOG(ERR, USER1, "Segment size must be lower than %d\n", 36627cee417STomasz Jozwiak MAX_SEG_SIZE + 1); 367e0b6287cSTomasz Jozwiak return -1; 368e0b6287cSTomasz Jozwiak } 369e0b6287cSTomasz Jozwiak 370e0b6287cSTomasz Jozwiak return 0; 371e0b6287cSTomasz Jozwiak } 372e0b6287cSTomasz Jozwiak 373e0b6287cSTomasz Jozwiak static int 374e0b6287cSTomasz Jozwiak parse_max_num_sgl_segs(struct comp_test_data *test_data, const char *arg) 375e0b6287cSTomasz Jozwiak { 376e0b6287cSTomasz Jozwiak int ret = parse_uint16_t(&test_data->max_sgl_segs, arg); 377e0b6287cSTomasz Jozwiak 378e0b6287cSTomasz Jozwiak if (ret) { 379e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 380e0b6287cSTomasz Jozwiak "Failed to parse max number of segments per mbuf chain\n"); 381e0b6287cSTomasz Jozwiak return -1; 382e0b6287cSTomasz Jozwiak } 383e0b6287cSTomasz Jozwiak 384e0b6287cSTomasz Jozwiak if (test_data->max_sgl_segs == 0) { 385e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Max number of segments per mbuf chain " 386e0b6287cSTomasz Jozwiak "must be higher than 0\n"); 387e0b6287cSTomasz Jozwiak return -1; 388e0b6287cSTomasz Jozwiak } 389e0b6287cSTomasz Jozwiak 390e0b6287cSTomasz Jozwiak return 0; 391e0b6287cSTomasz Jozwiak } 392e0b6287cSTomasz Jozwiak 393e0b6287cSTomasz Jozwiak static int 394e0b6287cSTomasz Jozwiak parse_window_sz(struct comp_test_data *test_data, const char *arg) 395e0b6287cSTomasz Jozwiak { 3961f04178dSArtur Trybula uint16_t tmp; 3971f04178dSArtur Trybula int ret = parse_uint16_t(&tmp, arg); 398e0b6287cSTomasz Jozwiak 399e0b6287cSTomasz Jozwiak if (ret) { 400e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Failed to parse window size\n"); 401e0b6287cSTomasz Jozwiak return -1; 402e0b6287cSTomasz Jozwiak } 4031f04178dSArtur Trybula test_data->window_sz = (int)tmp; 404e0b6287cSTomasz Jozwiak 405e0b6287cSTomasz Jozwiak return 0; 406e0b6287cSTomasz Jozwiak } 407e0b6287cSTomasz Jozwiak 408e0b6287cSTomasz Jozwiak static int 409e0b6287cSTomasz Jozwiak parse_driver_name(struct comp_test_data *test_data, const char *arg) 410e0b6287cSTomasz Jozwiak { 411e0b6287cSTomasz Jozwiak if (strlen(arg) > (sizeof(test_data->driver_name) - 1)) 412e0b6287cSTomasz Jozwiak return -1; 413e0b6287cSTomasz Jozwiak 4146e37913fSThomas Monjalon strlcpy(test_data->driver_name, arg, 415e0b6287cSTomasz Jozwiak sizeof(test_data->driver_name)); 416e0b6287cSTomasz Jozwiak 417e0b6287cSTomasz Jozwiak return 0; 418e0b6287cSTomasz Jozwiak } 419e0b6287cSTomasz Jozwiak 420e0b6287cSTomasz Jozwiak static int 421e0b6287cSTomasz Jozwiak parse_test_file(struct comp_test_data *test_data, const char *arg) 422e0b6287cSTomasz Jozwiak { 423e0b6287cSTomasz Jozwiak if (strlen(arg) > (sizeof(test_data->input_file) - 1)) 424e0b6287cSTomasz Jozwiak return -1; 425e0b6287cSTomasz Jozwiak 4266e37913fSThomas Monjalon strlcpy(test_data->input_file, arg, sizeof(test_data->input_file)); 427e0b6287cSTomasz Jozwiak 428e0b6287cSTomasz Jozwiak return 0; 429e0b6287cSTomasz Jozwiak } 430e0b6287cSTomasz Jozwiak 431e0b6287cSTomasz Jozwiak static int 432e0b6287cSTomasz Jozwiak parse_op_type(struct comp_test_data *test_data, const char *arg) 433e0b6287cSTomasz Jozwiak { 434e0b6287cSTomasz Jozwiak struct name_id_map optype_namemap[] = { 435e0b6287cSTomasz Jozwiak { 436e0b6287cSTomasz Jozwiak "comp", 437e0b6287cSTomasz Jozwiak COMPRESS_ONLY 438e0b6287cSTomasz Jozwiak }, 439e0b6287cSTomasz Jozwiak { 440e0b6287cSTomasz Jozwiak "decomp", 441e0b6287cSTomasz Jozwiak DECOMPRESS_ONLY 442e0b6287cSTomasz Jozwiak }, 443e0b6287cSTomasz Jozwiak { 444e0b6287cSTomasz Jozwiak "comp_and_decomp", 445e0b6287cSTomasz Jozwiak COMPRESS_DECOMPRESS 446e0b6287cSTomasz Jozwiak } 447e0b6287cSTomasz Jozwiak }; 448e0b6287cSTomasz Jozwiak 449e0b6287cSTomasz Jozwiak int id = get_str_key_id_mapping(optype_namemap, 450e0b6287cSTomasz Jozwiak RTE_DIM(optype_namemap), arg); 451e0b6287cSTomasz Jozwiak if (id < 0) { 452e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Invalid operation type specified\n"); 453e0b6287cSTomasz Jozwiak return -1; 454e0b6287cSTomasz Jozwiak } 455e0b6287cSTomasz Jozwiak 456e0b6287cSTomasz Jozwiak test_data->test_op = (enum comp_operation)id; 457e0b6287cSTomasz Jozwiak 458e0b6287cSTomasz Jozwiak return 0; 459e0b6287cSTomasz Jozwiak } 460e0b6287cSTomasz Jozwiak 461e0b6287cSTomasz Jozwiak static int 462e0b6287cSTomasz Jozwiak parse_huffman_enc(struct comp_test_data *test_data, const char *arg) 463e0b6287cSTomasz Jozwiak { 464e0b6287cSTomasz Jozwiak struct name_id_map huffman_namemap[] = { 465e0b6287cSTomasz Jozwiak { 466e0b6287cSTomasz Jozwiak "default", 467e0b6287cSTomasz Jozwiak RTE_COMP_HUFFMAN_DEFAULT 468e0b6287cSTomasz Jozwiak }, 469e0b6287cSTomasz Jozwiak { 470e0b6287cSTomasz Jozwiak "fixed", 471e0b6287cSTomasz Jozwiak RTE_COMP_HUFFMAN_FIXED 472fedfef43STomasz Jozwiak }, 473fedfef43STomasz Jozwiak { 474fedfef43STomasz Jozwiak "dynamic", 475fedfef43STomasz Jozwiak RTE_COMP_HUFFMAN_DYNAMIC 476e0b6287cSTomasz Jozwiak } 477e0b6287cSTomasz Jozwiak }; 478e0b6287cSTomasz Jozwiak 479e0b6287cSTomasz Jozwiak int id = get_str_key_id_mapping(huffman_namemap, 480e0b6287cSTomasz Jozwiak RTE_DIM(huffman_namemap), arg); 481e0b6287cSTomasz Jozwiak if (id < 0) { 482e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Invalid Huffmane encoding specified\n"); 483e0b6287cSTomasz Jozwiak return -1; 484e0b6287cSTomasz Jozwiak } 485e0b6287cSTomasz Jozwiak 486e0b6287cSTomasz Jozwiak test_data->huffman_enc = (enum rte_comp_huffman)id; 487e0b6287cSTomasz Jozwiak 488e0b6287cSTomasz Jozwiak return 0; 489e0b6287cSTomasz Jozwiak } 490e0b6287cSTomasz Jozwiak 491e0b6287cSTomasz Jozwiak static int 492e0b6287cSTomasz Jozwiak parse_level(struct comp_test_data *test_data, const char *arg) 493e0b6287cSTomasz Jozwiak { 494e0b6287cSTomasz Jozwiak int ret; 495e0b6287cSTomasz Jozwiak 496e0b6287cSTomasz Jozwiak /* 497e0b6287cSTomasz Jozwiak * Try parsing the argument as a range, if it fails, 498e0b6287cSTomasz Jozwiak * arse it as a list 499e0b6287cSTomasz Jozwiak */ 500424dd6c8STomasz Jozwiak if (parse_range(arg, &test_data->level_lst.min, 501424dd6c8STomasz Jozwiak &test_data->level_lst.max, 502424dd6c8STomasz Jozwiak &test_data->level_lst.inc) < 0) { 503424dd6c8STomasz Jozwiak ret = parse_list(arg, test_data->level_lst.list, 504424dd6c8STomasz Jozwiak &test_data->level_lst.min, 505424dd6c8STomasz Jozwiak &test_data->level_lst.max); 506e0b6287cSTomasz Jozwiak if (ret < 0) { 507e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, 508e0b6287cSTomasz Jozwiak "Failed to parse compression level/s\n"); 509e0b6287cSTomasz Jozwiak return -1; 510e0b6287cSTomasz Jozwiak } 511424dd6c8STomasz Jozwiak test_data->level_lst.count = ret; 512e0b6287cSTomasz Jozwiak 513424dd6c8STomasz Jozwiak if (test_data->level_lst.max > RTE_COMP_LEVEL_MAX) { 514e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Level cannot be higher than %u\n", 515e0b6287cSTomasz Jozwiak RTE_COMP_LEVEL_MAX); 516e0b6287cSTomasz Jozwiak return -1; 517e0b6287cSTomasz Jozwiak } 518e0b6287cSTomasz Jozwiak } 519e0b6287cSTomasz Jozwiak 520e0b6287cSTomasz Jozwiak return 0; 521e0b6287cSTomasz Jozwiak } 522e0b6287cSTomasz Jozwiak 523e0b6287cSTomasz Jozwiak typedef int (*option_parser_t)(struct comp_test_data *test_data, 524e0b6287cSTomasz Jozwiak const char *arg); 525e0b6287cSTomasz Jozwiak 526e0b6287cSTomasz Jozwiak struct long_opt_parser { 527e0b6287cSTomasz Jozwiak const char *lgopt_name; 528e0b6287cSTomasz Jozwiak option_parser_t parser_fn; 529e0b6287cSTomasz Jozwiak 530e0b6287cSTomasz Jozwiak }; 531e0b6287cSTomasz Jozwiak 532e0b6287cSTomasz Jozwiak static struct option lgopts[] = { 5331a9b0f35STomasz Jozwiak 5341a9b0f35STomasz Jozwiak { CPERF_PTEST_TYPE, required_argument, 0, 0 }, 535e0b6287cSTomasz Jozwiak { CPERF_DRIVER_NAME, required_argument, 0, 0 }, 536e0b6287cSTomasz Jozwiak { CPERF_TEST_FILE, required_argument, 0, 0 }, 537e0b6287cSTomasz Jozwiak { CPERF_SEG_SIZE, required_argument, 0, 0 }, 538e0b6287cSTomasz Jozwiak { CPERF_BURST_SIZE, required_argument, 0, 0 }, 539e0b6287cSTomasz Jozwiak { CPERF_EXTENDED_SIZE, required_argument, 0, 0 }, 540e0b6287cSTomasz Jozwiak { CPERF_POOL_SIZE, required_argument, 0, 0 }, 541e0b6287cSTomasz Jozwiak { CPERF_MAX_SGL_SEGS, required_argument, 0, 0}, 542e0b6287cSTomasz Jozwiak { CPERF_NUM_ITER, required_argument, 0, 0 }, 543e0b6287cSTomasz Jozwiak { CPERF_OPTYPE, required_argument, 0, 0 }, 544e0b6287cSTomasz Jozwiak { CPERF_HUFFMAN_ENC, required_argument, 0, 0 }, 545e0b6287cSTomasz Jozwiak { CPERF_LEVEL, required_argument, 0, 0 }, 546e0b6287cSTomasz Jozwiak { CPERF_WINDOW_SIZE, required_argument, 0, 0 }, 547e0b6287cSTomasz Jozwiak { NULL, 0, 0, 0 } 548e0b6287cSTomasz Jozwiak }; 549e0b6287cSTomasz Jozwiak static int 550e0b6287cSTomasz Jozwiak comp_perf_opts_parse_long(int opt_idx, struct comp_test_data *test_data) 551e0b6287cSTomasz Jozwiak { 552e0b6287cSTomasz Jozwiak struct long_opt_parser parsermap[] = { 5531a9b0f35STomasz Jozwiak { CPERF_PTEST_TYPE, parse_cperf_test_type }, 554e0b6287cSTomasz Jozwiak { CPERF_DRIVER_NAME, parse_driver_name }, 555e0b6287cSTomasz Jozwiak { CPERF_TEST_FILE, parse_test_file }, 556e0b6287cSTomasz Jozwiak { CPERF_SEG_SIZE, parse_seg_sz }, 557e0b6287cSTomasz Jozwiak { CPERF_BURST_SIZE, parse_burst_sz }, 558e0b6287cSTomasz Jozwiak { CPERF_EXTENDED_SIZE, parse_extended_input_sz }, 559e0b6287cSTomasz Jozwiak { CPERF_POOL_SIZE, parse_pool_sz }, 560e0b6287cSTomasz Jozwiak { CPERF_MAX_SGL_SEGS, parse_max_num_sgl_segs }, 561e0b6287cSTomasz Jozwiak { CPERF_NUM_ITER, parse_num_iter }, 562e0b6287cSTomasz Jozwiak { CPERF_OPTYPE, parse_op_type }, 563e0b6287cSTomasz Jozwiak { CPERF_HUFFMAN_ENC, parse_huffman_enc }, 564e0b6287cSTomasz Jozwiak { CPERF_LEVEL, parse_level }, 565e0b6287cSTomasz Jozwiak { CPERF_WINDOW_SIZE, parse_window_sz }, 566e0b6287cSTomasz Jozwiak }; 567e0b6287cSTomasz Jozwiak unsigned int i; 568e0b6287cSTomasz Jozwiak 569e0b6287cSTomasz Jozwiak for (i = 0; i < RTE_DIM(parsermap); i++) { 570e0b6287cSTomasz Jozwiak if (strncmp(lgopts[opt_idx].name, parsermap[i].lgopt_name, 571e0b6287cSTomasz Jozwiak strlen(lgopts[opt_idx].name)) == 0) 572e0b6287cSTomasz Jozwiak return parsermap[i].parser_fn(test_data, optarg); 573e0b6287cSTomasz Jozwiak } 574e0b6287cSTomasz Jozwiak 575e0b6287cSTomasz Jozwiak return -EINVAL; 576e0b6287cSTomasz Jozwiak } 577e0b6287cSTomasz Jozwiak 578e0b6287cSTomasz Jozwiak int 579e0b6287cSTomasz Jozwiak comp_perf_options_parse(struct comp_test_data *test_data, int argc, char **argv) 580e0b6287cSTomasz Jozwiak { 581e0b6287cSTomasz Jozwiak int opt, retval, opt_idx; 582e0b6287cSTomasz Jozwiak 583e0b6287cSTomasz Jozwiak while ((opt = getopt_long(argc, argv, "h", lgopts, &opt_idx)) != EOF) { 584e0b6287cSTomasz Jozwiak switch (opt) { 585e0b6287cSTomasz Jozwiak case 'h': 586e0b6287cSTomasz Jozwiak usage(argv[0]); 587e0b6287cSTomasz Jozwiak rte_exit(EXIT_SUCCESS, "Displayed help\n"); 588e0b6287cSTomasz Jozwiak break; 589e0b6287cSTomasz Jozwiak /* long options */ 590e0b6287cSTomasz Jozwiak case 0: 591e0b6287cSTomasz Jozwiak retval = comp_perf_opts_parse_long(opt_idx, test_data); 592e0b6287cSTomasz Jozwiak if (retval != 0) 593e0b6287cSTomasz Jozwiak return retval; 594e0b6287cSTomasz Jozwiak 595e0b6287cSTomasz Jozwiak break; 596e0b6287cSTomasz Jozwiak 597e0b6287cSTomasz Jozwiak default: 598e0b6287cSTomasz Jozwiak usage(argv[0]); 599e0b6287cSTomasz Jozwiak return -EINVAL; 600e0b6287cSTomasz Jozwiak } 601e0b6287cSTomasz Jozwiak } 602e0b6287cSTomasz Jozwiak 603e0b6287cSTomasz Jozwiak return 0; 604e0b6287cSTomasz Jozwiak } 605e0b6287cSTomasz Jozwiak 606e0b6287cSTomasz Jozwiak void 607e0b6287cSTomasz Jozwiak comp_perf_options_default(struct comp_test_data *test_data) 608e0b6287cSTomasz Jozwiak { 609e0b6287cSTomasz Jozwiak test_data->seg_sz = 2048; 610e0b6287cSTomasz Jozwiak test_data->burst_sz = 32; 611e0b6287cSTomasz Jozwiak test_data->pool_sz = 8192; 612b68a8242STomasz Jozwiak test_data->max_sgl_segs = 16; 613e0b6287cSTomasz Jozwiak test_data->num_iter = 10000; 614fedfef43STomasz Jozwiak test_data->huffman_enc = RTE_COMP_HUFFMAN_DYNAMIC; 615e0b6287cSTomasz Jozwiak test_data->test_op = COMPRESS_DECOMPRESS; 616e0b6287cSTomasz Jozwiak test_data->window_sz = -1; 617*8c7a3131SArtur Trybula test_data->level_lst.min = RTE_COMP_LEVEL_MIN; 618*8c7a3131SArtur Trybula test_data->level_lst.max = RTE_COMP_LEVEL_MAX; 619424dd6c8STomasz Jozwiak test_data->level_lst.inc = 1; 620424dd6c8STomasz Jozwiak test_data->test = CPERF_TEST_TYPE_BENCHMARK; 621e0b6287cSTomasz Jozwiak } 622e0b6287cSTomasz Jozwiak 623e0b6287cSTomasz Jozwiak int 624e0b6287cSTomasz Jozwiak comp_perf_options_check(struct comp_test_data *test_data) 625e0b6287cSTomasz Jozwiak { 626e0b6287cSTomasz Jozwiak if (test_data->driver_name[0] == '\0') { 627e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Driver name has to be set\n"); 628e0b6287cSTomasz Jozwiak return -1; 629e0b6287cSTomasz Jozwiak } 630e0b6287cSTomasz Jozwiak 631e0b6287cSTomasz Jozwiak if (test_data->input_file[0] == '\0') { 632e0b6287cSTomasz Jozwiak RTE_LOG(ERR, USER1, "Input file name has to be set\n"); 633e0b6287cSTomasz Jozwiak return -1; 634e0b6287cSTomasz Jozwiak } 635e0b6287cSTomasz Jozwiak 636e0b6287cSTomasz Jozwiak return 0; 637e0b6287cSTomasz Jozwiak } 638