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" 122695db95SArtur Trybula #include "comp_perf_test_throughput.h" 132695db95SArtur Trybula #include "comp_perf_test_cyclecount.h" 14424dd6c8STomasz Jozwiak #include "comp_perf_test_common.h" 158c7a3131SArtur Trybula #include "comp_perf_test_verify.h" 168c7a3131SArtur Trybula 17424dd6c8STomasz Jozwiak 18424dd6c8STomasz Jozwiak #define DIV_CEIL(a, b) ((a) / (b) + ((a) % (b) != 0)) 19424dd6c8STomasz Jozwiak 206f1e5d80SArtur Trybula struct cperf_buffer_info { 216f1e5d80SArtur Trybula uint16_t total_segments; 226f1e5d80SArtur Trybula uint16_t segment_sz; 236f1e5d80SArtur Trybula uint16_t last_segment_sz; 246f1e5d80SArtur Trybula uint32_t total_buffs; /*number of buffers = number of ops*/ 256f1e5d80SArtur Trybula uint16_t segments_per_buff; 266f1e5d80SArtur Trybula uint16_t segments_per_last_buff; 276f1e5d80SArtur Trybula size_t input_data_sz; 286f1e5d80SArtur Trybula }; 296f1e5d80SArtur Trybula 306f1e5d80SArtur Trybula static struct cperf_buffer_info buffer_info; 316f1e5d80SArtur Trybula 32424dd6c8STomasz Jozwiak int 33424dd6c8STomasz Jozwiak param_range_check(uint16_t size, const struct rte_param_log2_range *range) 34424dd6c8STomasz Jozwiak { 35424dd6c8STomasz Jozwiak unsigned int next_size; 36424dd6c8STomasz Jozwiak 37424dd6c8STomasz Jozwiak /* Check lower/upper bounds */ 38424dd6c8STomasz Jozwiak if (size < range->min) 39424dd6c8STomasz Jozwiak return -1; 40424dd6c8STomasz Jozwiak 41424dd6c8STomasz Jozwiak if (size > range->max) 42424dd6c8STomasz Jozwiak return -1; 43424dd6c8STomasz Jozwiak 44424dd6c8STomasz Jozwiak /* If range is actually only one value, size is correct */ 45424dd6c8STomasz Jozwiak if (range->increment == 0) 46424dd6c8STomasz Jozwiak return 0; 47424dd6c8STomasz Jozwiak 48424dd6c8STomasz Jozwiak /* Check if value is one of the supported sizes */ 49424dd6c8STomasz Jozwiak for (next_size = range->min; next_size <= range->max; 50424dd6c8STomasz Jozwiak next_size += range->increment) 51424dd6c8STomasz Jozwiak if (size == next_size) 52424dd6c8STomasz Jozwiak return 0; 53424dd6c8STomasz Jozwiak 54424dd6c8STomasz Jozwiak return -1; 55424dd6c8STomasz Jozwiak } 56424dd6c8STomasz Jozwiak 57424dd6c8STomasz Jozwiak static uint32_t 58424dd6c8STomasz Jozwiak find_buf_size(uint32_t input_size) 59424dd6c8STomasz Jozwiak { 60424dd6c8STomasz Jozwiak uint32_t i; 61424dd6c8STomasz Jozwiak 62424dd6c8STomasz Jozwiak /* From performance point of view the buffer size should be a 63424dd6c8STomasz Jozwiak * power of 2 but also should be enough to store incompressible data 64424dd6c8STomasz Jozwiak */ 65424dd6c8STomasz Jozwiak 668c7a3131SArtur Trybula /* We're looking for nearest power of 2 buffer size, which is greater 67424dd6c8STomasz Jozwiak * than input_size 68424dd6c8STomasz Jozwiak */ 69424dd6c8STomasz Jozwiak uint32_t size = 70424dd6c8STomasz Jozwiak !input_size ? MIN_COMPRESSED_BUF_SIZE : (input_size << 1); 71424dd6c8STomasz Jozwiak 72424dd6c8STomasz Jozwiak for (i = UINT16_MAX + 1; !(i & size); i >>= 1) 73424dd6c8STomasz Jozwiak ; 74424dd6c8STomasz Jozwiak 75424dd6c8STomasz Jozwiak return i > ((UINT16_MAX + 1) >> 1) 76424dd6c8STomasz Jozwiak ? (uint32_t)((float)input_size * EXPANSE_RATIO) 77424dd6c8STomasz Jozwiak : i; 78424dd6c8STomasz Jozwiak } 79424dd6c8STomasz Jozwiak 80424dd6c8STomasz Jozwiak void 81c02e33b0SAdam Dybkowski comp_perf_free_memory(struct comp_test_data *test_data, 82c02e33b0SAdam Dybkowski struct cperf_mem_resources *mem) 83424dd6c8STomasz Jozwiak { 84424dd6c8STomasz Jozwiak uint32_t i; 85424dd6c8STomasz Jozwiak 86c591df32SAdam Dybkowski if (mem->decomp_bufs != NULL) 87c591df32SAdam Dybkowski for (i = 0; i < mem->total_bufs; i++) 88424dd6c8STomasz Jozwiak rte_pktmbuf_free(mem->decomp_bufs[i]); 89c591df32SAdam Dybkowski 90c591df32SAdam Dybkowski if (mem->comp_bufs != NULL) 91c591df32SAdam Dybkowski for (i = 0; i < mem->total_bufs; i++) 92c591df32SAdam Dybkowski rte_pktmbuf_free(mem->comp_bufs[i]); 93424dd6c8STomasz Jozwiak 94424dd6c8STomasz Jozwiak rte_free(mem->decomp_bufs); 95424dd6c8STomasz Jozwiak rte_free(mem->comp_bufs); 96424dd6c8STomasz Jozwiak rte_free(mem->decompressed_data); 97424dd6c8STomasz Jozwiak rte_free(mem->compressed_data); 98424dd6c8STomasz Jozwiak rte_mempool_free(mem->op_pool); 99424dd6c8STomasz Jozwiak rte_mempool_free(mem->decomp_buf_pool); 100424dd6c8STomasz Jozwiak rte_mempool_free(mem->comp_buf_pool); 101c02e33b0SAdam Dybkowski 102c02e33b0SAdam Dybkowski /* external mbuf support */ 103c02e33b0SAdam Dybkowski if (mem->decomp_memzones != NULL) { 104c02e33b0SAdam Dybkowski for (i = 0; i < test_data->total_segs; i++) 105c02e33b0SAdam Dybkowski rte_memzone_free(mem->decomp_memzones[i]); 106c02e33b0SAdam Dybkowski rte_free(mem->decomp_memzones); 107c02e33b0SAdam Dybkowski } 108c02e33b0SAdam Dybkowski if (mem->comp_memzones != NULL) { 109c02e33b0SAdam Dybkowski for (i = 0; i < test_data->total_segs; i++) 110c02e33b0SAdam Dybkowski rte_memzone_free(mem->comp_memzones[i]); 111c02e33b0SAdam Dybkowski rte_free(mem->comp_memzones); 112c02e33b0SAdam Dybkowski } 113c02e33b0SAdam Dybkowski rte_free(mem->decomp_buf_infos); 114c02e33b0SAdam Dybkowski rte_free(mem->comp_buf_infos); 115c02e33b0SAdam Dybkowski } 116c02e33b0SAdam Dybkowski 117c02e33b0SAdam Dybkowski static void 118c02e33b0SAdam Dybkowski comp_perf_extbuf_free_cb(void *addr __rte_unused, void *opaque __rte_unused) 119c02e33b0SAdam Dybkowski { 120c02e33b0SAdam Dybkowski } 121c02e33b0SAdam Dybkowski 122c02e33b0SAdam Dybkowski static const struct rte_memzone * 123c02e33b0SAdam Dybkowski comp_perf_make_memzone(const char *name, struct cperf_mem_resources *mem, 124c02e33b0SAdam Dybkowski unsigned int number, size_t size) 125c02e33b0SAdam Dybkowski { 126c02e33b0SAdam Dybkowski unsigned int socket_id = rte_socket_id(); 127c02e33b0SAdam Dybkowski char mz_name[RTE_MEMZONE_NAMESIZE]; 128c02e33b0SAdam Dybkowski const struct rte_memzone *memzone; 129c02e33b0SAdam Dybkowski 130c02e33b0SAdam Dybkowski snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "%s_s%u_d%u_q%u_%d", name, 131c02e33b0SAdam Dybkowski socket_id, mem->dev_id, mem->qp_id, number); 132c02e33b0SAdam Dybkowski memzone = rte_memzone_lookup(mz_name); 133c02e33b0SAdam Dybkowski if (memzone != NULL && memzone->len != size) { 134c02e33b0SAdam Dybkowski rte_memzone_free(memzone); 135c02e33b0SAdam Dybkowski memzone = NULL; 136c02e33b0SAdam Dybkowski } 137c02e33b0SAdam Dybkowski if (memzone == NULL) { 138c02e33b0SAdam Dybkowski memzone = rte_memzone_reserve_aligned(mz_name, size, socket_id, 139c02e33b0SAdam Dybkowski RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE); 140c02e33b0SAdam Dybkowski if (memzone == NULL) 141c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, "Can't allocate memory zone %s\n", 142c02e33b0SAdam Dybkowski mz_name); 143c02e33b0SAdam Dybkowski } 144c02e33b0SAdam Dybkowski return memzone; 145c02e33b0SAdam Dybkowski } 146c02e33b0SAdam Dybkowski 147c02e33b0SAdam Dybkowski static int 148c02e33b0SAdam Dybkowski comp_perf_allocate_external_mbufs(struct comp_test_data *test_data, 149c02e33b0SAdam Dybkowski struct cperf_mem_resources *mem) 150c02e33b0SAdam Dybkowski { 151c02e33b0SAdam Dybkowski uint32_t i; 152c02e33b0SAdam Dybkowski 153c02e33b0SAdam Dybkowski mem->comp_memzones = rte_zmalloc_socket(NULL, 154c02e33b0SAdam Dybkowski test_data->total_segs * sizeof(struct rte_memzone *), 155c02e33b0SAdam Dybkowski 0, rte_socket_id()); 156c02e33b0SAdam Dybkowski 157c02e33b0SAdam Dybkowski if (mem->comp_memzones == NULL) { 158c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 159c02e33b0SAdam Dybkowski "Memory to hold the compression memzones could not be allocated\n"); 160c02e33b0SAdam Dybkowski return -1; 161c02e33b0SAdam Dybkowski } 162c02e33b0SAdam Dybkowski 163c02e33b0SAdam Dybkowski mem->decomp_memzones = rte_zmalloc_socket(NULL, 164c02e33b0SAdam Dybkowski test_data->total_segs * sizeof(struct rte_memzone *), 165c02e33b0SAdam Dybkowski 0, rte_socket_id()); 166c02e33b0SAdam Dybkowski 167c02e33b0SAdam Dybkowski if (mem->decomp_memzones == NULL) { 168c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 169c02e33b0SAdam Dybkowski "Memory to hold the decompression memzones could not be allocated\n"); 170c02e33b0SAdam Dybkowski return -1; 171c02e33b0SAdam Dybkowski } 172c02e33b0SAdam Dybkowski 173c02e33b0SAdam Dybkowski mem->comp_buf_infos = rte_zmalloc_socket(NULL, 174c02e33b0SAdam Dybkowski test_data->total_segs * sizeof(struct rte_mbuf_ext_shared_info), 175c02e33b0SAdam Dybkowski 0, rte_socket_id()); 176c02e33b0SAdam Dybkowski 177c02e33b0SAdam Dybkowski if (mem->comp_buf_infos == NULL) { 178c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 179c02e33b0SAdam Dybkowski "Memory to hold the compression buf infos could not be allocated\n"); 180c02e33b0SAdam Dybkowski return -1; 181c02e33b0SAdam Dybkowski } 182c02e33b0SAdam Dybkowski 183c02e33b0SAdam Dybkowski mem->decomp_buf_infos = rte_zmalloc_socket(NULL, 184c02e33b0SAdam Dybkowski test_data->total_segs * sizeof(struct rte_mbuf_ext_shared_info), 185c02e33b0SAdam Dybkowski 0, rte_socket_id()); 186c02e33b0SAdam Dybkowski 187c02e33b0SAdam Dybkowski if (mem->decomp_buf_infos == NULL) { 188c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 189c02e33b0SAdam Dybkowski "Memory to hold the decompression buf infos could not be allocated\n"); 190c02e33b0SAdam Dybkowski return -1; 191c02e33b0SAdam Dybkowski } 192c02e33b0SAdam Dybkowski 193c02e33b0SAdam Dybkowski for (i = 0; i < test_data->total_segs; i++) { 194c02e33b0SAdam Dybkowski mem->comp_memzones[i] = comp_perf_make_memzone("comp", mem, 195c02e33b0SAdam Dybkowski i, test_data->out_seg_sz); 196c02e33b0SAdam Dybkowski if (mem->comp_memzones[i] == NULL) { 197c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 198c02e33b0SAdam Dybkowski "Memory to hold the compression memzone could not be allocated\n"); 199c02e33b0SAdam Dybkowski return -1; 200c02e33b0SAdam Dybkowski } 201c02e33b0SAdam Dybkowski 202c02e33b0SAdam Dybkowski mem->decomp_memzones[i] = comp_perf_make_memzone("decomp", mem, 203c02e33b0SAdam Dybkowski i, test_data->seg_sz); 204c02e33b0SAdam Dybkowski if (mem->decomp_memzones[i] == NULL) { 205c02e33b0SAdam Dybkowski RTE_LOG(ERR, USER1, 206c02e33b0SAdam Dybkowski "Memory to hold the decompression memzone could not be allocated\n"); 207c02e33b0SAdam Dybkowski return -1; 208c02e33b0SAdam Dybkowski } 209c02e33b0SAdam Dybkowski 210c02e33b0SAdam Dybkowski mem->comp_buf_infos[i].free_cb = 211c02e33b0SAdam Dybkowski comp_perf_extbuf_free_cb; 212c02e33b0SAdam Dybkowski mem->comp_buf_infos[i].fcb_opaque = NULL; 213c02e33b0SAdam Dybkowski rte_mbuf_ext_refcnt_set(&mem->comp_buf_infos[i], 1); 214c02e33b0SAdam Dybkowski 215c02e33b0SAdam Dybkowski mem->decomp_buf_infos[i].free_cb = 216c02e33b0SAdam Dybkowski comp_perf_extbuf_free_cb; 217c02e33b0SAdam Dybkowski mem->decomp_buf_infos[i].fcb_opaque = NULL; 218c02e33b0SAdam Dybkowski rte_mbuf_ext_refcnt_set(&mem->decomp_buf_infos[i], 1); 219c02e33b0SAdam Dybkowski } 220c02e33b0SAdam Dybkowski 221c02e33b0SAdam Dybkowski return 0; 222424dd6c8STomasz Jozwiak } 223424dd6c8STomasz Jozwiak 224424dd6c8STomasz Jozwiak int 225424dd6c8STomasz Jozwiak comp_perf_allocate_memory(struct comp_test_data *test_data, 226424dd6c8STomasz Jozwiak struct cperf_mem_resources *mem) 227424dd6c8STomasz Jozwiak { 228c02e33b0SAdam Dybkowski uint16_t comp_mbuf_size; 229c02e33b0SAdam Dybkowski uint16_t decomp_mbuf_size; 230*83cc3b90SMichael Baum size_t comp_data_size; 231*83cc3b90SMichael Baum size_t decomp_data_size; 232*83cc3b90SMichael Baum size_t output_data_sz; 233c02e33b0SAdam Dybkowski 234424dd6c8STomasz Jozwiak test_data->out_seg_sz = find_buf_size(test_data->seg_sz); 235c02e33b0SAdam Dybkowski 236*83cc3b90SMichael Baum if (test_data->test_op & COMPRESS) { 237*83cc3b90SMichael Baum /* 238*83cc3b90SMichael Baum * Number of segments for input and output 239424dd6c8STomasz Jozwiak * (compression and decompression) 240424dd6c8STomasz Jozwiak */ 241c02e33b0SAdam Dybkowski test_data->total_segs = DIV_CEIL(test_data->input_data_sz, 242424dd6c8STomasz Jozwiak test_data->seg_sz); 243*83cc3b90SMichael Baum } else { 244*83cc3b90SMichael Baum /* 245*83cc3b90SMichael Baum * When application does decompression only, input data is 246*83cc3b90SMichael Baum * compressed and smaller than the output. The expected size of 247*83cc3b90SMichael Baum * uncompressed data given by the user in segment size argument. 248*83cc3b90SMichael Baum */ 249*83cc3b90SMichael Baum test_data->total_segs = test_data->max_sgl_segs; 250*83cc3b90SMichael Baum } 251*83cc3b90SMichael Baum 252*83cc3b90SMichael Baum output_data_sz = (size_t) test_data->out_seg_sz * test_data->total_segs; 253*83cc3b90SMichael Baum output_data_sz = 254*83cc3b90SMichael Baum RTE_MAX(output_data_sz, (size_t) MIN_COMPRESSED_BUF_SIZE); 255c02e33b0SAdam Dybkowski 256c02e33b0SAdam Dybkowski if (test_data->use_external_mbufs != 0) { 257c02e33b0SAdam Dybkowski if (comp_perf_allocate_external_mbufs(test_data, mem) < 0) 258c02e33b0SAdam Dybkowski return -1; 259c02e33b0SAdam Dybkowski comp_mbuf_size = 0; 260c02e33b0SAdam Dybkowski decomp_mbuf_size = 0; 261*83cc3b90SMichael Baum } else if (test_data->test_op & COMPRESS) { 262c02e33b0SAdam Dybkowski comp_mbuf_size = test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM; 263c02e33b0SAdam Dybkowski decomp_mbuf_size = test_data->seg_sz + RTE_PKTMBUF_HEADROOM; 264*83cc3b90SMichael Baum } else { 265*83cc3b90SMichael Baum comp_mbuf_size = test_data->seg_sz + RTE_PKTMBUF_HEADROOM; 266*83cc3b90SMichael Baum decomp_mbuf_size = test_data->out_seg_sz + RTE_PKTMBUF_HEADROOM; 267c02e33b0SAdam Dybkowski } 268c02e33b0SAdam Dybkowski 269424dd6c8STomasz Jozwiak char pool_name[32] = ""; 270424dd6c8STomasz Jozwiak 271424dd6c8STomasz Jozwiak snprintf(pool_name, sizeof(pool_name), "comp_buf_pool_%u_qp_%u", 272424dd6c8STomasz Jozwiak mem->dev_id, mem->qp_id); 273424dd6c8STomasz Jozwiak mem->comp_buf_pool = rte_pktmbuf_pool_create(pool_name, 274c02e33b0SAdam Dybkowski test_data->total_segs, 275424dd6c8STomasz Jozwiak 0, 0, 276c02e33b0SAdam Dybkowski comp_mbuf_size, 277424dd6c8STomasz Jozwiak rte_socket_id()); 278424dd6c8STomasz Jozwiak if (mem->comp_buf_pool == NULL) { 279424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n"); 280424dd6c8STomasz Jozwiak return -1; 281424dd6c8STomasz Jozwiak } 282424dd6c8STomasz Jozwiak 283424dd6c8STomasz Jozwiak snprintf(pool_name, sizeof(pool_name), "decomp_buf_pool_%u_qp_%u", 284424dd6c8STomasz Jozwiak mem->dev_id, mem->qp_id); 285424dd6c8STomasz Jozwiak mem->decomp_buf_pool = rte_pktmbuf_pool_create(pool_name, 286c02e33b0SAdam Dybkowski test_data->total_segs, 287c02e33b0SAdam Dybkowski 0, 0, 288c02e33b0SAdam Dybkowski decomp_mbuf_size, 289424dd6c8STomasz Jozwiak rte_socket_id()); 290424dd6c8STomasz Jozwiak if (mem->decomp_buf_pool == NULL) { 291424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Mbuf mempool could not be created\n"); 292424dd6c8STomasz Jozwiak return -1; 293424dd6c8STomasz Jozwiak } 294424dd6c8STomasz Jozwiak 295c02e33b0SAdam Dybkowski mem->total_bufs = DIV_CEIL(test_data->total_segs, 296c02e33b0SAdam Dybkowski test_data->max_sgl_segs); 297424dd6c8STomasz Jozwiak 298424dd6c8STomasz Jozwiak snprintf(pool_name, sizeof(pool_name), "op_pool_%u_qp_%u", 299424dd6c8STomasz Jozwiak mem->dev_id, mem->qp_id); 3002695db95SArtur Trybula 3012695db95SArtur Trybula /* one mempool for both src and dst mbufs */ 302424dd6c8STomasz Jozwiak mem->op_pool = rte_comp_op_pool_create(pool_name, 3032695db95SArtur Trybula mem->total_bufs * 2, 304424dd6c8STomasz Jozwiak 0, 0, rte_socket_id()); 305424dd6c8STomasz Jozwiak if (mem->op_pool == NULL) { 306424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Comp op mempool could not be created\n"); 307424dd6c8STomasz Jozwiak return -1; 308424dd6c8STomasz Jozwiak } 309424dd6c8STomasz Jozwiak 310*83cc3b90SMichael Baum if (test_data->test_op & COMPRESS) { 311424dd6c8STomasz Jozwiak /* 312424dd6c8STomasz Jozwiak * Compressed data might be a bit larger than input data, 313424dd6c8STomasz Jozwiak * if data cannot be compressed 314424dd6c8STomasz Jozwiak */ 315*83cc3b90SMichael Baum comp_data_size = output_data_sz; 316*83cc3b90SMichael Baum decomp_data_size = test_data->input_data_sz; 317*83cc3b90SMichael Baum } else { 318*83cc3b90SMichael Baum comp_data_size = test_data->input_data_sz; 319*83cc3b90SMichael Baum decomp_data_size = output_data_sz; 320*83cc3b90SMichael Baum } 321*83cc3b90SMichael Baum 322*83cc3b90SMichael Baum mem->compressed_data = rte_zmalloc_socket(NULL, comp_data_size, 0, 323424dd6c8STomasz Jozwiak rte_socket_id()); 324424dd6c8STomasz Jozwiak if (mem->compressed_data == NULL) { 325424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Memory to hold the data from the input " 326424dd6c8STomasz Jozwiak "file could not be allocated\n"); 327424dd6c8STomasz Jozwiak return -1; 328424dd6c8STomasz Jozwiak } 329424dd6c8STomasz Jozwiak 330*83cc3b90SMichael Baum mem->decompressed_data = rte_zmalloc_socket(NULL, decomp_data_size, 0, 331424dd6c8STomasz Jozwiak rte_socket_id()); 332424dd6c8STomasz Jozwiak if (mem->decompressed_data == NULL) { 333424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Memory to hold the data from the input " 334424dd6c8STomasz Jozwiak "file could not be allocated\n"); 335424dd6c8STomasz Jozwiak return -1; 336424dd6c8STomasz Jozwiak } 337424dd6c8STomasz Jozwiak 338424dd6c8STomasz Jozwiak mem->comp_bufs = rte_zmalloc_socket(NULL, 339424dd6c8STomasz Jozwiak mem->total_bufs * sizeof(struct rte_mbuf *), 340424dd6c8STomasz Jozwiak 0, rte_socket_id()); 341424dd6c8STomasz Jozwiak if (mem->comp_bufs == NULL) { 342424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Memory to hold the compression mbufs" 343424dd6c8STomasz Jozwiak " could not be allocated\n"); 344424dd6c8STomasz Jozwiak return -1; 345424dd6c8STomasz Jozwiak } 346424dd6c8STomasz Jozwiak 347424dd6c8STomasz Jozwiak mem->decomp_bufs = rte_zmalloc_socket(NULL, 348424dd6c8STomasz Jozwiak mem->total_bufs * sizeof(struct rte_mbuf *), 349424dd6c8STomasz Jozwiak 0, rte_socket_id()); 350424dd6c8STomasz Jozwiak if (mem->decomp_bufs == NULL) { 351424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Memory to hold the decompression mbufs" 352424dd6c8STomasz Jozwiak " could not be allocated\n"); 353424dd6c8STomasz Jozwiak return -1; 354424dd6c8STomasz Jozwiak } 3556f1e5d80SArtur Trybula 356c02e33b0SAdam Dybkowski buffer_info.total_segments = test_data->total_segs; 3576f1e5d80SArtur Trybula buffer_info.segment_sz = test_data->seg_sz; 3586f1e5d80SArtur Trybula buffer_info.total_buffs = mem->total_bufs; 3596f1e5d80SArtur Trybula buffer_info.segments_per_buff = test_data->max_sgl_segs; 3606f1e5d80SArtur Trybula buffer_info.input_data_sz = test_data->input_data_sz; 3616f1e5d80SArtur Trybula 362424dd6c8STomasz Jozwiak return 0; 363424dd6c8STomasz Jozwiak } 364424dd6c8STomasz Jozwiak 365424dd6c8STomasz Jozwiak int 366424dd6c8STomasz Jozwiak prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem) 367424dd6c8STomasz Jozwiak { 368424dd6c8STomasz Jozwiak uint32_t remaining_data = test_data->input_data_sz; 369424dd6c8STomasz Jozwiak uint8_t *input_data_ptr = test_data->input_data; 3706f1e5d80SArtur Trybula size_t data_sz = 0; 371424dd6c8STomasz Jozwiak uint8_t *data_addr; 372424dd6c8STomasz Jozwiak uint32_t i, j; 3736f1e5d80SArtur Trybula uint16_t segs_per_mbuf = 0; 374c02e33b0SAdam Dybkowski uint32_t cmz = 0; 375c02e33b0SAdam Dybkowski uint32_t dmz = 0; 376*83cc3b90SMichael Baum bool decompress_only = !!(test_data->test_op == DECOMPRESS); 377424dd6c8STomasz Jozwiak 378424dd6c8STomasz Jozwiak for (i = 0; i < mem->total_bufs; i++) { 379424dd6c8STomasz Jozwiak /* Allocate data in input mbuf and copy data from input file */ 380424dd6c8STomasz Jozwiak mem->decomp_bufs[i] = 381424dd6c8STomasz Jozwiak rte_pktmbuf_alloc(mem->decomp_buf_pool); 382424dd6c8STomasz Jozwiak if (mem->decomp_bufs[i] == NULL) { 383424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not allocate mbuf\n"); 384424dd6c8STomasz Jozwiak return -1; 385424dd6c8STomasz Jozwiak } 386424dd6c8STomasz Jozwiak 387c02e33b0SAdam Dybkowski if (test_data->use_external_mbufs != 0) { 388c02e33b0SAdam Dybkowski rte_pktmbuf_attach_extbuf(mem->decomp_bufs[i], 389c02e33b0SAdam Dybkowski mem->decomp_memzones[dmz]->addr, 390c02e33b0SAdam Dybkowski mem->decomp_memzones[dmz]->iova, 391c02e33b0SAdam Dybkowski test_data->seg_sz, 392c02e33b0SAdam Dybkowski &mem->decomp_buf_infos[dmz]); 393c02e33b0SAdam Dybkowski dmz++; 394c02e33b0SAdam Dybkowski } 395c02e33b0SAdam Dybkowski 396*83cc3b90SMichael Baum if (!decompress_only) 397*83cc3b90SMichael Baum data_sz = RTE_MIN(remaining_data, test_data->seg_sz); 398*83cc3b90SMichael Baum else 399*83cc3b90SMichael Baum data_sz = test_data->out_seg_sz; 400*83cc3b90SMichael Baum 401424dd6c8STomasz Jozwiak data_addr = (uint8_t *) rte_pktmbuf_append( 402424dd6c8STomasz Jozwiak mem->decomp_bufs[i], data_sz); 403424dd6c8STomasz Jozwiak if (data_addr == NULL) { 404424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not append data\n"); 405424dd6c8STomasz Jozwiak return -1; 406424dd6c8STomasz Jozwiak } 407424dd6c8STomasz Jozwiak 408*83cc3b90SMichael Baum if (!decompress_only) { 409*83cc3b90SMichael Baum rte_memcpy(data_addr, input_data_ptr, data_sz); 410424dd6c8STomasz Jozwiak input_data_ptr += data_sz; 411424dd6c8STomasz Jozwiak remaining_data -= data_sz; 412*83cc3b90SMichael Baum } 413424dd6c8STomasz Jozwiak 414424dd6c8STomasz Jozwiak /* Already one segment in the mbuf */ 4156f1e5d80SArtur Trybula segs_per_mbuf = 1; 416424dd6c8STomasz Jozwiak 417424dd6c8STomasz Jozwiak /* Chain mbufs if needed for input mbufs */ 418424dd6c8STomasz Jozwiak while (segs_per_mbuf < test_data->max_sgl_segs 419424dd6c8STomasz Jozwiak && remaining_data > 0) { 420424dd6c8STomasz Jozwiak struct rte_mbuf *next_seg = 421424dd6c8STomasz Jozwiak rte_pktmbuf_alloc(mem->decomp_buf_pool); 422424dd6c8STomasz Jozwiak 423424dd6c8STomasz Jozwiak if (next_seg == NULL) { 424424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, 425424dd6c8STomasz Jozwiak "Could not allocate mbuf\n"); 426424dd6c8STomasz Jozwiak return -1; 427424dd6c8STomasz Jozwiak } 428424dd6c8STomasz Jozwiak 429c02e33b0SAdam Dybkowski if (test_data->use_external_mbufs != 0) { 430c02e33b0SAdam Dybkowski rte_pktmbuf_attach_extbuf( 431c02e33b0SAdam Dybkowski next_seg, 432c02e33b0SAdam Dybkowski mem->decomp_memzones[dmz]->addr, 433c02e33b0SAdam Dybkowski mem->decomp_memzones[dmz]->iova, 434c02e33b0SAdam Dybkowski test_data->seg_sz, 435c02e33b0SAdam Dybkowski &mem->decomp_buf_infos[dmz]); 436c02e33b0SAdam Dybkowski dmz++; 437c02e33b0SAdam Dybkowski } 438c02e33b0SAdam Dybkowski 439*83cc3b90SMichael Baum if (!decompress_only) 440*83cc3b90SMichael Baum data_sz = RTE_MIN(remaining_data, 441*83cc3b90SMichael Baum test_data->seg_sz); 442*83cc3b90SMichael Baum else 443*83cc3b90SMichael Baum data_sz = test_data->out_seg_sz; 444*83cc3b90SMichael Baum 445424dd6c8STomasz Jozwiak data_addr = (uint8_t *)rte_pktmbuf_append(next_seg, 446424dd6c8STomasz Jozwiak data_sz); 447424dd6c8STomasz Jozwiak 448424dd6c8STomasz Jozwiak if (data_addr == NULL) { 449424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not append data\n"); 450424dd6c8STomasz Jozwiak return -1; 451424dd6c8STomasz Jozwiak } 452424dd6c8STomasz Jozwiak 453*83cc3b90SMichael Baum if (!decompress_only) { 454424dd6c8STomasz Jozwiak rte_memcpy(data_addr, input_data_ptr, data_sz); 455424dd6c8STomasz Jozwiak input_data_ptr += data_sz; 456424dd6c8STomasz Jozwiak remaining_data -= data_sz; 457*83cc3b90SMichael Baum } 458424dd6c8STomasz Jozwiak 459424dd6c8STomasz Jozwiak if (rte_pktmbuf_chain(mem->decomp_bufs[i], 460424dd6c8STomasz Jozwiak next_seg) < 0) { 461424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not chain mbufs\n"); 462424dd6c8STomasz Jozwiak return -1; 463424dd6c8STomasz Jozwiak } 464424dd6c8STomasz Jozwiak segs_per_mbuf++; 465424dd6c8STomasz Jozwiak } 466424dd6c8STomasz Jozwiak 467424dd6c8STomasz Jozwiak /* Allocate data in output mbuf */ 468424dd6c8STomasz Jozwiak mem->comp_bufs[i] = 469424dd6c8STomasz Jozwiak rte_pktmbuf_alloc(mem->comp_buf_pool); 470424dd6c8STomasz Jozwiak if (mem->comp_bufs[i] == NULL) { 471424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not allocate mbuf\n"); 472424dd6c8STomasz Jozwiak return -1; 473424dd6c8STomasz Jozwiak } 474c02e33b0SAdam Dybkowski 475c02e33b0SAdam Dybkowski if (test_data->use_external_mbufs != 0) { 476c02e33b0SAdam Dybkowski rte_pktmbuf_attach_extbuf(mem->comp_bufs[i], 477c02e33b0SAdam Dybkowski mem->comp_memzones[cmz]->addr, 478c02e33b0SAdam Dybkowski mem->comp_memzones[cmz]->iova, 479c02e33b0SAdam Dybkowski test_data->out_seg_sz, 480c02e33b0SAdam Dybkowski &mem->comp_buf_infos[cmz]); 481c02e33b0SAdam Dybkowski cmz++; 482c02e33b0SAdam Dybkowski } 483c02e33b0SAdam Dybkowski 484*83cc3b90SMichael Baum if (decompress_only) 485*83cc3b90SMichael Baum data_sz = RTE_MIN(remaining_data, test_data->seg_sz); 486*83cc3b90SMichael Baum else 487*83cc3b90SMichael Baum data_sz = test_data->out_seg_sz; 488*83cc3b90SMichael Baum 489*83cc3b90SMichael Baum data_addr = (uint8_t *) rte_pktmbuf_append(mem->comp_bufs[i], 490*83cc3b90SMichael Baum data_sz); 491424dd6c8STomasz Jozwiak if (data_addr == NULL) { 492424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not append data\n"); 493424dd6c8STomasz Jozwiak return -1; 494424dd6c8STomasz Jozwiak } 495424dd6c8STomasz Jozwiak 496*83cc3b90SMichael Baum if (decompress_only) { 497*83cc3b90SMichael Baum rte_memcpy(data_addr, input_data_ptr, data_sz); 498*83cc3b90SMichael Baum input_data_ptr += data_sz; 499*83cc3b90SMichael Baum remaining_data -= data_sz; 500*83cc3b90SMichael Baum } 501*83cc3b90SMichael Baum 502424dd6c8STomasz Jozwiak /* Chain mbufs if needed for output mbufs */ 503*83cc3b90SMichael Baum for (j = 1; j < segs_per_mbuf && remaining_data > 0; j++) { 504424dd6c8STomasz Jozwiak struct rte_mbuf *next_seg = 505424dd6c8STomasz Jozwiak rte_pktmbuf_alloc(mem->comp_buf_pool); 506424dd6c8STomasz Jozwiak 507424dd6c8STomasz Jozwiak if (next_seg == NULL) { 508424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, 509424dd6c8STomasz Jozwiak "Could not allocate mbuf\n"); 510424dd6c8STomasz Jozwiak return -1; 511424dd6c8STomasz Jozwiak } 512424dd6c8STomasz Jozwiak 513c02e33b0SAdam Dybkowski if (test_data->use_external_mbufs != 0) { 514c02e33b0SAdam Dybkowski rte_pktmbuf_attach_extbuf( 515c02e33b0SAdam Dybkowski next_seg, 516c02e33b0SAdam Dybkowski mem->comp_memzones[cmz]->addr, 517c02e33b0SAdam Dybkowski mem->comp_memzones[cmz]->iova, 518c02e33b0SAdam Dybkowski test_data->out_seg_sz, 519c02e33b0SAdam Dybkowski &mem->comp_buf_infos[cmz]); 520c02e33b0SAdam Dybkowski cmz++; 521c02e33b0SAdam Dybkowski } 522c02e33b0SAdam Dybkowski 523*83cc3b90SMichael Baum if (decompress_only) 524*83cc3b90SMichael Baum data_sz = RTE_MIN(remaining_data, 525*83cc3b90SMichael Baum test_data->seg_sz); 526*83cc3b90SMichael Baum else 527*83cc3b90SMichael Baum data_sz = test_data->out_seg_sz; 528*83cc3b90SMichael Baum 529424dd6c8STomasz Jozwiak data_addr = (uint8_t *)rte_pktmbuf_append(next_seg, 530*83cc3b90SMichael Baum data_sz); 531424dd6c8STomasz Jozwiak if (data_addr == NULL) { 532424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not append data\n"); 533424dd6c8STomasz Jozwiak return -1; 534424dd6c8STomasz Jozwiak } 535424dd6c8STomasz Jozwiak 536*83cc3b90SMichael Baum if (decompress_only) { 537*83cc3b90SMichael Baum rte_memcpy(data_addr, input_data_ptr, data_sz); 538*83cc3b90SMichael Baum input_data_ptr += data_sz; 539*83cc3b90SMichael Baum remaining_data -= data_sz; 540*83cc3b90SMichael Baum } 541*83cc3b90SMichael Baum 542424dd6c8STomasz Jozwiak if (rte_pktmbuf_chain(mem->comp_bufs[i], 543424dd6c8STomasz Jozwiak next_seg) < 0) { 544424dd6c8STomasz Jozwiak RTE_LOG(ERR, USER1, "Could not chain mbufs\n"); 545424dd6c8STomasz Jozwiak return -1; 546424dd6c8STomasz Jozwiak } 547424dd6c8STomasz Jozwiak } 548424dd6c8STomasz Jozwiak } 549424dd6c8STomasz Jozwiak 5506f1e5d80SArtur Trybula buffer_info.segments_per_last_buff = segs_per_mbuf; 5516f1e5d80SArtur Trybula buffer_info.last_segment_sz = data_sz; 5526f1e5d80SArtur Trybula 553424dd6c8STomasz Jozwiak return 0; 554424dd6c8STomasz Jozwiak } 5556f1e5d80SArtur Trybula 5566f1e5d80SArtur Trybula void 5572695db95SArtur Trybula print_test_dynamics(const struct comp_test_data *test_data) 5586f1e5d80SArtur Trybula { 5596f1e5d80SArtur Trybula uint32_t opt_total_segs = DIV_CEIL(buffer_info.input_data_sz, 5606f1e5d80SArtur Trybula MAX_SEG_SIZE); 5616f1e5d80SArtur Trybula 5626f1e5d80SArtur Trybula if (buffer_info.total_buffs > 1) { 5632695db95SArtur Trybula if (test_data->test == CPERF_TEST_TYPE_THROUGHPUT) { 5646f1e5d80SArtur Trybula printf("\nWarning: for the current input parameters, number" 5656f1e5d80SArtur Trybula " of ops is higher than one, which may result" 5666f1e5d80SArtur Trybula " in sub-optimal performance.\n"); 5676f1e5d80SArtur Trybula printf("To improve the performance (for the current" 5686f1e5d80SArtur Trybula " input data) following parameters are" 5696f1e5d80SArtur Trybula " suggested:\n"); 5702695db95SArtur Trybula printf(" * Segment size: %d\n", 5712695db95SArtur Trybula MAX_SEG_SIZE); 5722695db95SArtur Trybula printf(" * Number of segments: %u\n", 5732695db95SArtur Trybula opt_total_segs); 5742695db95SArtur Trybula } 5756f1e5d80SArtur Trybula } else if (buffer_info.total_buffs == 1) { 5766f1e5d80SArtur Trybula printf("\nInfo: there is only one op with %u segments -" 5776f1e5d80SArtur Trybula " the compression ratio is the best.\n", 5786f1e5d80SArtur Trybula buffer_info.segments_per_last_buff); 5796f1e5d80SArtur Trybula if (buffer_info.segment_sz < MAX_SEG_SIZE) 5806f1e5d80SArtur Trybula printf("To reduce compression time, please use" 5816f1e5d80SArtur Trybula " bigger segment size: %d.\n", 5826f1e5d80SArtur Trybula MAX_SEG_SIZE); 5836f1e5d80SArtur Trybula else if (buffer_info.segment_sz == MAX_SEG_SIZE) 5846f1e5d80SArtur Trybula printf("Segment size is optimal for the best" 5856f1e5d80SArtur Trybula " performance.\n"); 5866f1e5d80SArtur Trybula } else 5876f1e5d80SArtur Trybula printf("Warning: something wrong happened!!\n"); 5886f1e5d80SArtur Trybula 5896f1e5d80SArtur Trybula printf("\nFor the current input parameters (segment size = %u," 5906f1e5d80SArtur Trybula " maximum segments per SGL = %u):\n", 5916f1e5d80SArtur Trybula buffer_info.segment_sz, 5926f1e5d80SArtur Trybula buffer_info.segments_per_buff); 5936f1e5d80SArtur Trybula printf(" * Total number of buffers: %d\n", 5946f1e5d80SArtur Trybula buffer_info.total_segments); 5956f1e5d80SArtur Trybula printf(" * %u buffer(s) %u bytes long, last buffer %u" 5966f1e5d80SArtur Trybula " byte(s) long\n", 5976f1e5d80SArtur Trybula buffer_info.total_segments - 1, 5986f1e5d80SArtur Trybula buffer_info.segment_sz, 5996f1e5d80SArtur Trybula buffer_info.last_segment_sz); 6006f1e5d80SArtur Trybula printf(" * Number of ops: %u\n", buffer_info.total_buffs); 6016f1e5d80SArtur Trybula printf(" * Total memory allocation: %u\n", 6026f1e5d80SArtur Trybula (buffer_info.total_segments - 1) * buffer_info.segment_sz 6036f1e5d80SArtur Trybula + buffer_info.last_segment_sz); 6046f1e5d80SArtur Trybula if (buffer_info.total_buffs > 1) 6056f1e5d80SArtur Trybula printf(" * %u ops: %u segment(s) in each," 6066f1e5d80SArtur Trybula " segment size %u\n", 6076f1e5d80SArtur Trybula buffer_info.total_buffs - 1, 6086f1e5d80SArtur Trybula buffer_info.segments_per_buff, 6096f1e5d80SArtur Trybula buffer_info.segment_sz); 6106f1e5d80SArtur Trybula if (buffer_info.segments_per_last_buff > 1) { 6116f1e5d80SArtur Trybula printf(" * 1 op %u segments:\n", 6126f1e5d80SArtur Trybula buffer_info.segments_per_last_buff); 6136f1e5d80SArtur Trybula printf(" o %u segment size %u\n", 6146f1e5d80SArtur Trybula buffer_info.segments_per_last_buff - 1, 6156f1e5d80SArtur Trybula buffer_info.segment_sz); 6166f1e5d80SArtur Trybula printf(" o last segment size %u\n", 6176f1e5d80SArtur Trybula buffer_info.last_segment_sz); 6186f1e5d80SArtur Trybula } else if (buffer_info.segments_per_last_buff == 1) { 6196f1e5d80SArtur Trybula printf(" * 1 op (the last one): %u segment %u" 6206f1e5d80SArtur Trybula " byte(s) long\n\n", 6216f1e5d80SArtur Trybula buffer_info.segments_per_last_buff, 6226f1e5d80SArtur Trybula buffer_info.last_segment_sz); 6236f1e5d80SArtur Trybula } 6246f1e5d80SArtur Trybula printf("\n"); 6256f1e5d80SArtur Trybula } 626