> Subject: [dpdk-dev] [PATCH v3 1/2] eal: add 128-bit cmpset (x86-64 only)
> 
> This operation can be used for non-blocking algorithms, such as a non-
> blocking stack or ring.
> 
> Signed-off-by: Gage Eads <gage.e...@intel.com>
> ---
>  .../common/include/arch/x86/rte_atomic_64.h        | 22
> ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/lib/librte_eal/common/include/arch/x86/rte_atomic_64.h
> b/lib/librte_eal/common/include/arch/x86/rte_atomic_64.h
> index fd2ec9c53..34c2addf8 100644
> --- a/lib/librte_eal/common/include/arch/x86/rte_atomic_64.h
> +++ b/lib/librte_eal/common/include/arch/x86/rte_atomic_64.h
Since this is a 128b operation should there be a new file created with the name 
rte_atomic_128.h?

> @@ -34,6 +34,7 @@
>  /*
>   * Inspired from FreeBSD src/sys/amd64/include/atomic.h
>   * Copyright (c) 1998 Doug Rabson
> + * Copyright (c) 2019 Intel Corporation
>   * All rights reserved.
>   */
> 
> @@ -208,4 +209,25 @@ static inline void rte_atomic64_clear(rte_atomic64_t
> *v)  }  #endif
> 
> +static inline int
> +rte_atomic128_cmpset(volatile uint64_t *dst, uint64_t *exp, uint64_t
> +*src) {
The API name suggests it is a 128b operation. 'dst', 'exp' and 'src' should be 
pointers to 128b (__int128)? Or we could define our own data type.
Since, it is a new API, can we define it with memory orderings which will be 
more conducive to relaxed memory ordering based architectures? You can refer to 
[1] and [2] for guidance.
If this an external API, it requires 'experimental' tag.

1. 
https://github.com/ARM-software/progress64/blob/master/src/lockfree/aarch64.h#L63
2. 
https://github.com/ARM-software/progress64/blob/master/src/lockfree/x86-64.h#L34

> +     uint8_t res;
> +
> +     asm volatile (
> +                   MPLOCKED
> +                   "cmpxchg16b %[dst];"
> +                   " sete %[res]"
> +                   : [dst] "=m" (*dst),
> +                     [res] "=r" (res)
> +                   : "c" (src[1]),
> +                     "b" (src[0]),
> +                     "m" (*dst),
> +                     "d" (exp[1]),
> +                     "a" (exp[0])
> +                   : "memory");
> +
> +     return res;
> +}
> +
>  #endif /* _RTE_ATOMIC_X86_64_H_ */
> --
> 2.13.6

Reply via email to