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 "rte_eth_softnic_internals.h"
12
13 #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
14
15 int
softnic_mempool_init(struct pmd_internals * p)16 softnic_mempool_init(struct pmd_internals *p)
17 {
18 TAILQ_INIT(&p->mempool_list);
19
20 return 0;
21 }
22
23 void
softnic_mempool_free(struct pmd_internals * p)24 softnic_mempool_free(struct pmd_internals *p)
25 {
26 for ( ; ; ) {
27 struct softnic_mempool *mempool;
28
29 mempool = TAILQ_FIRST(&p->mempool_list);
30 if (mempool == NULL)
31 break;
32
33 TAILQ_REMOVE(&p->mempool_list, mempool, node);
34 rte_mempool_free(mempool->m);
35 free(mempool);
36 }
37 }
38
39 struct softnic_mempool *
softnic_mempool_find(struct pmd_internals * p,const char * name)40 softnic_mempool_find(struct pmd_internals *p,
41 const char *name)
42 {
43 struct softnic_mempool *mempool;
44
45 if (name == NULL)
46 return NULL;
47
48 TAILQ_FOREACH(mempool, &p->mempool_list, node)
49 if (strcmp(mempool->name, name) == 0)
50 return mempool;
51
52 return NULL;
53 }
54
55 struct softnic_mempool *
softnic_mempool_create(struct pmd_internals * p,const char * name,struct softnic_mempool_params * params)56 softnic_mempool_create(struct pmd_internals *p,
57 const char *name,
58 struct softnic_mempool_params *params)
59 {
60 char mempool_name[NAME_SIZE];
61 struct softnic_mempool *mempool;
62 struct rte_mempool *m;
63
64 /* Check input params */
65 if (name == NULL ||
66 softnic_mempool_find(p, name) ||
67 params == NULL ||
68 params->buffer_size < BUFFER_SIZE_MIN ||
69 params->pool_size == 0)
70 return NULL;
71
72 /* Resource create */
73 snprintf(mempool_name, sizeof(mempool_name), "%s_%s",
74 p->params.name,
75 name);
76
77 m = rte_pktmbuf_pool_create(mempool_name,
78 params->pool_size,
79 params->cache_size,
80 0,
81 params->buffer_size - sizeof(struct rte_mbuf),
82 p->params.cpu_id);
83
84 if (m == NULL)
85 return NULL;
86
87 /* Node allocation */
88 mempool = calloc(1, sizeof(struct softnic_mempool));
89 if (mempool == NULL) {
90 rte_mempool_free(m);
91 return NULL;
92 }
93
94 /* Node fill in */
95 strlcpy(mempool->name, name, sizeof(mempool->name));
96 mempool->m = m;
97 mempool->buffer_size = params->buffer_size;
98
99 /* Node add to list */
100 TAILQ_INSERT_TAIL(&p->mempool_list, mempool, node);
101
102 return mempool;
103 }
104