Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2010-2018 Intel Corporation 3 : : */ 4 : : 5 : : #include <stdlib.h> 6 : : #include <string.h> 7 : : 8 : : #include <rte_mbuf.h> 9 : : #include <rte_string_fns.h> 10 : : 11 : : #include "rte_eth_softnic_internals.h" 12 : : 13 : : #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) 14 : : 15 : : int 16 : 0 : softnic_mempool_init(struct pmd_internals *p) 17 : : { 18 : 0 : TAILQ_INIT(&p->mempool_list); 19 : : 20 : 0 : return 0; 21 : : } 22 : : 23 : : void 24 : 0 : softnic_mempool_free(struct pmd_internals *p) 25 : : { 26 : 0 : for ( ; ; ) { 27 : : struct softnic_mempool *mempool; 28 : : 29 : 0 : mempool = TAILQ_FIRST(&p->mempool_list); 30 [ # # ]: 0 : if (mempool == NULL) 31 : : break; 32 : : 33 [ # # ]: 0 : TAILQ_REMOVE(&p->mempool_list, mempool, node); 34 : 0 : rte_mempool_free(mempool->m); 35 : 0 : free(mempool); 36 : : } 37 : 0 : } 38 : : 39 : : struct softnic_mempool * 40 : 0 : softnic_mempool_find(struct pmd_internals *p, 41 : : const char *name) 42 : : { 43 : : struct softnic_mempool *mempool; 44 : : 45 [ # # ]: 0 : if (name == NULL) 46 : : return NULL; 47 : : 48 [ # # ]: 0 : TAILQ_FOREACH(mempool, &p->mempool_list, node) 49 [ # # ]: 0 : if (strcmp(mempool->name, name) == 0) 50 : 0 : return mempool; 51 : : 52 : : return NULL; 53 : : } 54 : : 55 : : struct softnic_mempool * 56 : 0 : softnic_mempool_create(struct pmd_internals *p, 57 : : const char *name, 58 : : struct softnic_mempool_params *params) 59 : : { 60 : : char mempool_name[NAME_SIZE]; 61 : : struct softnic_mempool *mempool; 62 : : struct rte_mempool *m; 63 : : 64 : : /* Check input params */ 65 [ # # # # ]: 0 : if (name == NULL || 66 [ # # ]: 0 : softnic_mempool_find(p, name) || 67 : 0 : params == NULL || 68 [ # # ]: 0 : params->buffer_size < BUFFER_SIZE_MIN || 69 [ # # ]: 0 : params->pool_size == 0) 70 : 0 : return NULL; 71 : : 72 : : /* Resource create */ 73 : : snprintf(mempool_name, sizeof(mempool_name), "%s_%s", 74 : 0 : p->params.name, 75 : : name); 76 : : 77 : 0 : m = rte_pktmbuf_pool_create(mempool_name, 78 : : params->pool_size, 79 : : params->cache_size, 80 : : 0, 81 : 0 : params->buffer_size - sizeof(struct rte_mbuf), 82 : 0 : p->params.cpu_id); 83 : : 84 [ # # ]: 0 : if (m == NULL) 85 : : return NULL; 86 : : 87 : : /* Node allocation */ 88 : 0 : mempool = calloc(1, sizeof(struct softnic_mempool)); 89 [ # # ]: 0 : if (mempool == NULL) { 90 : 0 : rte_mempool_free(m); 91 : 0 : return NULL; 92 : : } 93 : : 94 : : /* Node fill in */ 95 : 0 : strlcpy(mempool->name, name, sizeof(mempool->name)); 96 : 0 : mempool->m = m; 97 : 0 : mempool->buffer_size = params->buffer_size; 98 : : 99 : : /* Node add to list */ 100 : 0 : TAILQ_INSERT_TAIL(&p->mempool_list, mempool, node); 101 : : 102 : 0 : return mempool; 103 : : }