xref: /dpdk/examples/ip_pipeline/mempool.c (revision 7959831b4d1b52f6525acb63ce0d94eeeb396855)
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