xref: /dpdk/app/test-compress-perf/comp_perf_test_common.c (revision c02e33b03075bde50bfb835e1094c94297d988b6)
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"
118c7a3131SArtur Trybula #include "comp_perf_options.h"
128c7a3131SArtur Trybula #include "comp_perf_test_benchmark.h"
13424dd6c8STomasz Jozwiak #include "comp_perf_test_common.h"
148c7a3131SArtur Trybula #include "comp_perf_test_verify.h"
158c7a3131SArtur Trybula 
16424dd6c8STomasz Jozwiak 
17424dd6c8STomasz Jozwiak #define DIV_CEIL(a, b)  ((a) / (b) + ((a) % (b) != 0))
18424dd6c8STomasz Jozwiak 
196f1e5d80SArtur Trybula struct cperf_buffer_info {
206f1e5d80SArtur Trybula 	uint16_t total_segments;
216f1e5d80SArtur Trybula 	uint16_t segment_sz;
226f1e5d80SArtur Trybula 	uint16_t last_segment_sz;
236f1e5d80SArtur Trybula 	uint32_t total_buffs;	      /*number of buffers = number of ops*/
246f1e5d80SArtur Trybula 	uint16_t segments_per_buff;
256f1e5d80SArtur Trybula 	uint16_t segments_per_last_buff;
266f1e5d80SArtur Trybula 	size_t input_data_sz;
276f1e5d80SArtur Trybula };
286f1e5d80SArtur Trybula 
296f1e5d80SArtur Trybula static struct cperf_buffer_info buffer_info;
306f1e5d80SArtur Trybula 
31424dd6c8STomasz Jozwiak int
32424dd6c8STomasz Jozwiak param_range_check(uint16_t size, const struct rte_param_log2_range *range)
33424dd6c8STomasz Jozwiak {
34424dd6c8STomasz Jozwiak 	unsigned int next_size;
35424dd6c8STomasz Jozwiak 
36424dd6c8STomasz Jozwiak 	/* Check lower/upper bounds */
37424dd6c8STomasz Jozwiak 	if (size < range->min)
38424dd6c8STomasz Jozwiak 		return -1;
39424dd6c8STomasz Jozwiak 
40424dd6c8STomasz Jozwiak 	if (size > range->max)
41424dd6c8STomasz Jozwiak 		return -1;
42424dd6c8STomasz Jozwiak 
43424dd6c8STomasz Jozwiak 	/* If range is actually only one value, size is correct */
44424dd6c8STomasz Jozwiak 	if (range->increment == 0)
45424dd6c8STomasz Jozwiak 		return 0;
46424dd6c8STomasz Jozwiak 
47424dd6c8STomasz Jozwiak 	/* Check if value is one of the supported sizes */
48424dd6c8STomasz Jozwiak 	for (next_size = range->min; next_size <= range->max;
49424dd6c8STomasz Jozwiak 			next_size += range->increment)
50424dd6c8STomasz Jozwiak 		if (size == next_size)
51424dd6c8STomasz Jozwiak 			return 0;
52424dd6c8STomasz Jozwiak 
53424dd6c8STomasz Jozwiak 	return -1;
54424dd6c8STomasz Jozwiak }
55424dd6c8STomasz Jozwiak 
56424dd6c8STomasz Jozwiak static uint32_t
57424dd6c8STomasz Jozwiak find_buf_size(uint32_t input_size)
58424dd6c8STomasz Jozwiak {
59424dd6c8STomasz Jozwiak 	uint32_t i;
60424dd6c8STomasz Jozwiak 
61424dd6c8STomasz Jozwiak 	/* From performance point of view the buffer size should be a
62424dd6c8STomasz Jozwiak 	 * power of 2 but also should be enough to store incompressible data
63424dd6c8STomasz Jozwiak 	 */
64424dd6c8STomasz Jozwiak 
658c7a3131SArtur Trybula 	/* We're looking for nearest power of 2 buffer size, which is greater
66424dd6c8STomasz Jozwiak 	 * than input_size
67424dd6c8STomasz Jozwiak 	 */
68424dd6c8STomasz Jozwiak 	uint32_t size =
69424dd6c8STomasz Jozwiak 		!input_size ? MIN_COMPRESSED_BUF_SIZE : (input_size << 1);
70424dd6c8STomasz Jozwiak 
71424dd6c8STomasz Jozwiak 	for (i = UINT16_MAX + 1; !(i & size); i >>= 1)
72424dd6c8STomasz Jozwiak 		;
73424dd6c8STomasz Jozwiak 
74424dd6c8STomasz Jozwiak 	return i > ((UINT16_MAX + 1) >> 1)
75424dd6c8STomasz Jozwiak 			? (uint32_t)((float)input_size * EXPANSE_RATIO)
76424dd6c8STomasz Jozwiak 			: i;
77424dd6c8STomasz Jozwiak }
78424dd6c8STomasz Jozwiak 
79424dd6c8STomasz Jozwiak void
80*c02e33b0SAdam Dybkowski comp_perf_free_memory(struct comp_test_data *test_data,
81*c02e33b0SAdam Dybkowski 		      struct cperf_mem_resources *mem)
82424dd6c8STomasz Jozwiak {
83424dd6c8STomasz Jozwiak 	uint32_t i;
84424dd6c8STomasz Jozwiak 
85c591df32SAdam Dybkowski 	if (mem->decomp_bufs != NULL)
86c591df32SAdam Dybkowski 		for (i = 0; i < mem->total_bufs; i++)
87424dd6c8STomasz Jozwiak 			rte_pktmbuf_free(mem->decomp_bufs[i]);
88c591df32SAdam Dybkowski 
89c591df32SAdam Dybkowski 	if (mem->comp_bufs != NULL)
90c591df32SAdam Dybkowski 		for (i = 0; i < mem->total_bufs; i++)
91c591df32SAdam Dybkowski 			rte_pktmbuf_free(mem->comp_bufs[i]);
92424dd6c8STomasz Jozwiak 
93424dd6c8STomasz Jozwiak 	rte_free(mem->decomp_bufs);
94424dd6c8STomasz Jozwiak 	rte_free(mem->comp_bufs);
95424dd6c8STomasz Jozwiak 	rte_free(mem->decompressed_data);
96424dd6c8STomasz Jozwiak 	rte_free(mem->compressed_data);
97424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->op_pool);
98424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->decomp_buf_pool);
99424dd6c8STomasz Jozwiak 	rte_mempool_free(mem->comp_buf_pool);
100*c02e33b0SAdam Dybkowski 
101*c02e33b0SAdam Dybkowski 	/* external mbuf support */
102*c02e33b0SAdam Dybkowski 	if (mem->decomp_memzones != NULL) {
103*c02e33b0SAdam Dybkowski 		for (i = 0; i < test_data->total_segs; i++)
104*c02e33b0SAdam Dybkowski 			rte_memzone_free(mem->decomp_memzones[i]);
105*c02e33b0SAdam Dybkowski 		rte_free(mem->decomp_memzones);
106*c02e33b0SAdam Dybkowski 	}
107*c02e33b0SAdam Dybkowski 	if (mem->comp_memzones != NULL) {
108*c02e33b0SAdam Dybkowski 		for (i = 0; i < test_data->total_segs; i++)
109*c02e33b0SAdam Dybkowski 			rte_memzone_free(mem->comp_memzones[i]);
110*c02e33b0SAdam Dybkowski 		rte_free(mem->comp_memzones);
111*c02e33b0SAdam Dybkowski 	}
112*c02e33b0SAdam Dybkowski 	rte_free(mem->decomp_buf_infos);
113*c02e33b0SAdam Dybkowski 	rte_free(mem->comp_buf_infos);
114*c02e33b0SAdam Dybkowski }
115*c02e33b0SAdam Dybkowski 
116*c02e33b0SAdam Dybkowski static void
117*c02e33b0SAdam Dybkowski comp_perf_extbuf_free_cb(void *addr __rte_unused, void *opaque __rte_unused)
118*c02e33b0SAdam Dybkowski {
119*c02e33b0SAdam Dybkowski }
120*c02e33b0SAdam Dybkowski 
121*c02e33b0SAdam Dybkowski static const struct rte_memzone *
122*c02e33b0SAdam Dybkowski comp_perf_make_memzone(const char *name, struct cperf_mem_resources *mem,
123*c02e33b0SAdam Dybkowski 		       unsigned int number, size_t size)
124*c02e33b0SAdam Dybkowski {
125*c02e33b0SAdam Dybkowski 	unsigned int socket_id = rte_socket_id();
126*c02e33b0SAdam Dybkowski 	char mz_name[RTE_MEMZONE_NAMESIZE];
127*c02e33b0SAdam Dybkowski 	const struct rte_memzone *memzone;
128*c02e33b0SAdam Dybkowski 
129*c02e33b0SAdam Dybkowski 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "%s_s%u_d%u_q%u_%d", name,
130*c02e33b0SAdam Dybkowski 		 socket_id, mem->dev_id, mem->qp_id, number);
131*c02e33b0SAdam Dybkowski 	memzone = rte_memzone_lookup(mz_name);
132*c02e33b0SAdam Dybkowski 	if (memzone != NULL && memzone->len != size) {
133*c02e33b0SAdam Dybkowski 		rte_memzone_free(memzone);
134*c02e33b0SAdam Dybkowski 		memzone = NULL;
135*c02e33b0SAdam Dybkowski 	}
136*c02e33b0SAdam Dybkowski 	if (memzone == NULL) {
137*c02e33b0SAdam Dybkowski 		memzone = rte_memzone_reserve_aligned(mz_name, size, socket_id,
138*c02e33b0SAdam Dybkowski 				RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE);
139*c02e33b0SAdam Dybkowski 		if (memzone == NULL)
140*c02e33b0SAdam Dybkowski 			RTE_LOG(ERR, USER1, "Can't allocate memory zone %s\n",
141*c02e33b0SAdam Dybkowski 				mz_name);
142*c02e33b0SAdam Dybkowski 	}
143*c02e33b0SAdam Dybkowski 	return memzone;
144*c02e33b0SAdam Dybkowski }
145*c02e33b0SAdam Dybkowski 
146*c02e33b0SAdam Dybkowski static int
147*c02e33b0SAdam Dybkowski comp_perf_allocate_external_mbufs(struct comp_test_data *test_data,
148*c02e33b0SAdam Dybkowski 				  struct cperf_mem_resources *mem)
149*c02e33b0SAdam Dybkowski {
150*c02e33b0SAdam Dybkowski 	uint32_t i;
151*c02e33b0SAdam Dybkowski 
152*c02e33b0SAdam Dybkowski 	mem->comp_memzones = rte_zmalloc_socket(NULL,
153*c02e33b0SAdam Dybkowski 		test_data->total_segs * sizeof(struct rte_memzone *),
154*c02e33b0SAdam Dybkowski 		0, rte_socket_id());
155*c02e33b0SAdam Dybkowski 
156*c02e33b0SAdam Dybkowski 	if (mem->comp_memzones == NULL) {
157*c02e33b0SAdam Dybkowski 		RTE_LOG(ERR, USER1,
158*c02e33b0SAdam Dybkowski 			"Memory to hold the compression memzones could not be allocated\n");
159*c02e33b0SAdam Dybkowski 		return -1;
160*c02e33b0SAdam Dybkowski 	}
161*c02e33b0SAdam Dybkowski 
162*c02e33b0SAdam Dybkowski 	mem->decomp_memzones = rte_zmalloc_socket(NULL,
163*c02e33b0SAdam Dybkowski 		test_data->total_segs * sizeof(struct rte_memzone *),
164*c02e33b0SAdam Dybkowski 		0, rte_socket_id());
165*c02e33b0SAdam Dybkowski 
166*c02e33b0SAdam Dybkowski 	if (mem->decomp_memzones == NULL) {
167*c02e33b0SAdam Dybkowski 		RTE_LOG(ERR, USER1,
168*c02e33b0SAdam Dybkowski 			"Memory to hold the decompression memzones could not be allocated\n");
169*c02e33b0SAdam Dybkowski 		return -1;
170*c02e33b0SAdam Dybkowski 	}
171*c02e33b0SAdam Dybkowski 
172*c02e33b0SAdam Dybkowski 	mem->comp_buf_infos = rte_zmalloc_socket(NULL,
173*c02e33b0SAdam Dybkowski 		test_data->total_segs * sizeof(struct rte_mbuf_ext_shared_info),
174*c02e33b0SAdam Dybkowski 		0, rte_socket_id());
175*c02e33b0SAdam Dybkowski 
176*c02e33b0SAdam Dybkowski 	if (mem->comp_buf_infos == NULL) {
177*c02e33b0SAdam Dybkowski 		RTE_LOG(ERR, USER1,
178*c02e33b0SAdam Dybkowski 			"Memory to hold the compression buf infos could not be allocated\n");
179*c02e33b0SAdam Dybkowski 		return -1;
180*c02e33b0SAdam Dybkowski 	}
181*c02e33b0SAdam Dybkowski 
182*c02e33b0SAdam Dybkowski 	mem->decomp_buf_infos = rte_zmalloc_socket(NULL,
183*c02e33b0SAdam Dybkowski 		test_data->total_segs * sizeof(struct rte_mbuf_ext_shared_info),
184*c02e33b0SAdam Dybkowski 		0, rte_socket_id());
185*c02e33b0SAdam Dybkowski 
186*c02e33b0SAdam Dybkowski 	if (mem->decomp_buf_infos == NULL) {
187*c02e33b0SAdam Dybkowski 		RTE_LOG(ERR, USER1,
188*c02e33b0SAdam Dybkowski 			"Memory to hold the decompression buf infos could not be allocated\n");
189*c02e33b0SAdam Dybkowski 		return -1;
190*c02e33b0SAdam Dybkowski 	}
191*c02e33b0SAdam Dybkowski 
192*c02e33b0SAdam Dybkowski 	for (i = 0; i < test_data->total_segs; i++) {
193*c02e33b0SAdam Dybkowski 		mem->comp_memzones[i] = comp_perf_make_memzone("comp", mem,
194*c02e33b0SAdam Dybkowski 				i, test_data->out_seg_sz);
195*c02e33b0SAdam Dybkowski 		if (mem->comp_memzones[i] == NULL) {
196*c02e33b0SAdam Dybkowski 			RTE_LOG(ERR, USER1,
197*c02e33b0SAdam Dybkowski 				"Memory to hold the compression memzone could not be allocated\n");
198*c02e33b0SAdam Dybkowski 			return -1;
199*c02e33b0SAdam Dybkowski 		}
200*c02e33b0SAdam Dybkowski 
201*c02e33b0SAdam Dybkowski 		mem->decomp_memzones[i] = comp_perf_make_memzone("decomp", mem,
202*c02e33b0SAdam Dybkowski 				i, test_data->seg_sz);
203*c02e33b0SAdam Dybkowski 		if (mem->decomp_memzones[i] == NULL) {
204*c02e33b0SAdam Dybkowski 			RTE_LOG(ERR, USER1,
205*c02e33b0SAdam Dybkowski 				"Memory to hold the decompression memzone could not be allocated\n");
206*c02e33b0SAdam Dybkowski 			return -1;
207*c02e33b0SAdam Dybkowski 		}
208*c02e33b0SAdam Dybkowski 
209*c02e33b0SAdam Dybkowski 		mem->comp_buf_infos[i].free_cb =
210*c02e33b0SAdam Dybkowski 				comp_perf_extbuf_free_cb;
211*c02e33b0SAdam Dybkowski 		mem->comp_buf_infos[i].fcb_opaque = NULL;
212*c02e33b0SAdam Dybkowski 		rte_mbuf_ext_refcnt_set(&mem->comp_buf_infos[i], 1);
213*c02e33b0SAdam Dybkowski 
214*c02e33b0SAdam Dybkowski 		mem->decomp_buf_infos[i].free_cb =
215*c02e33b0SAdam Dybkowski 				comp_perf_extbuf_free_cb;
216*c02e33b0SAdam Dybkowski 		mem->decomp_buf_infos[i].fcb_opaque = NULL;
217*c02e33b0SAdam Dybkowski 		rte_mbuf_ext_refcnt_set(&mem->decomp_buf_infos[i], 1);
218*c02e33b0SAdam Dybkowski 	}
219*c02e33b0SAdam Dybkowski 
220*c02e33b0SAdam Dybkowski 	return 0;
221424dd6c8STomasz Jozwiak }
222424dd6c8STomasz Jozwiak 
223424dd6c8STomasz Jozwiak int
224424dd6c8STomasz Jozwiak comp_perf_allocate_memory(struct comp_test_data *test_data,
225424dd6c8STomasz Jozwiak 			  struct cperf_mem_resources *mem)
226424dd6c8STomasz Jozwiak {
227*c02e33b0SAdam Dybkowski 	uint16_t comp_mbuf_size;
228*c02e33b0SAdam Dybkowski 	uint16_t decomp_mbuf_size;
229*c02e33b0SAdam Dybkowski 
230424dd6c8STomasz Jozwiak 	test_data->out_seg_sz = find_buf_size(test_data->seg_sz);
231*c02e33b0SAdam Dybkowski 
232424dd6c8STomasz Jozwiak 	/* Number of segments for input and output
233424dd6c8STomasz Jozwiak 	 * (compression and decompression)
234424dd6c8STomasz Jozwiak 	 */
235*c02e33b0SAdam Dybkowski 	test_data->total_segs = DIV_CEIL(test_data->input_data_sz,
236424dd6c8STomasz Jozwiak 			test_data->seg_sz);
237*c02e33b0SAdam Dybkowski 
238*c02e33b0SAdam Dybkowski 	if (test_data->use_external_mbufs != 0) {
239*c02e33b0SAdam Dybkowski 		if (comp_perf_allocate_external_mbufs(test_data, mem) < 0)
240*c02e33b0SAdam Dybkowski 			return -1;
241*c02e33b0SAdam Dybkowski 		comp_mbuf_size = 0;
242*c02e33b0SAdam Dybkowski 		decomp_mbuf_size = 0;
243*c02e33b0SAdam Dybkowski 	} else {
244*c02e33b0SAdam Dybkowski 		comp_mbuf_size = test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM;
245*c02e33b0SAdam Dybkowski 		decomp_mbuf_size = test_data->seg_sz + RTE_PKTMBUF_HEADROOM;
246*c02e33b0SAdam Dybkowski 	}
247*c02e33b0SAdam Dybkowski 
248424dd6c8STomasz Jozwiak 	char pool_name[32] = "";
249424dd6c8STomasz Jozwiak 
250424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "comp_buf_pool_%u_qp_%u",
251424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
252424dd6c8STomasz Jozwiak 	mem->comp_buf_pool = rte_pktmbuf_pool_create(pool_name,
253*c02e33b0SAdam Dybkowski 				test_data->total_segs,
254424dd6c8STomasz Jozwiak 				0, 0,
255*c02e33b0SAdam Dybkowski 				comp_mbuf_size,
256424dd6c8STomasz Jozwiak 				rte_socket_id());
257424dd6c8STomasz Jozwiak 	if (mem->comp_buf_pool == NULL) {
258424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n");
259424dd6c8STomasz Jozwiak 		return -1;
260424dd6c8STomasz Jozwiak 	}
261424dd6c8STomasz Jozwiak 
262424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "decomp_buf_pool_%u_qp_%u",
263424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
264424dd6c8STomasz Jozwiak 	mem->decomp_buf_pool = rte_pktmbuf_pool_create(pool_name,
265*c02e33b0SAdam Dybkowski 				test_data->total_segs,
266*c02e33b0SAdam Dybkowski 				0, 0,
267*c02e33b0SAdam Dybkowski 				decomp_mbuf_size,
268424dd6c8STomasz Jozwiak 				rte_socket_id());
269424dd6c8STomasz Jozwiak 	if (mem->decomp_buf_pool == NULL) {
270424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n");
271424dd6c8STomasz Jozwiak 		return -1;
272424dd6c8STomasz Jozwiak 	}
273424dd6c8STomasz Jozwiak 
274*c02e33b0SAdam Dybkowski 	mem->total_bufs = DIV_CEIL(test_data->total_segs,
275*c02e33b0SAdam Dybkowski 				   test_data->max_sgl_segs);
276424dd6c8STomasz Jozwiak 
277424dd6c8STomasz Jozwiak 	snprintf(pool_name, sizeof(pool_name), "op_pool_%u_qp_%u",
278424dd6c8STomasz Jozwiak 			mem->dev_id, mem->qp_id);
279424dd6c8STomasz Jozwiak 	mem->op_pool = rte_comp_op_pool_create(pool_name,
280424dd6c8STomasz Jozwiak 				  mem->total_bufs,
281424dd6c8STomasz Jozwiak 				  0, 0, rte_socket_id());
282424dd6c8STomasz Jozwiak 	if (mem->op_pool == NULL) {
283424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Comp op mempool could not be created\n");
284424dd6c8STomasz Jozwiak 		return -1;
285424dd6c8STomasz Jozwiak 	}
286424dd6c8STomasz Jozwiak 
287424dd6c8STomasz Jozwiak 	/*
288424dd6c8STomasz Jozwiak 	 * Compressed data might be a bit larger than input data,
289424dd6c8STomasz Jozwiak 	 * if data cannot be compressed
290424dd6c8STomasz Jozwiak 	 */
291424dd6c8STomasz Jozwiak 	mem->compressed_data = rte_zmalloc_socket(NULL,
292971d89f5SAdam Dybkowski 				RTE_MAX(
293*c02e33b0SAdam Dybkowski 				    (size_t) test_data->out_seg_sz *
294*c02e33b0SAdam Dybkowski 							  test_data->total_segs,
295971d89f5SAdam Dybkowski 				    (size_t) MIN_COMPRESSED_BUF_SIZE),
296971d89f5SAdam Dybkowski 				0,
297424dd6c8STomasz Jozwiak 				rte_socket_id());
298424dd6c8STomasz Jozwiak 	if (mem->compressed_data == NULL) {
299424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
300424dd6c8STomasz Jozwiak 				"file could not be allocated\n");
301424dd6c8STomasz Jozwiak 		return -1;
302424dd6c8STomasz Jozwiak 	}
303424dd6c8STomasz Jozwiak 
304424dd6c8STomasz Jozwiak 	mem->decompressed_data = rte_zmalloc_socket(NULL,
305424dd6c8STomasz Jozwiak 				test_data->input_data_sz, 0,
306424dd6c8STomasz Jozwiak 				rte_socket_id());
307424dd6c8STomasz Jozwiak 	if (mem->decompressed_data == NULL) {
308424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the data from the input "
309424dd6c8STomasz Jozwiak 				"file could not be allocated\n");
310424dd6c8STomasz Jozwiak 		return -1;
311424dd6c8STomasz Jozwiak 	}
312424dd6c8STomasz Jozwiak 
313424dd6c8STomasz Jozwiak 	mem->comp_bufs = rte_zmalloc_socket(NULL,
314424dd6c8STomasz Jozwiak 			mem->total_bufs * sizeof(struct rte_mbuf *),
315424dd6c8STomasz Jozwiak 			0, rte_socket_id());
316424dd6c8STomasz Jozwiak 	if (mem->comp_bufs == NULL) {
317424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the compression mbufs"
318424dd6c8STomasz Jozwiak 				" could not be allocated\n");
319424dd6c8STomasz Jozwiak 		return -1;
320424dd6c8STomasz Jozwiak 	}
321424dd6c8STomasz Jozwiak 
322424dd6c8STomasz Jozwiak 	mem->decomp_bufs = rte_zmalloc_socket(NULL,
323424dd6c8STomasz Jozwiak 			mem->total_bufs * sizeof(struct rte_mbuf *),
324424dd6c8STomasz Jozwiak 			0, rte_socket_id());
325424dd6c8STomasz Jozwiak 	if (mem->decomp_bufs == NULL) {
326424dd6c8STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Memory to hold the decompression mbufs"
327424dd6c8STomasz Jozwiak 				" could not be allocated\n");
328424dd6c8STomasz Jozwiak 		return -1;
329424dd6c8STomasz Jozwiak 	}
3306f1e5d80SArtur Trybula 
331*c02e33b0SAdam Dybkowski 	buffer_info.total_segments = test_data->total_segs;
3326f1e5d80SArtur Trybula 	buffer_info.segment_sz = test_data->seg_sz;
3336f1e5d80SArtur Trybula 	buffer_info.total_buffs = mem->total_bufs;
3346f1e5d80SArtur Trybula 	buffer_info.segments_per_buff = test_data->max_sgl_segs;
3356f1e5d80SArtur Trybula 	buffer_info.input_data_sz = test_data->input_data_sz;
3366f1e5d80SArtur Trybula 
337424dd6c8STomasz Jozwiak 	return 0;
338424dd6c8STomasz Jozwiak }
339424dd6c8STomasz Jozwiak 
340424dd6c8STomasz Jozwiak int
341424dd6c8STomasz Jozwiak prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem)
342424dd6c8STomasz Jozwiak {
343424dd6c8STomasz Jozwiak 	uint32_t remaining_data = test_data->input_data_sz;
344424dd6c8STomasz Jozwiak 	uint8_t *input_data_ptr = test_data->input_data;
3456f1e5d80SArtur Trybula 	size_t data_sz = 0;
346424dd6c8STomasz Jozwiak 	uint8_t *data_addr;
347424dd6c8STomasz Jozwiak 	uint32_t i, j;
3486f1e5d80SArtur Trybula 	uint16_t segs_per_mbuf = 0;
349*c02e33b0SAdam Dybkowski 	uint32_t cmz = 0;
350*c02e33b0SAdam Dybkowski 	uint32_t dmz = 0;
351424dd6c8STomasz Jozwiak 
352424dd6c8STomasz Jozwiak 	for (i = 0; i < mem->total_bufs; i++) {
353424dd6c8STomasz Jozwiak 		/* Allocate data in input mbuf and copy data from input file */
354424dd6c8STomasz Jozwiak 		mem->decomp_bufs[i] =
355424dd6c8STomasz Jozwiak 			rte_pktmbuf_alloc(mem->decomp_buf_pool);
356424dd6c8STomasz Jozwiak 		if (mem->decomp_bufs[i] == NULL) {
357424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not allocate mbuf\n");
358424dd6c8STomasz Jozwiak 			return -1;
359424dd6c8STomasz Jozwiak 		}
360424dd6c8STomasz Jozwiak 
361424dd6c8STomasz Jozwiak 		data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
362*c02e33b0SAdam Dybkowski 
363*c02e33b0SAdam Dybkowski 		if (test_data->use_external_mbufs != 0) {
364*c02e33b0SAdam Dybkowski 			rte_pktmbuf_attach_extbuf(mem->decomp_bufs[i],
365*c02e33b0SAdam Dybkowski 					mem->decomp_memzones[dmz]->addr,
366*c02e33b0SAdam Dybkowski 					mem->decomp_memzones[dmz]->iova,
367*c02e33b0SAdam Dybkowski 					test_data->seg_sz,
368*c02e33b0SAdam Dybkowski 					&mem->decomp_buf_infos[dmz]);
369*c02e33b0SAdam Dybkowski 			dmz++;
370*c02e33b0SAdam Dybkowski 		}
371*c02e33b0SAdam Dybkowski 
372424dd6c8STomasz Jozwiak 		data_addr = (uint8_t *) rte_pktmbuf_append(
373424dd6c8STomasz Jozwiak 					mem->decomp_bufs[i], data_sz);
374424dd6c8STomasz Jozwiak 		if (data_addr == NULL) {
375424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not append data\n");
376424dd6c8STomasz Jozwiak 			return -1;
377424dd6c8STomasz Jozwiak 		}
378424dd6c8STomasz Jozwiak 		rte_memcpy(data_addr, input_data_ptr, data_sz);
379424dd6c8STomasz Jozwiak 
380424dd6c8STomasz Jozwiak 		input_data_ptr += data_sz;
381424dd6c8STomasz Jozwiak 		remaining_data -= data_sz;
382424dd6c8STomasz Jozwiak 
383424dd6c8STomasz Jozwiak 		/* Already one segment in the mbuf */
3846f1e5d80SArtur Trybula 		segs_per_mbuf = 1;
385424dd6c8STomasz Jozwiak 
386424dd6c8STomasz Jozwiak 		/* Chain mbufs if needed for input mbufs */
387424dd6c8STomasz Jozwiak 		while (segs_per_mbuf < test_data->max_sgl_segs
388424dd6c8STomasz Jozwiak 				&& remaining_data > 0) {
389424dd6c8STomasz Jozwiak 			struct rte_mbuf *next_seg =
390424dd6c8STomasz Jozwiak 				rte_pktmbuf_alloc(mem->decomp_buf_pool);
391424dd6c8STomasz Jozwiak 
392424dd6c8STomasz Jozwiak 			if (next_seg == NULL) {
393424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1,
394424dd6c8STomasz Jozwiak 					"Could not allocate mbuf\n");
395424dd6c8STomasz Jozwiak 				return -1;
396424dd6c8STomasz Jozwiak 			}
397424dd6c8STomasz Jozwiak 
398424dd6c8STomasz Jozwiak 			data_sz = RTE_MIN(remaining_data, test_data->seg_sz);
399*c02e33b0SAdam Dybkowski 
400*c02e33b0SAdam Dybkowski 			if (test_data->use_external_mbufs != 0) {
401*c02e33b0SAdam Dybkowski 				rte_pktmbuf_attach_extbuf(
402*c02e33b0SAdam Dybkowski 					next_seg,
403*c02e33b0SAdam Dybkowski 					mem->decomp_memzones[dmz]->addr,
404*c02e33b0SAdam Dybkowski 					mem->decomp_memzones[dmz]->iova,
405*c02e33b0SAdam Dybkowski 					test_data->seg_sz,
406*c02e33b0SAdam Dybkowski 					&mem->decomp_buf_infos[dmz]);
407*c02e33b0SAdam Dybkowski 				dmz++;
408*c02e33b0SAdam Dybkowski 			}
409*c02e33b0SAdam Dybkowski 
410424dd6c8STomasz Jozwiak 			data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
411424dd6c8STomasz Jozwiak 				data_sz);
412424dd6c8STomasz Jozwiak 
413424dd6c8STomasz Jozwiak 			if (data_addr == NULL) {
414424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not append data\n");
415424dd6c8STomasz Jozwiak 				return -1;
416424dd6c8STomasz Jozwiak 			}
417424dd6c8STomasz Jozwiak 
418424dd6c8STomasz Jozwiak 			rte_memcpy(data_addr, input_data_ptr, data_sz);
419424dd6c8STomasz Jozwiak 			input_data_ptr += data_sz;
420424dd6c8STomasz Jozwiak 			remaining_data -= data_sz;
421424dd6c8STomasz Jozwiak 
422424dd6c8STomasz Jozwiak 			if (rte_pktmbuf_chain(mem->decomp_bufs[i],
423424dd6c8STomasz Jozwiak 					next_seg) < 0) {
424424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not chain mbufs\n");
425424dd6c8STomasz Jozwiak 				return -1;
426424dd6c8STomasz Jozwiak 			}
427424dd6c8STomasz Jozwiak 			segs_per_mbuf++;
428424dd6c8STomasz Jozwiak 		}
429424dd6c8STomasz Jozwiak 
430424dd6c8STomasz Jozwiak 		/* Allocate data in output mbuf */
431424dd6c8STomasz Jozwiak 		mem->comp_bufs[i] =
432424dd6c8STomasz Jozwiak 			rte_pktmbuf_alloc(mem->comp_buf_pool);
433424dd6c8STomasz Jozwiak 		if (mem->comp_bufs[i] == NULL) {
434424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not allocate mbuf\n");
435424dd6c8STomasz Jozwiak 			return -1;
436424dd6c8STomasz Jozwiak 		}
437*c02e33b0SAdam Dybkowski 
438*c02e33b0SAdam Dybkowski 		if (test_data->use_external_mbufs != 0) {
439*c02e33b0SAdam Dybkowski 			rte_pktmbuf_attach_extbuf(mem->comp_bufs[i],
440*c02e33b0SAdam Dybkowski 					mem->comp_memzones[cmz]->addr,
441*c02e33b0SAdam Dybkowski 					mem->comp_memzones[cmz]->iova,
442*c02e33b0SAdam Dybkowski 					test_data->out_seg_sz,
443*c02e33b0SAdam Dybkowski 					&mem->comp_buf_infos[cmz]);
444*c02e33b0SAdam Dybkowski 			cmz++;
445*c02e33b0SAdam Dybkowski 		}
446*c02e33b0SAdam Dybkowski 
447424dd6c8STomasz Jozwiak 		data_addr = (uint8_t *) rte_pktmbuf_append(
448424dd6c8STomasz Jozwiak 					mem->comp_bufs[i],
449424dd6c8STomasz Jozwiak 					test_data->out_seg_sz);
450424dd6c8STomasz Jozwiak 		if (data_addr == NULL) {
451424dd6c8STomasz Jozwiak 			RTE_LOG(ERR, USER1, "Could not append data\n");
452424dd6c8STomasz Jozwiak 			return -1;
453424dd6c8STomasz Jozwiak 		}
454424dd6c8STomasz Jozwiak 
455424dd6c8STomasz Jozwiak 		/* Chain mbufs if needed for output mbufs */
456424dd6c8STomasz Jozwiak 		for (j = 1; j < segs_per_mbuf; j++) {
457424dd6c8STomasz Jozwiak 			struct rte_mbuf *next_seg =
458424dd6c8STomasz Jozwiak 				rte_pktmbuf_alloc(mem->comp_buf_pool);
459424dd6c8STomasz Jozwiak 
460424dd6c8STomasz Jozwiak 			if (next_seg == NULL) {
461424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1,
462424dd6c8STomasz Jozwiak 					"Could not allocate mbuf\n");
463424dd6c8STomasz Jozwiak 				return -1;
464424dd6c8STomasz Jozwiak 			}
465424dd6c8STomasz Jozwiak 
466*c02e33b0SAdam Dybkowski 			if (test_data->use_external_mbufs != 0) {
467*c02e33b0SAdam Dybkowski 				rte_pktmbuf_attach_extbuf(
468*c02e33b0SAdam Dybkowski 					next_seg,
469*c02e33b0SAdam Dybkowski 					mem->comp_memzones[cmz]->addr,
470*c02e33b0SAdam Dybkowski 					mem->comp_memzones[cmz]->iova,
471*c02e33b0SAdam Dybkowski 					test_data->out_seg_sz,
472*c02e33b0SAdam Dybkowski 					&mem->comp_buf_infos[cmz]);
473*c02e33b0SAdam Dybkowski 				cmz++;
474*c02e33b0SAdam Dybkowski 			}
475*c02e33b0SAdam Dybkowski 
476424dd6c8STomasz Jozwiak 			data_addr = (uint8_t *)rte_pktmbuf_append(next_seg,
477424dd6c8STomasz Jozwiak 				test_data->out_seg_sz);
478424dd6c8STomasz Jozwiak 			if (data_addr == NULL) {
479424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not append data\n");
480424dd6c8STomasz Jozwiak 				return -1;
481424dd6c8STomasz Jozwiak 			}
482424dd6c8STomasz Jozwiak 
483424dd6c8STomasz Jozwiak 			if (rte_pktmbuf_chain(mem->comp_bufs[i],
484424dd6c8STomasz Jozwiak 					next_seg) < 0) {
485424dd6c8STomasz Jozwiak 				RTE_LOG(ERR, USER1, "Could not chain mbufs\n");
486424dd6c8STomasz Jozwiak 				return -1;
487424dd6c8STomasz Jozwiak 			}
488424dd6c8STomasz Jozwiak 		}
489424dd6c8STomasz Jozwiak 	}
490424dd6c8STomasz Jozwiak 
4916f1e5d80SArtur Trybula 	buffer_info.segments_per_last_buff = segs_per_mbuf;
4926f1e5d80SArtur Trybula 	buffer_info.last_segment_sz = data_sz;
4936f1e5d80SArtur Trybula 
494424dd6c8STomasz Jozwiak 	return 0;
495424dd6c8STomasz Jozwiak }
4966f1e5d80SArtur Trybula 
4976f1e5d80SArtur Trybula void
4986f1e5d80SArtur Trybula print_test_dynamics(void)
4996f1e5d80SArtur Trybula {
5006f1e5d80SArtur Trybula 	uint32_t opt_total_segs = DIV_CEIL(buffer_info.input_data_sz,
5016f1e5d80SArtur Trybula 			MAX_SEG_SIZE);
5026f1e5d80SArtur Trybula 
5036f1e5d80SArtur Trybula 	if (buffer_info.total_buffs > 1) {
5046f1e5d80SArtur Trybula 		printf("\nWarning: for the current input parameters, number"
5056f1e5d80SArtur Trybula 				" of ops is higher than one, which may result"
5066f1e5d80SArtur Trybula 				" in sub-optimal performance.\n");
5076f1e5d80SArtur Trybula 		printf("To improve the performance (for the current"
5086f1e5d80SArtur Trybula 				" input data) following parameters are"
5096f1e5d80SArtur Trybula 				" suggested:\n");
5106f1e5d80SArtur Trybula 		printf("	* Segment size: %d\n", MAX_SEG_SIZE);
5116f1e5d80SArtur Trybula 		printf("	* Number of segments: %u\n", opt_total_segs);
5126f1e5d80SArtur Trybula 	} else if (buffer_info.total_buffs == 1) {
5136f1e5d80SArtur Trybula 		printf("\nInfo: there is only one op with %u segments -"
5146f1e5d80SArtur Trybula 				" the compression ratio is the best.\n",
5156f1e5d80SArtur Trybula 			buffer_info.segments_per_last_buff);
5166f1e5d80SArtur Trybula 		if (buffer_info.segment_sz < MAX_SEG_SIZE)
5176f1e5d80SArtur Trybula 			printf("To reduce compression time, please use"
5186f1e5d80SArtur Trybula 					" bigger segment size: %d.\n",
5196f1e5d80SArtur Trybula 				MAX_SEG_SIZE);
5206f1e5d80SArtur Trybula 		else if (buffer_info.segment_sz == MAX_SEG_SIZE)
5216f1e5d80SArtur Trybula 			printf("Segment size is optimal for the best"
5226f1e5d80SArtur Trybula 					" performance.\n");
5236f1e5d80SArtur Trybula 	} else
5246f1e5d80SArtur Trybula 		printf("Warning: something wrong happened!!\n");
5256f1e5d80SArtur Trybula 
5266f1e5d80SArtur Trybula 	printf("\nFor the current input parameters (segment size = %u,"
5276f1e5d80SArtur Trybula 			" maximum segments per SGL = %u):\n",
5286f1e5d80SArtur Trybula 		buffer_info.segment_sz,
5296f1e5d80SArtur Trybula 		buffer_info.segments_per_buff);
5306f1e5d80SArtur Trybula 	printf("	* Total number of buffers: %d\n",
5316f1e5d80SArtur Trybula 		buffer_info.total_segments);
5326f1e5d80SArtur Trybula 	printf("	* %u buffer(s) %u bytes long, last buffer %u"
5336f1e5d80SArtur Trybula 			" byte(s) long\n",
5346f1e5d80SArtur Trybula 		buffer_info.total_segments - 1,
5356f1e5d80SArtur Trybula 		buffer_info.segment_sz,
5366f1e5d80SArtur Trybula 		buffer_info.last_segment_sz);
5376f1e5d80SArtur Trybula 	printf("	* Number of ops: %u\n", buffer_info.total_buffs);
5386f1e5d80SArtur Trybula 	printf("	* Total memory allocation: %u\n",
5396f1e5d80SArtur Trybula 		(buffer_info.total_segments - 1) * buffer_info.segment_sz
5406f1e5d80SArtur Trybula 		+ buffer_info.last_segment_sz);
5416f1e5d80SArtur Trybula 	if (buffer_info.total_buffs > 1)
5426f1e5d80SArtur Trybula 		printf("	* %u ops: %u segment(s) in each,"
5436f1e5d80SArtur Trybula 				" segment size %u\n",
5446f1e5d80SArtur Trybula 			buffer_info.total_buffs - 1,
5456f1e5d80SArtur Trybula 			buffer_info.segments_per_buff,
5466f1e5d80SArtur Trybula 			buffer_info.segment_sz);
5476f1e5d80SArtur Trybula 	if (buffer_info.segments_per_last_buff > 1) {
5486f1e5d80SArtur Trybula 		printf("	* 1 op %u segments:\n",
5496f1e5d80SArtur Trybula 				buffer_info.segments_per_last_buff);
5506f1e5d80SArtur Trybula 		printf("		o %u segment size %u\n",
5516f1e5d80SArtur Trybula 			buffer_info.segments_per_last_buff - 1,
5526f1e5d80SArtur Trybula 			buffer_info.segment_sz);
5536f1e5d80SArtur Trybula 		printf("		o last segment size %u\n",
5546f1e5d80SArtur Trybula 			buffer_info.last_segment_sz);
5556f1e5d80SArtur Trybula 	} else if (buffer_info.segments_per_last_buff == 1) {
5566f1e5d80SArtur Trybula 		printf("	* 1 op (the last one): %u segment %u"
5576f1e5d80SArtur Trybula 				" byte(s) long\n\n",
5586f1e5d80SArtur Trybula 			buffer_info.segments_per_last_buff,
5596f1e5d80SArtur Trybula 			buffer_info.last_segment_sz);
5606f1e5d80SArtur Trybula 	}
5616f1e5d80SArtur Trybula 	printf("\n");
5626f1e5d80SArtur Trybula }
563