xref: /dpdk/examples/ip_pipeline/mempool.c (revision 7959831b4d1b52f6525acb63ce0d94eeeb396855)
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 "mempool.h"
12 
13 #define BUFFER_SIZE_MIN        (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
14 
15 static struct mempool_list mempool_list;
16 
17 int
mempool_init(void)18 mempool_init(void)
19 {
20 	TAILQ_INIT(&mempool_list);
21 
22 	return 0;
23 }
24 
25 struct mempool *
mempool_find(const char * name)26 mempool_find(const char *name)
27 {
28 	struct mempool *mempool;
29 
30 	if (name == NULL)
31 		return NULL;
32 
33 	TAILQ_FOREACH(mempool, &mempool_list, node)
34 		if (strcmp(mempool->name, name) == 0)
35 			return mempool;
36 
37 	return NULL;
38 }
39 
40 struct mempool *
mempool_create(const char * name,struct mempool_params * params)41 mempool_create(const char *name, struct mempool_params *params)
42 {
43 	struct mempool *mempool;
44 	struct rte_mempool *m;
45 
46 	/* Check input params */
47 	if ((name == NULL) ||
48 		mempool_find(name) ||
49 		(params == NULL) ||
50 		(params->buffer_size < BUFFER_SIZE_MIN) ||
51 		(params->pool_size == 0))
52 		return NULL;
53 
54 	/* Resource create */
55 	m = rte_pktmbuf_pool_create(
56 		name,
57 		params->pool_size,
58 		params->cache_size,
59 		0,
60 		params->buffer_size - sizeof(struct rte_mbuf),
61 		params->cpu_id);
62 
63 	if (m == NULL)
64 		return NULL;
65 
66 	/* Node allocation */
67 	mempool = calloc(1, sizeof(struct mempool));
68 	if (mempool == NULL) {
69 		rte_mempool_free(m);
70 		return NULL;
71 	}
72 
73 	/* Node fill in */
74 	strlcpy(mempool->name, name, sizeof(mempool->name));
75 	mempool->m = m;
76 	mempool->buffer_size = params->buffer_size;
77 
78 	/* Node add to list */
79 	TAILQ_INSERT_TAIL(&mempool_list, mempool, node);
80 
81 	return mempool;
82 }
83