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