xref: /dpdk/app/test-compress-perf/comp_perf_options_parse.c (revision 1643fc9b077ebb55b13a2c4469b75c251499acdc)
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