xref: /dpdk/app/test-compress-perf/comp_perf_test_common.c (revision 8c7a31317b0ec128d25b30cd56db94c144ceaaa2)
1424dd6c8STomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
2424dd6c8STomasz Jozwiak  * Copyright(c) 2019 Intel Corporation
3424dd6c8STomasz Jozwiak  */
4424dd6c8STomasz Jozwiak 
5424dd6c8STomasz Jozwiak #include <rte_malloc.h>
6424dd6c8STomasz Jozwiak #include <rte_eal.h>
7424dd6c8STomasz Jozwiak #include <rte_log.h>
8424dd6c8STomasz Jozwiak #include <rte_compressdev.h>
9424dd6c8STomasz Jozwiak 
10424dd6c8STomasz Jozwiak #include "comp_perf.h"
11*8c7a3131SArtur Trybula #include "comp_perf_options.h"
12*8c7a3131SArtur Trybula #include "comp_perf_test_benchmark.h"
13424dd6c8STomasz Jozwiak #include "comp_perf_test_common.h"
14*8c7a3131SArtur Trybula #include "comp_perf_test_verify.h"
15*8c7a3131SArtur Trybula 
16424dd6c8STomasz Jozwiak 
17424dd6c8STomasz Jozwiak #define DIV_CEIL(a, b)  ((a) / (b) + ((a) % (b) != 0))
18424dd6c8STomasz Jozwiak 
19424dd6c8STomasz Jozwiak int
20424dd6c8STomasz Jozwiak param_range_check(uint16_t size, const struct rte_param_log2_range *range)
21424dd6c8STomasz Jozwiak {
22424dd6c8STomasz Jozwiak 	unsigned int next_size;
23424dd6c8STomasz Jozwiak 
24424dd6c8STomasz Jozwiak 	/* Check lower/upper bounds */
25424dd6c8STomasz Jozwiak 	if (size < range->min)
26424dd6c8STomasz Jozwiak 		return -1;
27424dd6c8STomasz Jozwiak 
28424dd6c8STomasz Jozwiak 	if (size > range->max)
29424dd6c8STomasz Jozwiak 		return -1;
30424dd6c8STomasz Jozwiak 
31424dd6c8STomasz Jozwiak 	/* If range is actually only one value, size is correct */
32424dd6c8STomasz Jozwiak 	if (range->increment == 0)
33424dd6c8STomasz Jozwiak 		return 0;
34424dd6c8STomasz Jozwiak 
35424dd6c8STomasz Jozwiak 	/* Check if value is one of the supported sizes */
36424dd6c8STomasz Jozwiak 	for (next_size = range->min; next_size <= range->max;
37424dd6c8STomasz Jozwiak 			next_size += range->increment)
38424dd6c8STomasz Jozwiak 		if (size == next_size)
39424dd6c8STomasz Jozwiak 			return 0;
40424dd6c8STomasz Jozwiak 
41424dd6c8STomasz Jozwiak 	return -1;
42424dd6c8STomasz Jozwiak }
43424dd6c8STomasz Jozwiak 
44424dd6c8STomasz Jozwiak static uint32_t
45424dd6c8STomasz Jozwiak find_buf_size(uint32_t input_size)
46424dd6c8STomasz Jozwiak {
47424dd6c8STomasz Jozwiak 	uint32_t i;
48424dd6c8STomasz Jozwiak 
49424dd6c8STomasz Jozwiak 	/* From performance point of view the buffer size should be a
50424dd6c8STomasz Jozwiak 	 * power of 2 but also should be enough to store incompressible data
51424dd6c8STomasz Jozwiak 	 */
52424dd6c8STomasz Jozwiak 
53*8c7a3131SArtur Trybula 	/* We're looking for nearest power of 2 buffer size, which is greater
54424dd6c8STomasz Jozwiak 	 * than input_size
55424dd6c8STomasz Jozwiak 	 */
56424dd6c8STomasz Jozwiak 	uint32_t size =
57424dd6c8STomasz Jozwiak 		!input_size ? MIN_COMPRESSED_BUF_SIZE : (input_size << 1);
58424dd6c8STomasz Jozwiak 
59424dd6c8STomasz Jozwiak 	for (i = UINT16_MAX + 1; !(i & size); i >>= 1)
60424dd6c8STomasz Jozwiak 		;
61424dd6c8STomasz Jozwiak 
62424dd6c8STomasz Jozwiak 	return i > ((UINT16_MAX + 1) >> 1)
63424dd6c8STomasz Jozwiak 			? (uint32_t)((float)input_size * EXPANSE_RATIO)
64424dd6c8STomasz Jozwiak 			: i;
65424dd6c8STomasz Jozwiak }
66424dd6c8STomasz Jozwiak 
67424dd6c8STomasz Jozwiak void
68424dd6c8STomasz Jozwiak comp_perf_free_memory(struct cperf_mem_resources *mem)
69424dd6c8STomasz Jozwiak {
70424dd6c8STomasz Jozwiak 	uint32_t i;
71424dd6c8STomasz Jozwiak 
72424dd6c8STomasz Jozwiak 	for (i = 0; i < mem->total_bufs; i++) {
73424dd6c8STomasz Jozwiak 		rte_pktmbuf_free(mem->comp_bufs[i]);
74424dd6c8STomasz Jozwiak 		rte_pktmbuf_free(mem->decomp_bufs[i]);
75424dd6c8STomasz Jozwiak 	}
76424dd6c8STomasz Jozwiak 
77424dd6c8STomasz Jozwiak 	rte_free(mem->decomp_bufs);
78424dd6c8STomasz Jozwiak 	rte_free(mem->comp_bufs);
79424dd6c8STomasz Jozwiak 	rte_free(mem->decompressed_data);
80424dd6c8STomasz Jozwiak 	rte_free(mem->compressed_data);
81424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->op_pool);
82424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->decomp_buf_pool);
83424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->comp_buf_pool);
84424dd6c8STomasz Jozwiak }
85424dd6c8STomasz Jozwiak 
86424dd6c8STomasz Jozwiak int
87424dd6c8STomasz Jozwiak comp_perf_allocate_memory(struct comp_test_data *test_data,
88424dd6c8STomasz Jozwiak 			  struct cperf_mem_resources *mem)
89424dd6c8STomasz Jozwiak {
90424dd6c8STomasz Jozwiak 	test_data->out_seg_sz = find_buf_size(test_data->seg_sz);
91424dd6c8STomasz Jozwiak 	/* Number of segments for input and output
92424dd6c8STomasz Jozwiak 	 * (compression and decompression)
93424dd6c8STomasz Jozwiak 	 */
94424dd6c8STomasz Jozwiak 	uint32_t total_segs = DIV_CEIL(test_data->input_data_sz,
95424dd6c8STomasz Jozwiak 			test_data->seg_sz);
96424dd6c8STomasz Jozwiak 	char pool_name[32] = "";
97424dd6c8STomasz Jozwiak 
98424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "comp_buf_pool_%u_qp_%u",
99424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
100424dd6c8STomasz Jozwiak 	mem->comp_buf_pool = rte_pktmbuf_pool_create(pool_name,
101424dd6c8STomasz Jozwiak 				total_segs,
102424dd6c8STomasz Jozwiak 				0, 0,
103424dd6c8STomasz Jozwiak 				test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM,
104424dd6c8STomasz Jozwiak 				rte_socket_id());
105424dd6c8STomasz Jozwiak 	if (mem->comp_buf_pool == NULL) {
106424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n");
107424dd6c8STomasz Jozwiak 		return -1;
108424dd6c8STomasz Jozwiak 	}
109424dd6c8STomasz Jozwiak 
110424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "decomp_buf_pool_%u_qp_%u",
111424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
112424dd6c8STomasz Jozwiak 	mem->decomp_buf_pool = rte_pktmbuf_pool_create(pool_name,
113424dd6c8STomasz Jozwiak 				total_segs,
114424dd6c8STomasz Jozwiak 				0, 0, test_data->seg_sz + RTE_PKTMBUF_HEADROOM,
115424dd6c8STomasz Jozwiak 				rte_socket_id());
116424dd6c8STomasz Jozwiak 	if (mem->decomp_buf_pool == NULL) {
117424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n");
118424dd6c8STomasz Jozwiak 		return -1;
119424dd6c8STomasz Jozwiak 	}
120424dd6c8STomasz Jozwiak 
121424dd6c8STomasz Jozwiak 	mem->total_bufs = DIV_CEIL(total_segs, test_data->max_sgl_segs);
122424dd6c8STomasz Jozwiak 
123424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "op_pool_%u_qp_%u",
124424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
125424dd6c8STomasz Jozwiak 	mem->op_pool = rte_comp_op_pool_create(pool_name,
126424dd6c8STomasz Jozwiak 				  mem->total_bufs,
127424dd6c8STomasz Jozwiak 				  0, 0, rte_socket_id());
128424dd6c8STomasz Jozwiak 	if (mem->op_pool == NULL) {
129424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Comp op mempool could not be created\n");
130424dd6c8STomasz Jozwiak 		return -1;
131424dd6c8STomasz Jozwiak 	}
132424dd6c8STomasz Jozwiak 
133424dd6c8STomasz Jozwiak 	/*
134424dd6c8STomasz Jozwiak 	 * Compressed data might be a bit larger than input data,
135424dd6c8STomasz Jozwiak 	 * if data cannot be compressed
136424dd6c8STomasz Jozwiak 	 */
137424dd6c8STomasz Jozwiak 	mem->compressed_data = rte_zmalloc_socket(NULL,
138424dd6c8STomasz Jozwiak 				test_data->input_data_sz * EXPANSE_RATIO
139424dd6c8STomasz Jozwiak 						+ MIN_COMPRESSED_BUF_SIZE, 0,
140424dd6c8STomasz Jozwiak 				rte_socket_id());
141424dd6c8STomasz Jozwiak 	if (mem->compressed_data == NULL) {
142424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
143424dd6c8STomasz Jozwiak 				"file could not be allocated\n");
144424dd6c8STomasz Jozwiak 		return -1;
145424dd6c8STomasz Jozwiak 	}
146424dd6c8STomasz Jozwiak 
147424dd6c8STomasz Jozwiak 	mem->decompressed_data = rte_zmalloc_socket(NULL,
148424dd6c8STomasz Jozwiak 				test_data->input_data_sz, 0,
149424dd6c8STomasz Jozwiak 				rte_socket_id());
150424dd6c8STomasz Jozwiak 	if (mem->decompressed_data == NULL) {
151424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
152424dd6c8STomasz Jozwiak 				"file could not be allocated\n");
153424dd6c8STomasz Jozwiak 		return -1;
154424dd6c8STomasz Jozwiak 	}
155424dd6c8STomasz Jozwiak 
156424dd6c8STomasz Jozwiak 	mem->comp_bufs = rte_zmalloc_socket(NULL,
157424dd6c8STomasz Jozwiak 			mem->total_bufs * sizeof(struct rte_mbuf *),
158424dd6c8STomasz Jozwiak 			0, rte_socket_id());
159424dd6c8STomasz Jozwiak 	if (mem->comp_bufs == NULL) {
160424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the compression mbufs"
161424dd6c8STomasz Jozwiak 				" could not be allocated\n");
162424dd6c8STomasz Jozwiak 		return -1;
163424dd6c8STomasz Jozwiak 	}
164424dd6c8STomasz Jozwiak 
165424dd6c8STomasz Jozwiak 	mem->decomp_bufs = rte_zmalloc_socket(NULL,
166424dd6c8STomasz Jozwiak 			mem->total_bufs * sizeof(struct rte_mbuf *),
167424dd6c8STomasz Jozwiak 			0, rte_socket_id());
168424dd6c8STomasz Jozwiak 	if (mem->decomp_bufs == NULL) {
169424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the decompression mbufs"
170424dd6c8STomasz Jozwiak 				" could not be allocated\n");
171424dd6c8STomasz Jozwiak 		return -1;
172424dd6c8STomasz Jozwiak 	}
173424dd6c8STomasz Jozwiak 	return 0;
174424dd6c8STomasz Jozwiak }
175424dd6c8STomasz Jozwiak 
176424dd6c8STomasz Jozwiak int
177424dd6c8STomasz Jozwiak prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
178424dd6c8STomasz Jozwiak {
179424dd6c8STomasz Jozwiak 	uint32_t remaining_data = test_data->input_data_sz;
180424dd6c8STomasz Jozwiak 	uint8_t *input_data_ptr = test_data->input_data;
181424dd6c8STomasz Jozwiak 	size_t data_sz;
182424dd6c8STomasz Jozwiak 	uint8_t *data_addr;
183424dd6c8STomasz Jozwiak 	uint32_t i, j;
184424dd6c8STomasz Jozwiak 
185424dd6c8STomasz Jozwiak 	for (i = 0; i < mem->total_bufs; i++) {
186424dd6c8STomasz Jozwiak 		/* Allocate data in input mbuf and copy data from input file */
187424dd6c8STomasz Jozwiak 		mem->decomp_bufs[i] =
188424dd6c8STomasz Jozwiak 			rte_pktmbuf_alloc(mem->decomp_buf_pool);
189424dd6c8STomasz Jozwiak 		if (mem->decomp_bufs[i] == NULL) {
190424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not allocate mbuf\n");
191424dd6c8STomasz Jozwiak 			return -1;
192424dd6c8STomasz Jozwiak 		}
193424dd6c8STomasz Jozwiak 
194424dd6c8STomasz Jozwiak 		data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
195424dd6c8STomasz Jozwiak 		data_addr = (uint8_t *) rte_pktmbuf_append(
196424dd6c8STomasz Jozwiak 					mem->decomp_bufs[i], data_sz);
197424dd6c8STomasz Jozwiak 		if (data_addr == NULL) {
198424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not append data\n");
199424dd6c8STomasz Jozwiak 			return -1;
200424dd6c8STomasz Jozwiak 		}
201424dd6c8STomasz Jozwiak 		rte_memcpy(data_addr, input_data_ptr, data_sz);
202424dd6c8STomasz Jozwiak 
203424dd6c8STomasz Jozwiak 		input_data_ptr += data_sz;
204424dd6c8STomasz Jozwiak 		remaining_data -= data_sz;
205424dd6c8STomasz Jozwiak 
206424dd6c8STomasz Jozwiak 		/* Already one segment in the mbuf */
207424dd6c8STomasz Jozwiak 		uint16_t segs_per_mbuf = 1;
208424dd6c8STomasz Jozwiak 
209424dd6c8STomasz Jozwiak 		/* Chain mbufs if needed for input mbufs */
210424dd6c8STomasz Jozwiak 		while (segs_per_mbuf < test_data->max_sgl_segs
211424dd6c8STomasz Jozwiak 				&& remaining_data > 0) {
212424dd6c8STomasz Jozwiak 			struct rte_mbuf *next_seg =
213424dd6c8STomasz Jozwiak 				rte_pktmbuf_alloc(mem->decomp_buf_pool);
214424dd6c8STomasz Jozwiak 
215424dd6c8STomasz Jozwiak 			if (next_seg == NULL) {
216424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1,
217424dd6c8STomasz Jozwiak 					"Could not allocate mbuf\n");
218424dd6c8STomasz Jozwiak 				return -1;
219424dd6c8STomasz Jozwiak 			}
220424dd6c8STomasz Jozwiak 
221424dd6c8STomasz Jozwiak 			data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
222424dd6c8STomasz Jozwiak 			data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
223424dd6c8STomasz Jozwiak 				data_sz);
224424dd6c8STomasz Jozwiak 
225424dd6c8STomasz Jozwiak 			if (data_addr == NULL) {
226424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not append data\n");
227424dd6c8STomasz Jozwiak 				return -1;
228424dd6c8STomasz Jozwiak 			}
229424dd6c8STomasz Jozwiak 
230424dd6c8STomasz Jozwiak 			rte_memcpy(data_addr, input_data_ptr, data_sz);
231424dd6c8STomasz Jozwiak 			input_data_ptr += data_sz;
232424dd6c8STomasz Jozwiak 			remaining_data -= data_sz;
233424dd6c8STomasz Jozwiak 
234424dd6c8STomasz Jozwiak 			if (rte_pktmbuf_chain(mem->decomp_bufs[i],
235424dd6c8STomasz Jozwiak 					next_seg) < 0) {
236424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not chain mbufs\n");
237424dd6c8STomasz Jozwiak 				return -1;
238424dd6c8STomasz Jozwiak 			}
239424dd6c8STomasz Jozwiak 			segs_per_mbuf++;
240424dd6c8STomasz Jozwiak 		}
241424dd6c8STomasz Jozwiak 
242424dd6c8STomasz Jozwiak 		/* Allocate data in output mbuf */
243424dd6c8STomasz Jozwiak 		mem->comp_bufs[i] =
244424dd6c8STomasz Jozwiak 			rte_pktmbuf_alloc(mem->comp_buf_pool);
245424dd6c8STomasz Jozwiak 		if (mem->comp_bufs[i] == NULL) {
246424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not allocate mbuf\n");
247424dd6c8STomasz Jozwiak 			return -1;
248424dd6c8STomasz Jozwiak 		}
249424dd6c8STomasz Jozwiak 		data_addr = (uint8_t *) rte_pktmbuf_append(
250424dd6c8STomasz Jozwiak 					mem->comp_bufs[i],
251424dd6c8STomasz Jozwiak 					test_data->out_seg_sz);
252424dd6c8STomasz Jozwiak 		if (data_addr == NULL) {
253424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not append data\n");
254424dd6c8STomasz Jozwiak 			return -1;
255424dd6c8STomasz Jozwiak 		}
256424dd6c8STomasz Jozwiak 
257424dd6c8STomasz Jozwiak 		/* Chain mbufs if needed for output mbufs */
258424dd6c8STomasz Jozwiak 		for (j = 1; j < segs_per_mbuf; j++) {
259424dd6c8STomasz Jozwiak 			struct rte_mbuf *next_seg =
260424dd6c8STomasz Jozwiak 				rte_pktmbuf_alloc(mem->comp_buf_pool);
261424dd6c8STomasz Jozwiak 
262424dd6c8STomasz Jozwiak 			if (next_seg == NULL) {
263424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1,
264424dd6c8STomasz Jozwiak 					"Could not allocate mbuf\n");
265424dd6c8STomasz Jozwiak 				return -1;
266424dd6c8STomasz Jozwiak 			}
267424dd6c8STomasz Jozwiak 
268424dd6c8STomasz Jozwiak 			data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
269424dd6c8STomasz Jozwiak 				test_data->out_seg_sz);
270424dd6c8STomasz Jozwiak 
271424dd6c8STomasz Jozwiak 			if (data_addr == NULL) {
272424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not append data\n");
273424dd6c8STomasz Jozwiak 				return -1;
274424dd6c8STomasz Jozwiak 			}
275424dd6c8STomasz Jozwiak 
276424dd6c8STomasz Jozwiak 			if (rte_pktmbuf_chain(mem->comp_bufs[i],
277424dd6c8STomasz Jozwiak 					next_seg) < 0) {
278424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not chain mbufs\n");
279424dd6c8STomasz Jozwiak 				return -1;
280424dd6c8STomasz Jozwiak 			}
281424dd6c8STomasz Jozwiak 		}
282424dd6c8STomasz Jozwiak 	}
283424dd6c8STomasz Jozwiak 
284424dd6c8STomasz Jozwiak 	return 0;
285424dd6c8STomasz Jozwiak }
286