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