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