xref: /dpdk/drivers/net/softnic/rte_eth_softnic_mempool.c (revision 0efefe115a1ef0baf411e0cecb6f426ba600d12a)
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