Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package userspace-rcu for openSUSE:Factory checked in at 2026-01-05 14:50:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/userspace-rcu (Old) and /work/SRC/openSUSE:Factory/.userspace-rcu.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "userspace-rcu" Mon Jan 5 14:50:13 2026 rev:22 rq:1325235 version:0.15.5 Changes: -------- --- /work/SRC/openSUSE:Factory/userspace-rcu/userspace-rcu.changes 2025-12-23 13:43:53.884415364 +0100 +++ /work/SRC/openSUSE:Factory/.userspace-rcu.new.1928/userspace-rcu.changes 2026-01-05 14:50:24.331395572 +0100 @@ -1,0 +2,15 @@ +Sat Jan 3 21:48:22 UTC 2026 - Dirk Müller <[email protected]> + +- update to 0.15.5: + * x86: Define cmm_smp_mb() as lock; addl rather than mfence + * Introduce barrier test + * Add test_uatomic to gitignore + * Cleanup: Remove stray space + * benchmark: Add uatomic benchmark + * uatomic: Fix redundant memory barriers for atomic builtin + operations + * Cleanup: Remove useless declarations from urcu-qsbr + * src/urcu-bp.c: assert => urcu_posix_assert + * ppc.h: improve ppc64 caa_get_cycles on Darwin + +------------------------------------------------------------------- Old: ---- userspace-rcu-0.15.3.tar.bz2 userspace-rcu-0.15.3.tar.bz2.asc New: ---- userspace-rcu-0.15.5.tar.bz2 userspace-rcu-0.15.5.tar.bz2.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ userspace-rcu.spec ++++++ --- /var/tmp/diff_new_pack.GPCXlW/_old 2026-01-05 14:50:27.139512526 +0100 +++ /var/tmp/diff_new_pack.GPCXlW/_new 2026-01-05 14:50:27.143512693 +0100 @@ -2,7 +2,7 @@ # # spec file for package userspace-rcu # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2012 Pascal Bleser <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -20,7 +20,7 @@ %define soname 8 Name: userspace-rcu -Version: 0.15.3 +Version: 0.15.5 Release: 0 Summary: Userspace Read-Copy-Update Library License: GPL-2.0-or-later AND LGPL-2.1-or-later AND MIT AND GPL-3.0-or-later ++++++ userspace-rcu-0.15.3.tar.bz2 -> userspace-rcu-0.15.5.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/ChangeLog new/userspace-rcu-0.15.5/ChangeLog --- old/userspace-rcu-0.15.3/ChangeLog 2025-05-14 21:07:43.000000000 +0200 +++ new/userspace-rcu-0.15.5/ChangeLog 2025-11-11 02:28:34.000000000 +0100 @@ -2,6 +2,19 @@ # # SPDX-License-Identifier: CC-BY-4.0 +2025-11-10 Userspace RCU 0.15.5 + * x86: Define cmm_smp_mb() as lock; addl rather than mfence + * Introduce barrier test + * Add test_uatomic to gitignore + * Cleanup: Remove stray space + * benchmark: Add uatomic benchmark + +2025-11-04 Userspace RCU 0.15.4 + * uatomic: Fix redundant memory barriers for atomic builtin operations + * Cleanup: Remove useless declarations from urcu-qsbr + * src/urcu-bp.c: assert => urcu_posix_assert + * ppc.h: improve ppc64 caa_get_cycles on Darwin + 2025-05-14 Userspace RCU 0.15.3 * Fix: Use bitfield static assert with GCC < 7.1.0 * Fix: Allow compile-time checks for GCC 5.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/config/ltmain.sh new/userspace-rcu-0.15.5/config/ltmain.sh --- old/userspace-rcu-0.15.3/config/ltmain.sh 2023-08-21 17:58:24.000000000 +0200 +++ new/userspace-rcu-0.15.5/config/ltmain.sh 2025-10-21 14:31:35.000000000 +0200 @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.7 Debian-2.4.7-5" +VERSION="2.4.7 Debian-2.4.7-7~deb12u1" package_revision=2.4.7 @@ -572,27 +572,15 @@ # --------------------- # Append VALUE onto the existing contents of VAR. - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes + if test -z "$_G_HAVE_PLUSEQ_OP" && \ + __PLUSEQ_TEST="a" && \ + __PLUSEQ_TEST+=" b" 2>/dev/null && \ + test "a b" = "$__PLUSEQ_TEST"; then + _G_HAVE_PLUSEQ_OP=yes + fi if test yes = "$_G_HAVE_PLUSEQ_OP" then @@ -2308,7 +2296,7 @@ compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.7-5 + version: $progname $scriptversion Debian-2.4.7-7~deb12u1 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/configure new/userspace-rcu-0.15.5/configure --- old/userspace-rcu-0.15.3/configure 2025-05-14 21:24:09.000000000 +0200 +++ new/userspace-rcu-0.15.5/configure 2025-11-11 02:26:39.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for userspace-rcu 0.15.3. +# Generated by GNU Autoconf 2.71 for userspace-rcu 0.15.5. # # Report bugs to <mathieu dot desnoyers at efficios dot com>. # @@ -621,8 +621,8 @@ # Identity of this package. PACKAGE_NAME='userspace-rcu' PACKAGE_TARNAME='userspace-rcu' -PACKAGE_VERSION='0.15.3' -PACKAGE_STRING='userspace-rcu 0.15.3' +PACKAGE_VERSION='0.15.5' +PACKAGE_STRING='userspace-rcu 0.15.5' PACKAGE_BUGREPORT='mathieu dot desnoyers at efficios dot com' PACKAGE_URL='http://liburcu.org/' @@ -1398,7 +1398,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures userspace-rcu 0.15.3 to adapt to many kinds of systems. +\`configure' configures userspace-rcu 0.15.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1470,7 +1470,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of userspace-rcu 0.15.3:";; + short | recursive ) echo "Configuration of userspace-rcu 0.15.5:";; esac cat <<\_ACEOF @@ -1607,7 +1607,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -userspace-rcu configure 0.15.3 +userspace-rcu configure 0.15.5 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2224,7 +2224,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by userspace-rcu $as_me 0.15.3, which was +It was created by userspace-rcu $as_me 0.15.5, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3844,7 +3844,7 @@ # Define the identity of the package. PACKAGE='userspace-rcu' - VERSION='0.15.3' + VERSION='0.15.5' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -21633,7 +21633,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by userspace-rcu $as_me 0.15.3, which was +This file was extended by userspace-rcu $as_me 0.15.5, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -21702,7 +21702,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -userspace-rcu config.status 0.15.3 +userspace-rcu config.status 0.15.5 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/configure.ac new/userspace-rcu-0.15.5/configure.ac --- old/userspace-rcu-0.15.3/configure.ac 2025-05-14 21:21:56.000000000 +0200 +++ new/userspace-rcu-0.15.5/configure.ac 2025-11-11 02:26:33.000000000 +0100 @@ -7,7 +7,7 @@ # Project version information m4_define([urcu_version_major], [0]) m4_define([urcu_version_minor], [15]) -m4_define([urcu_version_patch], [3]) +m4_define([urcu_version_patch], [5]) m4_define([urcu_version_dev_stage], []) m4_define([urcu_version], urcu_version_major[.]urcu_version_minor[.]urcu_version_patch[]urcu_version_dev_stage) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/Makefile.am new/userspace-rcu-0.15.5/include/Makefile.am --- old/userspace-rcu-0.15.3/include/Makefile.am 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/Makefile.am 2025-11-05 21:05:14.000000000 +0100 @@ -69,6 +69,7 @@ urcu/uatomic/arm.h \ urcu/uatomic/builtins.h \ urcu/uatomic/builtins-generic.h \ + urcu/uatomic/builtins-x86.h \ urcu/uatomic/gcc.h \ urcu/uatomic/generic.h \ urcu/uatomic.h \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/Makefile.in new/userspace-rcu-0.15.5/include/Makefile.in --- old/userspace-rcu-0.15.3/include/Makefile.in 2025-05-14 21:24:09.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/Makefile.in 2025-11-11 02:26:40.000000000 +0100 @@ -398,6 +398,7 @@ urcu/uatomic/arm.h \ urcu/uatomic/builtins.h \ urcu/uatomic/builtins-generic.h \ + urcu/uatomic/builtins-x86.h \ urcu/uatomic/gcc.h \ urcu/uatomic/generic.h \ urcu/uatomic.h \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/urcu/arch/ppc.h new/userspace-rcu-0.15.5/include/urcu/arch/ppc.h --- old/userspace-rcu-0.15.3/include/urcu/arch/ppc.h 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/urcu/arch/ppc.h 2025-11-04 20:59:29.000000000 +0100 @@ -98,7 +98,7 @@ typedef uint64_t caa_cycles_t; -#ifdef __powerpc64__ +#if defined(__powerpc64__) || defined(__ppc64__) static inline caa_cycles_t caa_get_cycles(void) { return (caa_cycles_t) mftb(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/urcu/arch/x86.h new/userspace-rcu-0.15.5/include/urcu/arch/x86.h --- old/userspace-rcu-0.15.3/include/urcu/arch/x86.h 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/urcu/arch/x86.h 2025-11-06 14:59:41.000000000 +0100 @@ -46,6 +46,12 @@ #define cmm_smp_rmb() cmm_barrier() #define cmm_smp_wmb() cmm_barrier() +/* + * Define cmm_smp_mb() as a "lock; addl" instruction which is faster + * than a mfence (tested on AMD Ryzen 7). + */ +#define cmm_smp_mb() __asm__ __volatile__ ("lock; addl $0,0(%%rsp)":::"memory") + #else /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins-generic.h new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins-generic.h --- old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins-generic.h 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins-generic.h 2025-11-05 21:05:14.000000000 +0100 @@ -12,12 +12,42 @@ #include <urcu/compiler.h> #include <urcu/system.h> +/* + * Whether the memory order `CMM_SEQ_CST_FENCE` should emit a fence after an + * atomic load operation. Can be overriden by the architecture. + * + * Default: Emit the memory barrier. + */ +#ifndef cmm_seq_cst_fence_after_atomic_load +# define cmm_seq_cst_fence_after_atomic_load cmm_seq_cst_fence_after_atomic +#endif + +/* + * Whether the memory order `CMM_SEQ_CST_FENCE` should emit a fence after an + * atomic store operation. Can be overriden by the architecture. + * + * Default: Emit the memory barrier. + */ +#ifndef cmm_seq_cst_fence_after_atomic_store +# define cmm_seq_cst_fence_after_atomic_store cmm_seq_cst_fence_after_atomic +#endif + +/* + * Whether the memory order `CMM_SEQ_CST_FENCE` should emit a fence after an + * atomic read-modify-write operation. Can be overriden by the architecture. + * + * Default: Emit the memory barrier. + */ +#ifndef cmm_seq_cst_fence_after_atomic_rmw +# define cmm_seq_cst_fence_after_atomic_rmw cmm_seq_cst_fence_after_atomic +#endif + #define uatomic_store_mo(addr, v, mo) \ do { \ _cmm_static_assert__atomic_lf(sizeof(*(addr))); \ __atomic_store_n(cmm_cast_volatile(addr), v, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_store(mo); \ } while (0) #define uatomic_load_mo(addr, mo) \ @@ -27,7 +57,7 @@ __typeof__(*(addr)) _value = \ __atomic_load_n(cmm_cast_volatile(addr), \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_load(mo); \ \ _value; \ }) @@ -42,9 +72,9 @@ &_old, new, 0, \ cmm_to_c11(mos), \ cmm_to_c11(mof))) { \ - cmm_seq_cst_fence_after_atomic(mos); \ + cmm_seq_cst_fence_after_atomic_rmw(mos); \ } else { \ - cmm_seq_cst_fence_after_atomic(mof); \ + cmm_seq_cst_fence_after_atomic_rmw(mof); \ } \ _old; \ }) @@ -56,7 +86,7 @@ __typeof__((*addr)) _old = \ __atomic_exchange_n(cmm_cast_volatile(addr), v, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_rmw(mo); \ _old; \ }) @@ -67,7 +97,7 @@ __typeof__(*(addr)) _old = \ __atomic_add_fetch(cmm_cast_volatile(addr), v, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_rmw(mo); \ _old; \ }) @@ -79,7 +109,7 @@ __typeof__(*(addr)) _old = \ __atomic_sub_fetch(cmm_cast_volatile(addr), v, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_rmw(mo); \ _old; \ }) @@ -89,7 +119,7 @@ _cmm_static_assert__atomic_lf(sizeof(*(addr))); \ (void) __atomic_and_fetch(cmm_cast_volatile(addr), mask, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_rmw(mo); \ } while (0) @@ -98,7 +128,7 @@ _cmm_static_assert__atomic_lf(sizeof(*(addr))); \ (void) __atomic_or_fetch(cmm_cast_volatile(addr), mask, \ cmm_to_c11(mo)); \ - cmm_seq_cst_fence_after_atomic(mo); \ + cmm_seq_cst_fence_after_atomic_rmw(mo); \ } while (0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins-x86.h new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins-x86.h --- old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins-x86.h 1970-01-01 01:00:00.000000000 +0100 +++ new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins-x86.h 2025-11-05 21:05:14.000000000 +0100 @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +// SPDX-FileCopyrightText: 2025 Olivier Dion <[email protected]> +// + +/* + * urcu/uatomic/builtins-x86.h + */ + +#ifndef _URCU_UATOMIC_BUILTINS_X86_H +#define _URCU_UATOMIC_BUILTINS_X86_H + +/* + * On x86, a atomic store with sequential consistency is always implemented with + * an exchange operation, which has an implicit lock prefix when a memory operand + * is used. + * + * Indeed, on x86, only loads can be re-ordered with prior stores. Therefore, + * for keeping sequential consistency, either load operations or store + * operations need to have a memory barrier. All major toolchains have selected + * the store operations to have this barrier to avoid penalty on load + * operations. + * + * Therefore, assuming that the used toolchain follows this convention, it is + * safe to rely on this implicit memory barrier to implement the + * `CMM_SEQ_CST_FENCE` memory order and thus no further barrier need to be + * emitted. + */ +#define cmm_seq_cst_fence_after_atomic_store(...) \ + do { } while (0) + +/* + * Let the default implementation (emit a memory barrier) after load operations + * for the `CMM_SEQ_CST_FENCE`. The rationale is explained above for + * `cmm_seq_cst_fence_after_atomic_store()`. + */ +/* #define cmm_seq_cst_fence_after_atomic_load(...) */ + + +/* + * On x86, atomic read-modify-write operations always have a lock prefix either + * implicitly or explicitly for sequential consistency. + * + * Therefore, no further memory barrier, for the `CMM_SEQ_CST_FENCE` memory + * order, needs to be emitted for these operations. + */ +#define cmm_seq_cst_fence_after_atomic_rmw(...) \ + do { } while (0) + +#endif /* _URCU_UATOMIC_BUILTINS_X86_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins.h new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins.h --- old/userspace-rcu-0.15.3/include/urcu/uatomic/builtins.h 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/include/urcu/uatomic/builtins.h 2025-11-05 21:05:14.000000000 +0100 @@ -82,6 +82,10 @@ # error "Toolchain is missing lock-free atomic defines." #endif +#if defined(URCU_ARCH_X86) +# include <urcu/uatomic/builtins-x86.h> +#endif + #include <urcu/uatomic/builtins-generic.h> #endif /* _URCU_UATOMIC_BUILTINS_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/src/urcu-bp.c new/userspace-rcu-0.15.5/src/urcu-bp.c --- old/userspace-rcu-0.15.3/src/urcu-bp.c 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/src/urcu-bp.c 2025-11-04 20:59:29.000000000 +0100 @@ -409,7 +409,7 @@ new_chunk_size_bytes, 0); if (new_chunk != MAP_FAILED) { /* Should not have moved. */ - assert(new_chunk == last_chunk); + urcu_posix_assert(new_chunk == last_chunk); memset((char *) last_chunk + old_chunk_size_bytes, 0, new_chunk_size_bytes - old_chunk_size_bytes); last_chunk->capacity = new_capacity; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/src/urcu-qsbr.c new/userspace-rcu-0.15.5/src/urcu-qsbr.c --- old/userspace-rcu-0.15.3/src/urcu-qsbr.c 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/src/urcu-qsbr.c 2025-11-05 21:05:14.000000000 +0100 @@ -456,19 +456,16 @@ { return _urcu_qsbr_read_ongoing(); } -void rcu_read_ongoing_qsbr(); void urcu_qsbr_quiescent_state(void) { _urcu_qsbr_quiescent_state(); } -void rcu_quiescent_state_qsbr(); void urcu_qsbr_thread_offline(void) { _urcu_qsbr_thread_offline(); } -void rcu_thread_offline_qsbr(); void urcu_qsbr_thread_online(void) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/tests/benchmark/Makefile.am new/userspace-rcu-0.15.5/tests/benchmark/Makefile.am --- old/userspace-rcu-0.15.3/tests/benchmark/Makefile.am 2025-04-14 20:11:29.000000000 +0200 +++ new/userspace-rcu-0.15.5/tests/benchmark/Makefile.am 2025-11-06 14:59:41.000000000 +0100 @@ -55,7 +55,8 @@ test_urcu_wfq_dynlink test_urcu_wfs_dynlink \ test_urcu_wfcq_dynlink \ test_urcu_lfq_dynlink test_urcu_lfs_dynlink test_urcu_hash \ - test_urcu_lfs_rcu_dynlink + test_urcu_lfs_rcu_dynlink \ + test_uatomic test_barrier URCU_COMMON_LIB=$(top_builddir)/src/liburcu-common.la URCU_LIB=$(top_builddir)/src/liburcu.la @@ -66,6 +67,10 @@ DEBUG_YIELD_LIB=$(builddir)/../common/libdebug-yield.la +test_uatomic_SOURCES = test_uatomic.c + +test_barrier_SOURCES = test_barrier.c + test_urcu_SOURCES = test_urcu.c common-states.c test_urcu_LDADD = $(URCU_LIB) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/tests/benchmark/Makefile.in new/userspace-rcu-0.15.5/tests/benchmark/Makefile.in --- old/userspace-rcu-0.15.3/tests/benchmark/Makefile.in 2025-05-14 21:24:09.000000000 +0200 +++ new/userspace-rcu-0.15.5/tests/benchmark/Makefile.in 2025-11-11 02:26:40.000000000 +0100 @@ -115,7 +115,8 @@ test_urcu_wfcq$(EXEEXT) test_urcu_wfq_dynlink$(EXEEXT) \ test_urcu_wfs_dynlink$(EXEEXT) test_urcu_wfcq_dynlink$(EXEEXT) \ test_urcu_lfq_dynlink$(EXEEXT) test_urcu_lfs_dynlink$(EXEEXT) \ - test_urcu_hash$(EXEEXT) test_urcu_lfs_rcu_dynlink$(EXEEXT) + test_urcu_hash$(EXEEXT) test_urcu_lfs_rcu_dynlink$(EXEEXT) \ + test_uatomic$(EXEEXT) test_barrier$(EXEEXT) TESTS = subdir = tests/benchmark ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -142,13 +143,16 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -am_test_cycles_per_loop_OBJECTS = test_cycles_per_loop.$(OBJEXT) -test_cycles_per_loop_OBJECTS = $(am_test_cycles_per_loop_OBJECTS) -test_cycles_per_loop_LDADD = $(LDADD) +am_test_barrier_OBJECTS = test_barrier.$(OBJEXT) +test_barrier_OBJECTS = $(am_test_barrier_OBJECTS) +test_barrier_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = +am_test_cycles_per_loop_OBJECTS = test_cycles_per_loop.$(OBJEXT) +test_cycles_per_loop_OBJECTS = $(am_test_cycles_per_loop_OBJECTS) +test_cycles_per_loop_LDADD = $(LDADD) am_test_looplen_OBJECTS = test_looplen.$(OBJEXT) \ common-states.$(OBJEXT) test_looplen_OBJECTS = $(am_test_looplen_OBJECTS) @@ -172,6 +176,9 @@ common-states.$(OBJEXT) test_rwlock_timing_OBJECTS = $(am_test_rwlock_timing_OBJECTS) test_rwlock_timing_DEPENDENCIES = $(URCU_LIB) +am_test_uatomic_OBJECTS = test_uatomic.$(OBJEXT) +test_uatomic_OBJECTS = $(am_test_uatomic_OBJECTS) +test_uatomic_LDADD = $(LDADD) am_test_urcu_OBJECTS = test_urcu.$(OBJEXT) common-states.$(OBJEXT) test_urcu_OBJECTS = $(am_test_urcu_OBJECTS) test_urcu_DEPENDENCIES = $(URCU_LIB) @@ -400,12 +407,14 @@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/common-states.Po \ + ./$(DEPDIR)/test_barrier.Po \ ./$(DEPDIR)/test_cycles_per_loop.Po \ ./$(DEPDIR)/test_looplen.Po ./$(DEPDIR)/test_mutex.Po \ ./$(DEPDIR)/test_perthreadlock.Po \ ./$(DEPDIR)/test_perthreadlock_timing.Po \ ./$(DEPDIR)/test_rwlock.Po ./$(DEPDIR)/test_rwlock_timing.Po \ - ./$(DEPDIR)/test_urcu.Po ./$(DEPDIR)/test_urcu_assign.Po \ + ./$(DEPDIR)/test_uatomic.Po ./$(DEPDIR)/test_urcu.Po \ + ./$(DEPDIR)/test_urcu_assign.Po \ ./$(DEPDIR)/test_urcu_assign_dynamic_link-common-states.Po \ ./$(DEPDIR)/test_urcu_assign_dynamic_link-test_urcu_assign.Po \ ./$(DEPDIR)/test_urcu_bp.Po \ @@ -473,11 +482,12 @@ am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(test_cycles_per_loop_SOURCES) $(test_looplen_SOURCES) \ - $(test_mutex_SOURCES) $(test_perthreadlock_SOURCES) \ +SOURCES = $(test_barrier_SOURCES) $(test_cycles_per_loop_SOURCES) \ + $(test_looplen_SOURCES) $(test_mutex_SOURCES) \ + $(test_perthreadlock_SOURCES) \ $(test_perthreadlock_timing_SOURCES) $(test_rwlock_SOURCES) \ - $(test_rwlock_timing_SOURCES) $(test_urcu_SOURCES) \ - $(test_urcu_assign_SOURCES) \ + $(test_rwlock_timing_SOURCES) $(test_uatomic_SOURCES) \ + $(test_urcu_SOURCES) $(test_urcu_assign_SOURCES) \ $(test_urcu_assign_dynamic_link_SOURCES) \ $(test_urcu_bp_SOURCES) $(test_urcu_bp_dynamic_link_SOURCES) \ $(test_urcu_defer_SOURCES) $(test_urcu_dynamic_link_SOURCES) \ @@ -495,11 +505,12 @@ $(test_urcu_wfq_SOURCES) $(test_urcu_wfq_dynlink_SOURCES) \ $(test_urcu_wfs_SOURCES) $(test_urcu_wfs_dynlink_SOURCES) \ $(test_urcu_yield_SOURCES) -DIST_SOURCES = $(test_cycles_per_loop_SOURCES) $(test_looplen_SOURCES) \ - $(test_mutex_SOURCES) $(test_perthreadlock_SOURCES) \ +DIST_SOURCES = $(test_barrier_SOURCES) $(test_cycles_per_loop_SOURCES) \ + $(test_looplen_SOURCES) $(test_mutex_SOURCES) \ + $(test_perthreadlock_SOURCES) \ $(test_perthreadlock_timing_SOURCES) $(test_rwlock_SOURCES) \ - $(test_rwlock_timing_SOURCES) $(test_urcu_SOURCES) \ - $(test_urcu_assign_SOURCES) \ + $(test_rwlock_timing_SOURCES) $(test_uatomic_SOURCES) \ + $(test_urcu_SOURCES) $(test_urcu_assign_SOURCES) \ $(test_urcu_assign_dynamic_link_SOURCES) \ $(test_urcu_bp_SOURCES) $(test_urcu_bp_dynamic_link_SOURCES) \ $(test_urcu_defer_SOURCES) $(test_urcu_dynamic_link_SOURCES) \ @@ -927,6 +938,8 @@ URCU_BP_LIB = $(top_builddir)/src/liburcu-bp.la URCU_CDS_LIB = $(top_builddir)/src/liburcu-cds.la DEBUG_YIELD_LIB = $(builddir)/../common/libdebug-yield.la +test_uatomic_SOURCES = test_uatomic.c +test_barrier_SOURCES = test_barrier.c test_urcu_SOURCES = test_urcu.c common-states.c test_urcu_LDADD = $(URCU_LIB) test_urcu_dynamic_link_SOURCES = test_urcu.c common-states.c @@ -1067,6 +1080,10 @@ echo " rm -f" $$list; \ rm -f $$list +test_barrier$(EXEEXT): $(test_barrier_OBJECTS) $(test_barrier_DEPENDENCIES) $(EXTRA_test_barrier_DEPENDENCIES) + @rm -f test_barrier$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_barrier_OBJECTS) $(test_barrier_LDADD) $(LIBS) + test_cycles_per_loop$(EXEEXT): $(test_cycles_per_loop_OBJECTS) $(test_cycles_per_loop_DEPENDENCIES) $(EXTRA_test_cycles_per_loop_DEPENDENCIES) @rm -f test_cycles_per_loop$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_cycles_per_loop_OBJECTS) $(test_cycles_per_loop_LDADD) $(LIBS) @@ -1095,6 +1112,10 @@ @rm -f test_rwlock_timing$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_rwlock_timing_OBJECTS) $(test_rwlock_timing_LDADD) $(LIBS) +test_uatomic$(EXEEXT): $(test_uatomic_OBJECTS) $(test_uatomic_DEPENDENCIES) $(EXTRA_test_uatomic_DEPENDENCIES) + @rm -f test_uatomic$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_uatomic_OBJECTS) $(test_uatomic_LDADD) $(LIBS) + test_urcu$(EXEEXT): $(test_urcu_OBJECTS) $(test_urcu_DEPENDENCIES) $(EXTRA_test_urcu_DEPENDENCIES) @rm -f test_urcu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_urcu_OBJECTS) $(test_urcu_LDADD) $(LIBS) @@ -1230,6 +1251,7 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common-states.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_barrier.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cycles_per_loop.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_looplen.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mutex.Po@am__quote@ # am--include-marker @@ -1237,6 +1259,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_perthreadlock_timing.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rwlock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rwlock_timing.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_uatomic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_urcu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_urcu_assign.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_urcu_assign_dynamic_link-common-states.Po@am__quote@ # am--include-marker @@ -2111,6 +2134,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/common-states.Po + -rm -f ./$(DEPDIR)/test_barrier.Po -rm -f ./$(DEPDIR)/test_cycles_per_loop.Po -rm -f ./$(DEPDIR)/test_looplen.Po -rm -f ./$(DEPDIR)/test_mutex.Po @@ -2118,6 +2142,7 @@ -rm -f ./$(DEPDIR)/test_perthreadlock_timing.Po -rm -f ./$(DEPDIR)/test_rwlock.Po -rm -f ./$(DEPDIR)/test_rwlock_timing.Po + -rm -f ./$(DEPDIR)/test_uatomic.Po -rm -f ./$(DEPDIR)/test_urcu.Po -rm -f ./$(DEPDIR)/test_urcu_assign.Po -rm -f ./$(DEPDIR)/test_urcu_assign_dynamic_link-common-states.Po @@ -2215,6 +2240,7 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/common-states.Po + -rm -f ./$(DEPDIR)/test_barrier.Po -rm -f ./$(DEPDIR)/test_cycles_per_loop.Po -rm -f ./$(DEPDIR)/test_looplen.Po -rm -f ./$(DEPDIR)/test_mutex.Po @@ -2222,6 +2248,7 @@ -rm -f ./$(DEPDIR)/test_perthreadlock_timing.Po -rm -f ./$(DEPDIR)/test_rwlock.Po -rm -f ./$(DEPDIR)/test_rwlock_timing.Po + -rm -f ./$(DEPDIR)/test_uatomic.Po -rm -f ./$(DEPDIR)/test_urcu.Po -rm -f ./$(DEPDIR)/test_urcu_assign.Po -rm -f ./$(DEPDIR)/test_urcu_assign_dynamic_link-common-states.Po diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/tests/benchmark/test_barrier.c new/userspace-rcu-0.15.5/tests/benchmark/test_barrier.c --- old/userspace-rcu-0.15.3/tests/benchmark/test_barrier.c 1970-01-01 01:00:00.000000000 +0100 +++ new/userspace-rcu-0.15.5/tests/benchmark/test_barrier.c 2025-11-06 14:59:41.000000000 +0100 @@ -0,0 +1,66 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * SPDX-FileCopyrightText: 2025 Olivier Dion <[email protected]>. + * SPDX-FileCopyrightText: 2025 Mathieu Desnoyers <[email protected]> + * + * test_uatomic.c - Trivial micro-benchmark of the "cmm_" API memory barriers. + * + * The benchmark will print a summary like so: + * + * cmm_mb: 14.558424 + * cmm_smp_mb: 1.691178 + * cmm_rmb: 3.026440 + * cmm_smp_rmb: 0.256247 + * cmm_wmb: 0.244781 + * cmm_smp_wmb: 0.249728 + * + * The values are nanoseconds per operation. + */ + +#include <stdio.h> +#include <time.h> + +#include <urcu/uatomic.h> + +#define NSEC_PER_SEC 1000000000UL + +/* + * Average of 1 billion operations. + */ +#define LOOP_COUNT 1000000000UL + +static uint64_t gettime(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec; +} + +#define RUN_TEST(OP) \ + ({ \ + uint64_t then, now; \ + then = gettime(); \ + for (size_t k = 0; k < LOOP_COUNT; ++k) { \ + OP(); \ + } \ + now = gettime(); \ + printf("%s: %.6f\n", #OP, (now - then) / (double)LOOP_COUNT); \ + }) + +#define RUN_TESTS() \ + do { \ + RUN_TEST(cmm_mb); \ + RUN_TEST(cmm_smp_mb); \ + RUN_TEST(cmm_rmb); \ + RUN_TEST(cmm_smp_rmb); \ + RUN_TEST(cmm_wmb); \ + RUN_TEST(cmm_smp_wmb); \ + } while (0) + +int main(void) +{ + RUN_TESTS(); + + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/userspace-rcu-0.15.3/tests/benchmark/test_uatomic.c new/userspace-rcu-0.15.5/tests/benchmark/test_uatomic.c --- old/userspace-rcu-0.15.3/tests/benchmark/test_uatomic.c 1970-01-01 01:00:00.000000000 +0100 +++ new/userspace-rcu-0.15.5/tests/benchmark/test_uatomic.c 2025-11-06 14:59:41.000000000 +0100 @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * SPDX-FileCopyrightText: 2025 Olivier Dion <[email protected]>. + * + * test_uatomic.c - Trivial micro-benchmark of the uatomic API. + * + * The benchmark will print a summary like so: + * + * memory-order: CMM_RELAXED + * uatomic_load_mo: 0.119530 + * uatomic_store_mo: 0.129159 + * uatomic_xchg_mo: 1.832290 + * uatomic_cmpxchg_mo: 1.796460 + * memory-order: CMM_SEQ_CST + * uatomic_load_mo: 0.206869 + * uatomic_store_mo: 1.591636 + * uatomic_xchg_mo: 1.600575 + * uatomic_cmpxchg_mo: 1.800107 + * memory-order: CMM_SEQ_CST_FENCE + * uatomic_load_mo: 1.512201 + * uatomic_store_mo: 1.590643 + * uatomic_xchg_mo: 1.596536 + * uatomic_cmpxchg_mo: 1.801630 + * + * The values are nanoseconds per operation. + */ + +#include <stdio.h> +#include <time.h> + +#include <urcu/uatomic.h> + +#define NSEC_PER_SEC 1000000000UL + +/* + * Average of 1 billion operations. + */ +#define LOOP_COUNT 1000000000UL + +static uint64_t gettime(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec; +} + +#define RUN_TEST(OP, ...) \ + ({ \ + uint64_t then, now; \ + long value; \ + then = gettime(); \ + for (size_t k = 0; k < LOOP_COUNT; ++k) { \ + OP(&value, ##__VA_ARGS__); \ + } \ + now = gettime(); \ + printf("%s: %.6f\n", #OP, (now - then) / (double)LOOP_COUNT); \ + }) + +#define RUN_TESTS(MO) \ + do { \ + printf("memory-order: " #MO "\n"); \ + RUN_TEST(uatomic_load_mo, MO); \ + RUN_TEST(uatomic_store_mo, 0, MO); \ + RUN_TEST(uatomic_xchg_mo, 0, MO); \ + RUN_TEST(uatomic_cmpxchg_mo, 0, 0, MO, MO); \ + } while (0) + +int main(void) +{ + RUN_TESTS(CMM_RELAXED); + RUN_TESTS(CMM_SEQ_CST); + RUN_TESTS(CMM_SEQ_CST_FENCE); + + return 0; +}
