16bfe74f8SJasvinder Singh /* SPDX-License-Identifier: BSD-3-Clause
26bfe74f8SJasvinder Singh * Copyright(c) 2010-2018 Intel Corporation
36bfe74f8SJasvinder Singh */
46bfe74f8SJasvinder Singh
56bfe74f8SJasvinder Singh #include <stdlib.h>
66bfe74f8SJasvinder Singh #include <string.h>
76bfe74f8SJasvinder Singh
86bfe74f8SJasvinder Singh #include <rte_mbuf.h>
9*7959831bSJasvinder Singh #include <rte_string_fns.h>
106bfe74f8SJasvinder Singh
116bfe74f8SJasvinder Singh #include "mempool.h"
126bfe74f8SJasvinder Singh
136bfe74f8SJasvinder Singh #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
146bfe74f8SJasvinder Singh
156bfe74f8SJasvinder Singh static struct mempool_list mempool_list;
166bfe74f8SJasvinder Singh
176bfe74f8SJasvinder Singh int
mempool_init(void)186bfe74f8SJasvinder Singh mempool_init(void)
196bfe74f8SJasvinder Singh {
206bfe74f8SJasvinder Singh TAILQ_INIT(&mempool_list);
216bfe74f8SJasvinder Singh
226bfe74f8SJasvinder Singh return 0;
236bfe74f8SJasvinder Singh }
246bfe74f8SJasvinder Singh
256bfe74f8SJasvinder Singh struct mempool *
mempool_find(const char * name)266bfe74f8SJasvinder Singh mempool_find(const char *name)
276bfe74f8SJasvinder Singh {
286bfe74f8SJasvinder Singh struct mempool *mempool;
296bfe74f8SJasvinder Singh
306bfe74f8SJasvinder Singh if (name == NULL)
316bfe74f8SJasvinder Singh return NULL;
326bfe74f8SJasvinder Singh
336bfe74f8SJasvinder Singh TAILQ_FOREACH(mempool, &mempool_list, node)
346bfe74f8SJasvinder Singh if (strcmp(mempool->name, name) == 0)
356bfe74f8SJasvinder Singh return mempool;
366bfe74f8SJasvinder Singh
376bfe74f8SJasvinder Singh return NULL;
386bfe74f8SJasvinder Singh }
396bfe74f8SJasvinder Singh
406bfe74f8SJasvinder Singh struct mempool *
mempool_create(const char * name,struct mempool_params * params)416bfe74f8SJasvinder Singh mempool_create(const char *name, struct mempool_params *params)
426bfe74f8SJasvinder Singh {
436bfe74f8SJasvinder Singh struct mempool *mempool;
446bfe74f8SJasvinder Singh struct rte_mempool *m;
456bfe74f8SJasvinder Singh
466bfe74f8SJasvinder Singh /* Check input params */
476bfe74f8SJasvinder Singh if ((name == NULL) ||
486bfe74f8SJasvinder Singh mempool_find(name) ||
496bfe74f8SJasvinder Singh (params == NULL) ||
506bfe74f8SJasvinder Singh (params->buffer_size < BUFFER_SIZE_MIN) ||
516bfe74f8SJasvinder Singh (params->pool_size == 0))
526bfe74f8SJasvinder Singh return NULL;
536bfe74f8SJasvinder Singh
546bfe74f8SJasvinder Singh /* Resource create */
556bfe74f8SJasvinder Singh m = rte_pktmbuf_pool_create(
566bfe74f8SJasvinder Singh name,
576bfe74f8SJasvinder Singh params->pool_size,
586bfe74f8SJasvinder Singh params->cache_size,
596bfe74f8SJasvinder Singh 0,
606bfe74f8SJasvinder Singh params->buffer_size - sizeof(struct rte_mbuf),
616bfe74f8SJasvinder Singh params->cpu_id);
626bfe74f8SJasvinder Singh
636bfe74f8SJasvinder Singh if (m == NULL)
646bfe74f8SJasvinder Singh return NULL;
656bfe74f8SJasvinder Singh
666bfe74f8SJasvinder Singh /* Node allocation */
676bfe74f8SJasvinder Singh mempool = calloc(1, sizeof(struct mempool));
686bfe74f8SJasvinder Singh if (mempool == NULL) {
696bfe74f8SJasvinder Singh rte_mempool_free(m);
706bfe74f8SJasvinder Singh return NULL;
716bfe74f8SJasvinder Singh }
726bfe74f8SJasvinder Singh
736bfe74f8SJasvinder Singh /* Node fill in */
74*7959831bSJasvinder Singh strlcpy(mempool->name, name, sizeof(mempool->name));
756bfe74f8SJasvinder Singh mempool->m = m;
766bfe74f8SJasvinder Singh mempool->buffer_size = params->buffer_size;
776bfe74f8SJasvinder Singh
786bfe74f8SJasvinder Singh /* Node add to list */
796bfe74f8SJasvinder Singh TAILQ_INSERT_TAIL(&mempool_list, mempool, node);
806bfe74f8SJasvinder Singh
816bfe74f8SJasvinder Singh return mempool;
826bfe74f8SJasvinder Singh }
83