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