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