1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Intel Corporation
7 #include <rte_atomic.h>
9 #include <rte_eal_memconfig.h>
10 #include <rte_errno.h>
11 #include <rte_malloc.h>
12 #include <rte_memzone.h>
13 #include <rte_rwlock.h>
14 #include <rte_tailq.h>
16 #include "rte_stack.h"
17 #include "rte_stack_pvt.h"
21 TAILQ_HEAD(rte_stack_list, rte_tailq_entry);
23 static struct rte_tailq_elem rte_stack_tailq = {
24 .name = RTE_TAILQ_STACK_NAME,
26 EAL_REGISTER_TAILQ(rte_stack_tailq)
29 rte_stack_init(struct rte_stack *s)
31 memset(s, 0, sizeof(*s));
33 rte_stack_std_init(s);
37 rte_stack_get_memsize(unsigned int count)
39 return rte_stack_std_get_memsize(count);
43 rte_stack_create(const char *name, unsigned int count, int socket_id,
46 char mz_name[RTE_MEMZONE_NAMESIZE];
47 struct rte_stack_list *stack_list;
48 const struct rte_memzone *mz;
49 struct rte_tailq_entry *te;
56 sz = rte_stack_get_memsize(count);
58 ret = snprintf(mz_name, sizeof(mz_name), "%s%s",
59 RTE_STACK_MZ_PREFIX, name);
60 if (ret < 0 || ret >= (int)sizeof(mz_name)) {
61 rte_errno = ENAMETOOLONG;
65 te = rte_zmalloc("STACK_TAILQ_ENTRY", sizeof(*te), 0);
67 STACK_LOG_ERR("Cannot reserve memory for tailq\n");
72 rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
74 mz = rte_memzone_reserve_aligned(mz_name, sz, socket_id,
77 STACK_LOG_ERR("Cannot reserve stack memzone!\n");
78 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
87 /* Store the name for later lookups */
88 ret = snprintf(s->name, sizeof(s->name), "%s", name);
89 if (ret < 0 || ret >= (int)sizeof(s->name)) {
90 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
92 rte_errno = ENAMETOOLONG;
104 stack_list = RTE_TAILQ_CAST(rte_stack_tailq.head, rte_stack_list);
106 TAILQ_INSERT_TAIL(stack_list, te, next);
108 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
114 rte_stack_free(struct rte_stack *s)
116 struct rte_stack_list *stack_list;
117 struct rte_tailq_entry *te;
122 stack_list = RTE_TAILQ_CAST(rte_stack_tailq.head, rte_stack_list);
123 rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
125 /* find out tailq entry */
126 TAILQ_FOREACH(te, stack_list, next) {
132 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
136 TAILQ_REMOVE(stack_list, te, next);
138 rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
142 rte_memzone_free(s->memzone);
146 rte_stack_lookup(const char *name)
148 struct rte_stack_list *stack_list;
149 struct rte_tailq_entry *te;
150 struct rte_stack *r = NULL;
157 stack_list = RTE_TAILQ_CAST(rte_stack_tailq.head, rte_stack_list);
159 rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK);
161 TAILQ_FOREACH(te, stack_list, next) {
162 r = (struct rte_stack *) te->data;
163 if (strncmp(name, r->name, RTE_STACK_NAMESIZE) == 0)
167 rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK);
177 RTE_INIT(librte_stack_init_log)
179 stack_logtype = rte_log_register("lib.stack");
180 if (stack_logtype >= 0)
181 rte_log_set_level(stack_logtype, RTE_LOG_NOTICE);