1*6bfe74f8SJasvinder Singh /* SPDX-License-Identifier: BSD-3-Clause 2*6bfe74f8SJasvinder Singh * Copyright(c) 2010-2018 Intel Corporation 3*6bfe74f8SJasvinder Singh */ 4*6bfe74f8SJasvinder Singh 5*6bfe74f8SJasvinder Singh #include <stdlib.h> 6*6bfe74f8SJasvinder Singh #include <string.h> 7*6bfe74f8SJasvinder Singh 8*6bfe74f8SJasvinder Singh #include <rte_mbuf.h> 9*6bfe74f8SJasvinder Singh 10*6bfe74f8SJasvinder Singh #include "mempool.h" 11*6bfe74f8SJasvinder Singh 12*6bfe74f8SJasvinder Singh #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) 13*6bfe74f8SJasvinder Singh 14*6bfe74f8SJasvinder Singh static struct mempool_list mempool_list; 15*6bfe74f8SJasvinder Singh 16*6bfe74f8SJasvinder Singh int 17*6bfe74f8SJasvinder Singh mempool_init(void) 18*6bfe74f8SJasvinder Singh { 19*6bfe74f8SJasvinder Singh TAILQ_INIT(&mempool_list); 20*6bfe74f8SJasvinder Singh 21*6bfe74f8SJasvinder Singh return 0; 22*6bfe74f8SJasvinder Singh } 23*6bfe74f8SJasvinder Singh 24*6bfe74f8SJasvinder Singh struct mempool * 25*6bfe74f8SJasvinder Singh mempool_find(const char *name) 26*6bfe74f8SJasvinder Singh { 27*6bfe74f8SJasvinder Singh struct mempool *mempool; 28*6bfe74f8SJasvinder Singh 29*6bfe74f8SJasvinder Singh if (name == NULL) 30*6bfe74f8SJasvinder Singh return NULL; 31*6bfe74f8SJasvinder Singh 32*6bfe74f8SJasvinder Singh TAILQ_FOREACH(mempool, &mempool_list, node) 33*6bfe74f8SJasvinder Singh if (strcmp(mempool->name, name) == 0) 34*6bfe74f8SJasvinder Singh return mempool; 35*6bfe74f8SJasvinder Singh 36*6bfe74f8SJasvinder Singh return NULL; 37*6bfe74f8SJasvinder Singh } 38*6bfe74f8SJasvinder Singh 39*6bfe74f8SJasvinder Singh struct mempool * 40*6bfe74f8SJasvinder Singh mempool_create(const char *name, struct mempool_params *params) 41*6bfe74f8SJasvinder Singh { 42*6bfe74f8SJasvinder Singh struct mempool *mempool; 43*6bfe74f8SJasvinder Singh struct rte_mempool *m; 44*6bfe74f8SJasvinder Singh 45*6bfe74f8SJasvinder Singh /* Check input params */ 46*6bfe74f8SJasvinder Singh if ((name == NULL) || 47*6bfe74f8SJasvinder Singh mempool_find(name) || 48*6bfe74f8SJasvinder Singh (params == NULL) || 49*6bfe74f8SJasvinder Singh (params->buffer_size < BUFFER_SIZE_MIN) || 50*6bfe74f8SJasvinder Singh (params->pool_size == 0)) 51*6bfe74f8SJasvinder Singh return NULL; 52*6bfe74f8SJasvinder Singh 53*6bfe74f8SJasvinder Singh /* Resource create */ 54*6bfe74f8SJasvinder Singh m = rte_pktmbuf_pool_create( 55*6bfe74f8SJasvinder Singh name, 56*6bfe74f8SJasvinder Singh params->pool_size, 57*6bfe74f8SJasvinder Singh params->cache_size, 58*6bfe74f8SJasvinder Singh 0, 59*6bfe74f8SJasvinder Singh params->buffer_size - sizeof(struct rte_mbuf), 60*6bfe74f8SJasvinder Singh params->cpu_id); 61*6bfe74f8SJasvinder Singh 62*6bfe74f8SJasvinder Singh if (m == NULL) 63*6bfe74f8SJasvinder Singh return NULL; 64*6bfe74f8SJasvinder Singh 65*6bfe74f8SJasvinder Singh /* Node allocation */ 66*6bfe74f8SJasvinder Singh mempool = calloc(1, sizeof(struct mempool)); 67*6bfe74f8SJasvinder Singh if (mempool == NULL) { 68*6bfe74f8SJasvinder Singh rte_mempool_free(m); 69*6bfe74f8SJasvinder Singh return NULL; 70*6bfe74f8SJasvinder Singh } 71*6bfe74f8SJasvinder Singh 72*6bfe74f8SJasvinder Singh /* Node fill in */ 73*6bfe74f8SJasvinder Singh strncpy(mempool->name, name, sizeof(mempool->name)); 74*6bfe74f8SJasvinder Singh mempool->m = m; 75*6bfe74f8SJasvinder Singh mempool->buffer_size = params->buffer_size; 76*6bfe74f8SJasvinder Singh 77*6bfe74f8SJasvinder Singh /* Node add to list */ 78*6bfe74f8SJasvinder Singh TAILQ_INSERT_TAIL(&mempool_list, mempool, node); 79*6bfe74f8SJasvinder Singh 80*6bfe74f8SJasvinder Singh return mempool; 81*6bfe74f8SJasvinder Singh } 82