stack: enable lock-free implementation for aarch64

Enable both C11 atomic and non C11 atomic lock-free stack for aarch64.

Introduced a new header to reduce the ifdef clutter across generic and C11
files. The rte_stack_lf_stubs.h contains stub implementations of
__rte_stack_lf_count, __rte_stack_lf_push_elems and
__rte_stack_lf_pop_elems.

Suggested-by: Gage Eads <gage.eads@intel.com>
Suggested-by: Jerin Jacob <jerinj@marvell.com>
Signed-off-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Tested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
This commit is contained in:
Phil Yang 2019-10-18 19:21:30 +08:00 committed by David Marchand
parent fa3253c534
commit 7911ba0473
7 changed files with 56 additions and 35 deletions

View File

@ -648,8 +648,8 @@ Known Issues
Alternatively, applications can use the lock-free stack mempool handler. When
considering this handler, note that:
- It is currently limited to the x86_64 platform, because it uses an
instruction (16-byte compare-and-swap) that is not yet available on other
- It is currently limited to the aarch64 and x86_64 platforms, because it uses
an instruction (16-byte compare-and-swap) that is not yet available on other
platforms.
- It has worse average-case performance than the non-preemptive rte_ring, but
software caching (e.g. the mempool cache) can mitigate this by reducing the

View File

@ -56,6 +56,10 @@ New Features
Also, make sure to start the actual text at the margin.
=========================================================
* **Added Lock-free Stack for aarch64.**
The lock-free stack implementation is enabled for aarch64 platforms.
* **Added Hisilicon hns3 PMD.**
Added the new ``hns3`` net driver for the inbuilt Hisilicon Network

View File

@ -24,6 +24,7 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_STACK)-include := rte_stack.h \
rte_stack_std.h \
rte_stack_lf.h \
rte_stack_lf_generic.h \
rte_stack_lf_c11.h
rte_stack_lf_c11.h \
rte_stack_lf_stubs.h
include $(RTE_SDK)/mk/rte.lib.mk

View File

@ -5,11 +5,15 @@
#ifndef _RTE_STACK_LF_H_
#define _RTE_STACK_LF_H_
#if !(defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_ARM64))
#include "rte_stack_lf_stubs.h"
#else
#ifdef RTE_USE_C11_MEM_MODEL
#include "rte_stack_lf_c11.h"
#else
#include "rte_stack_lf_generic.h"
#endif
#endif
/**
* @internal Push several objects on the lock-free stack (MT-safe).

View File

@ -36,12 +36,6 @@ __rte_stack_lf_push_elems(struct rte_stack_lf_list *list,
struct rte_stack_lf_elem *last,
unsigned int num)
{
#ifndef RTE_ARCH_X86_64
RTE_SET_USED(first);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
#else
struct rte_stack_lf_head old_head;
int success;
@ -79,7 +73,6 @@ __rte_stack_lf_push_elems(struct rte_stack_lf_list *list,
* to the LIFO len update.
*/
__atomic_add_fetch(&list->len, num, __ATOMIC_RELEASE);
#endif
}
static __rte_always_inline struct rte_stack_lf_elem *
@ -88,14 +81,6 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
void **obj_table,
struct rte_stack_lf_elem **last)
{
#ifndef RTE_ARCH_X86_64
RTE_SET_USED(obj_table);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
return NULL;
#else
struct rte_stack_lf_head old_head;
uint64_t len;
int success;
@ -169,7 +154,6 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
} while (success == 0);
return old_head.top;
#endif
}
#endif /* _RTE_STACK_LF_C11_H_ */

View File

@ -36,12 +36,6 @@ __rte_stack_lf_push_elems(struct rte_stack_lf_list *list,
struct rte_stack_lf_elem *last,
unsigned int num)
{
#ifndef RTE_ARCH_X86_64
RTE_SET_USED(first);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
#else
struct rte_stack_lf_head old_head;
int success;
@ -75,7 +69,6 @@ __rte_stack_lf_push_elems(struct rte_stack_lf_list *list,
} while (success == 0);
rte_atomic64_add((rte_atomic64_t *)&list->len, num);
#endif
}
static __rte_always_inline struct rte_stack_lf_elem *
@ -84,14 +77,6 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
void **obj_table,
struct rte_stack_lf_elem **last)
{
#ifndef RTE_ARCH_X86_64
RTE_SET_USED(obj_table);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
return NULL;
#else
struct rte_stack_lf_head old_head;
int success;
@ -159,7 +144,6 @@ __rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
} while (success == 0);
return old_head.top;
#endif
}
#endif /* _RTE_STACK_LF_GENERIC_H_ */

View File

@ -0,0 +1,44 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2019 Arm Limited
*/
#ifndef _RTE_STACK_LF_STUBS_H_
#define _RTE_STACK_LF_STUBS_H_
#include <rte_common.h>
static __rte_always_inline unsigned int
__rte_stack_lf_count(struct rte_stack *s)
{
RTE_SET_USED(s);
return 0;
}
static __rte_always_inline void
__rte_stack_lf_push_elems(struct rte_stack_lf_list *list,
struct rte_stack_lf_elem *first,
struct rte_stack_lf_elem *last,
unsigned int num)
{
RTE_SET_USED(first);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
}
static __rte_always_inline struct rte_stack_lf_elem *
__rte_stack_lf_pop_elems(struct rte_stack_lf_list *list,
unsigned int num,
void **obj_table,
struct rte_stack_lf_elem **last)
{
RTE_SET_USED(obj_table);
RTE_SET_USED(last);
RTE_SET_USED(list);
RTE_SET_USED(num);
return NULL;
}
#endif /* _RTE_STACK_LF_STUBS_H_ */