Index | Thread | Search

From:
A Tammy <openbsd.ports@aisha.cc>
Subject:
Re: UPDATE: liburcu
To:
Brad Smith <brad@comstyle.com>, ports@openbsd.org
Cc:
tb@openbsd.org
Date:
Tue, 4 Jun 2024 07:47:15 -0400

Download raw body.

Thread
  • Brad Smith:

    UPDATE: liburcu

    • A Tammy:

      UPDATE: liburcu

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)
>