On 6/4/24 02:52, Brad Smith wrote:
> Here is a diff to add futex support for liburcu.
>

Copying for others on the list - I've tested it out net/knot in two
production servers and it's working well.

OK aisha


> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/liburcu/Makefile,v
> retrieving revision 1.28
> diff -u -p -u -p -r1.28 Makefile
> --- Makefile  17 Oct 2023 06:17:19 -0000      1.28
> +++ Makefile  4 Jun 2024 04:00:59 -0000
> @@ -3,7 +3,7 @@ COMMENT =             user-level RCU implementation
>  V =                  0.14.0
>  DISTNAME =           userspace-rcu-$V
>  PKGNAME =            liburcu-$V
> -REVISION =           0
> +REVISION =           1
>  
>  SHARED_LIBS +=  urcu-bp                   3.0 # 9.0
>  SHARED_LIBS +=  urcu-cds                  2.1 # 9.0
> @@ -34,5 +34,13 @@ COMPILER =         base-clang ports-gcc
>  USE_GMAKE =          Yes
>  
>  CONFIGURE_STYLE =    gnu
> +
> +TEST_DEPENDS +=              shells/bash
> +
> +# Adjust shell scripts to allow Bash in other locations
> +# da56d5cad05a280a8171ef51f185e6d0d29610f0
> +post-extract:
> +     find ${WRKSRC}/tests -exec grep -q '/bin/bash' {} \; -print |\
> +             xargs sed -i "s#/bin/bash#/usr/bin/env bash#g"
>  
>  .include <bsd.port.mk>
> Index: patches/patch-include_urcu_futex_h
> ===================================================================
> RCS file: patches/patch-include_urcu_futex_h
> diff -N patches/patch-include_urcu_futex_h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-include_urcu_futex_h        4 Jun 2024 04:00:59 -0000
> @@ -0,0 +1,121 @@
> +- Use futex on OpenBSD
> +  e9af364c26b0e474b87a7fe5fb2222a399f8e180
> +- futex.h: Use urcu_posix_assert to validate unused values
> +  e463c38f0ec65d06e544681d1916991808a6a2b9
> +
> +Index: include/urcu/futex.h
> +--- include/urcu/futex.h.orig
> ++++ include/urcu/futex.h
> +@@ -39,20 +39,28 @@
> + #include <errno.h>
> + #include <urcu/compiler.h>
> + #include <urcu/arch.h>
> ++#include <urcu/assert.h>
> + 
> + #elif defined(__FreeBSD__)
> + 
> + #include <sys/types.h>
> + #include <sys/umtx.h>
> + 
> ++#elif defined(__OpenBSD__)
> ++
> ++#include <sys/time.h>
> ++#include <sys/futex.h>
> ++
> + #endif
> + 
> + #ifdef __cplusplus
> + extern "C" {
> + #endif
> + 
> ++#ifndef __OpenBSD__
> + #define FUTEX_WAIT          0
> + #define FUTEX_WAKE          1
> ++#endif
> + 
> + /*
> +  * sys_futex compatibility header.
> +@@ -78,8 +86,7 @@ extern int compat_futex_async(int32_t *uaddr, int op, 
> + static inline int futex(int32_t *uaddr, int op, int32_t val,
> +             const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
> + {
> +-    return syscall(__NR_futex, uaddr, op, val, timeout,
> +-                    uaddr2, val3);
> ++    return syscall(__NR_futex, uaddr, op, val, timeout, uaddr2, val3);
> + }
> + 
> + static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
> +@@ -121,9 +128,7 @@ static inline int futex_async(int32_t *uaddr, int op, 
> + #elif defined(__FreeBSD__)
> + 
> + static inline int futex_async(int32_t *uaddr, int op, int32_t val,
> +-            const struct timespec *timeout,
> +-            int32_t *uaddr2 __attribute__((unused)),
> +-            int32_t val3 __attribute__((unused)))
> ++            const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
> + {
> +     int umtx_op;
> +     void *umtx_uaddr = NULL, *umtx_uaddr2 = NULL;
> +@@ -132,6 +137,13 @@ static inline int futex_async(int32_t *uaddr, int op, 
> +             ._clockid = CLOCK_MONOTONIC,
> +     };
> + 
> ++    /*
> ++     * Check if NULL or zero. Don't let users expect that they are
> ++     * taken into account.
> ++     */
> ++    urcu_posix_assert(!uaddr2);
> ++    urcu_posix_assert(!val3);
> ++
> +     switch (op) {
> +     case FUTEX_WAIT:
> +             /* On FreeBSD, a "u_int" is a 32-bit integer. */
> +@@ -158,6 +170,48 @@ static inline int futex_noasync(int32_t *uaddr, int op
> +             const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
> + {
> +     return futex_async(uaddr, op, val, timeout, uaddr2, val3);
> ++}
> ++
> ++#elif defined(__OpenBSD__)
> ++
> ++static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
> ++            const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
> ++{
> ++    int ret;
> ++
> ++    /*
> ++     * Check that val3 is zero. Don't let users expect that it is
> ++     * taken into account.
> ++     */
> ++    urcu_posix_assert(!val3);
> ++
> ++    ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
> ++            (volatile uint32_t *) uaddr2);
> ++    if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
> ++            return compat_futex_noasync(uaddr, op, val, timeout,
> ++                            uaddr2, val3);
> ++    }
> ++    return ret;
> ++}
> ++
> ++static inline int futex_async(int32_t *uaddr, int op, int32_t val,
> ++            const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
> ++{
> ++    int ret;
> ++
> ++    /*
> ++     * Check that val3 is zero. Don't let users expect that it is
> ++     * taken into account.
> ++     */
> ++    urcu_posix_assert(!val3);
> ++
> ++    ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
> ++            (volatile uint32_t *) uaddr2);
> ++    if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
> ++            return compat_futex_async(uaddr, op, val, timeout,
> ++                            uaddr2, val3);
> ++    }
> ++    return ret;
> + }
> + 
> + #elif defined(__CYGWIN__)
> Index: patches/patch-include_urcu_syscall-compat_h
> ===================================================================
> RCS file: 
> /cvs/ports/devel/liburcu/patches/patch-include_urcu_syscall-compat_h,v
> retrieving revision 1.3
> diff -u -p -u -p -r1.3 patch-include_urcu_syscall-compat_h
> --- patches/patch-include_urcu_syscall-compat_h       10 Mar 2022 00:04:05 
> -0000      1.3
> +++ patches/patch-include_urcu_syscall-compat_h       4 Jun 2024 04:00:59 
> -0000
> @@ -1,12 +1,16 @@
> +Add support for OpenBSD
> +11f3d1c24e6179abf8247611c5308f41d95389a1
> +
>  Index: include/urcu/syscall-compat.h
>  --- include/urcu/syscall-compat.h.orig
>  +++ include/urcu/syscall-compat.h
> -@@ -33,7 +33,7 @@
> +@@ -33,7 +33,8 @@
>   #include <syscall.h>
>   
>   #elif defined(__CYGWIN__) || defined(__APPLE__) || \
>  -    defined(__FreeBSD__) || defined(__DragonFly__)
> -+    defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
> ++    defined(__FreeBSD__) || defined(__DragonFly__) || \
> ++    defined(__OpenBSD__)
>   /* Don't include anything on these platforms. */
>   
>   #else
> Index: patches/patch-tests_common_thread-id_h
> ===================================================================
> RCS file: /cvs/ports/devel/liburcu/patches/patch-tests_common_thread-id_h,v
> retrieving revision 1.4
> diff -u -p -u -p -r1.4 patch-tests_common_thread-id_h
> --- patches/patch-tests_common_thread-id_h    10 Mar 2022 00:04:05 -0000      
> 1.4
> +++ patches/patch-tests_common_thread-id_h    4 Jun 2024 04:00:59 -0000
> @@ -1,4 +1,5 @@
> -XXX not portable, but used by tests only.
> +Add support for OpenBSD
> +11f3d1c24e6179abf8247611c5308f41d95389a1
>  
>  Index: tests/common/thread-id.h
>  --- tests/common/thread-id.h.orig
> @@ -8,7 +9,7 @@ Index: tests/common/thread-id.h
>   }
>   
>  +#elif defined(__OpenBSD__)
> -+# include <unistd.h>
> ++#include <unistd.h>
>  +
>  +static inline
>  +unsigned long urcu_get_thread_id(void)
>

Reply via email to