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