xref: /dpdk/examples/ip_pipeline/mempool.c (revision fb73e096110a41b77448fe27fd9be8c489ec5d82)
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 
10 #include "mempool.h"
11 
12 #define BUFFER_SIZE_MIN        (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
13 
14 static struct mempool_list mempool_list;
15 
16 int
17 mempool_init(void)
18 {
19 	TAILQ_INIT(&mempool_list);
20 
21 	return 0;
22 }
23 
24 struct mempool *
25 mempool_find(const char *name)
26 {
27 	struct mempool *mempool;
28 
29 	if (name == NULL)
30 		return NULL;
31 
32 	TAILQ_FOREACH(mempool, &mempool_list, node)
33 		if (strcmp(mempool->name, name) == 0)
34 			return mempool;
35 
36 	return NULL;
37 }
38 
39 struct mempool *
40 mempool_create(const char *name, struct mempool_params *params)
41 {
42 	struct mempool *mempool;
43 	struct rte_mempool *m;
44 
45 	/* Check input params */
46 	if ((name == NULL) ||
47 		mempool_find(name) ||
48 		(params == NULL) ||
49 		(params->buffer_size < BUFFER_SIZE_MIN) ||
50 		(params->pool_size == 0))
51 		return NULL;
52 
53 	/* Resource create */
54 	m = rte_pktmbuf_pool_create(
55 		name,
56 		params->pool_size,
57 		params->cache_size,
58 		0,
59 		params->buffer_size - sizeof(struct rte_mbuf),
60 		params->cpu_id);
61 
62 	if (m == NULL)
63 		return NULL;
64 
65 	/* Node allocation */
66 	mempool = calloc(1, sizeof(struct mempool));
67 	if (mempool == NULL) {
68 		rte_mempool_free(m);
69 		return NULL;
70 	}
71 
72 	/* Node fill in */
73 	strncpy(mempool->name, name, sizeof(mempool->name));
74 	mempool->m = m;
75 	mempool->buffer_size = params->buffer_size;
76 
77 	/* Node add to list */
78 	TAILQ_INSERT_TAIL(&mempool_list, mempool, node);
79 
80 	return mempool;
81 }
82