X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_stack%2Frte_stack.c;h=d19824f0043998c86146a1b08ee2791d28e1a2ee;hb=103809d032cda71552596aefac269da97e10e7ea;hp=610014b6c2d9ad4e3eae82163619ebc800c66642;hpb=05d3b5283cc1a61b2e204ddd6bc30b6f3053f280;p=dpdk.git diff --git a/lib/librte_stack/rte_stack.c b/lib/librte_stack/rte_stack.c index 610014b6c2..d19824f004 100644 --- a/lib/librte_stack/rte_stack.c +++ b/lib/librte_stack/rte_stack.c @@ -4,6 +4,7 @@ #include +#include #include #include #include @@ -14,7 +15,7 @@ #include #include "rte_stack.h" -#include "rte_stack_pvt.h" +#include "stack_pvt.h" int stack_logtype; @@ -25,18 +26,25 @@ static struct rte_tailq_elem rte_stack_tailq = { }; EAL_REGISTER_TAILQ(rte_stack_tailq) + static void -rte_stack_init(struct rte_stack *s) +rte_stack_init(struct rte_stack *s, unsigned int count, uint32_t flags) { memset(s, 0, sizeof(*s)); - rte_stack_std_init(s); + if (flags & RTE_STACK_F_LF) + rte_stack_lf_init(s, count); + else + rte_stack_std_init(s); } static ssize_t -rte_stack_get_memsize(unsigned int count) +rte_stack_get_memsize(unsigned int count, uint32_t flags) { - return rte_stack_std_get_memsize(count); + if (flags & RTE_STACK_F_LF) + return rte_stack_lf_get_memsize(count); + else + return rte_stack_std_get_memsize(count); } struct rte_stack * @@ -51,9 +59,16 @@ rte_stack_create(const char *name, unsigned int count, int socket_id, unsigned int sz; int ret; - RTE_SET_USED(flags); +#ifdef RTE_ARCH_64 + RTE_BUILD_BUG_ON(sizeof(struct rte_stack_lf_head) != 16); +#else + if (flags & RTE_STACK_F_LF) { + STACK_LOG_ERR("Lock-free stack is not supported on your platform\n"); + return NULL; + } +#endif - sz = rte_stack_get_memsize(count); + sz = rte_stack_get_memsize(count, flags); ret = snprintf(mz_name, sizeof(mz_name), "%s%s", RTE_STACK_MZ_PREFIX, name); @@ -69,25 +84,25 @@ rte_stack_create(const char *name, unsigned int count, int socket_id, return NULL; } - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_lock(); mz = rte_memzone_reserve_aligned(mz_name, sz, socket_id, 0, __alignof__(*s)); if (mz == NULL) { STACK_LOG_ERR("Cannot reserve stack memzone!\n"); - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); rte_free(te); return NULL; } s = mz->addr; - rte_stack_init(s); + rte_stack_init(s, count, flags); /* Store the name for later lookups */ - ret = snprintf(s->name, sizeof(s->name), "%s", name); + ret = strlcpy(s->name, name, sizeof(s->name)); if (ret < 0 || ret >= (int)sizeof(s->name)) { - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); rte_errno = ENAMETOOLONG; rte_free(te); @@ -105,7 +120,7 @@ rte_stack_create(const char *name, unsigned int count, int socket_id, TAILQ_INSERT_TAIL(stack_list, te, next); - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); return s; } @@ -120,7 +135,7 @@ rte_stack_free(struct rte_stack *s) return; stack_list = RTE_TAILQ_CAST(rte_stack_tailq.head, rte_stack_list); - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_lock(); /* find out tailq entry */ TAILQ_FOREACH(te, stack_list, next) { @@ -129,13 +144,13 @@ rte_stack_free(struct rte_stack *s) } if (te == NULL) { - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); return; } TAILQ_REMOVE(stack_list, te, next); - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); rte_free(te); @@ -156,7 +171,7 @@ rte_stack_lookup(const char *name) stack_list = RTE_TAILQ_CAST(rte_stack_tailq.head, rte_stack_list); - rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_read_lock(); TAILQ_FOREACH(te, stack_list, next) { r = (struct rte_stack *) te->data; @@ -164,7 +179,7 @@ rte_stack_lookup(const char *name) break; } - rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_read_unlock(); if (te == NULL) { rte_errno = ENOENT;