BUG/MINOR: threads: move declaration of capabilities to config.h

In commit f161d0f51 ("BUG/MINOR: pools/threads: don't ignore DEBUG_UAF
on double-word CAS capable archs") I moved some defines and accidently
messed up with lockfree pools. The problem is that the HA_HAVE_CAS_DW
macro is not defined anymore where the CONFIG_HAP_LOCKLESS_POOLS macro
is set, so this fix implicitly disabled lockfree pools.

This patch fixes this by moving the capabilities definition to config.h
(probably that we'd benefit from having an "arch.h" file to declare the
capabilities offered by the architecture). In a test on a 12-core machine,
we used to measure 19s spent in the pool lock for 1M requests without
this patch, and 0 with it so that's definitely a net saving.

No backport is required, this is only for 1.9.
This commit is contained in:
Willy Tarreau 2018-10-10 18:29:23 +02:00
parent 7ad43e7928
commit 2325d8af93
2 changed files with 11 additions and 6 deletions

View File

@ -47,10 +47,18 @@
#define THREAD_LOCAL
#endif
/* Some architectures have a double-word CAS, sometimes even dual-8 bytes */
#if defined(__x86_64__) || defined (__aarch64__)
#define HA_HAVE_CAS_DW
#define HA_CAS_IS_8B
#elif defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__))
#define HA_HAVE_CAS_DW
#endif
/* On architectures supporting threads and double-word CAS, we can implement
* lock-less memory pools. This isn't supported for debugging modes however.
*/
#if !defined(DEBUG_NO_LOCKLESS_POOLS) && defined(USE_THREAD) && defined(HA_HAVE_CAS_DW) && !defined(DEBUG_UAF)
#if defined(USE_THREAD) && defined(HA_HAVE_CAS_DW) && !defined(DEBUG_NO_LOCKLESS_POOLS) && !defined(DEBUG_UAF)
#define CONFIG_HAP_LOCKLESS_POOLS
#endif

View File

@ -816,8 +816,7 @@ static inline void __spin_unlock(enum lock_label lbl, struct ha_spinlock *l,
#endif /* DEBUG_THREAD */
#ifdef __x86_64__
#define HA_HAVE_CAS_DW 1
#define HA_CAS_IS_8B
static __inline int
__ha_cas_dw(void *target, void *compare, const void *set)
{
@ -855,7 +854,7 @@ __ha_barrier_full(void)
}
#elif defined(__arm__) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__))
#define HA_HAVE_CAS_DW 1
static __inline void
__ha_barrier_load(void)
{
@ -896,8 +895,6 @@ static __inline int __ha_cas_dw(void *target, void *compare, const void *set)
}
#elif defined (__aarch64__)
#define HA_HAVE_CAS_DW 1
#define HA_CAS_IS_8B
static __inline void
__ha_barrier_load(void)