net/avp: remove resources when port is closed
[dpdk.git] / drivers / net / softnic / rte_eth_softnic_mempool.c
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
16 softnic_mempool_init(struct pmd_internals *p)
17 {
18         TAILQ_INIT(&p->mempool_list);
19
20         return 0;
21 }
22
23 void
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 *
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 *
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 }