#21447 closed enhancement (fixed)

userspace-rcu-0.15.2 (liburcu)

Reported by: Bruce Dubbs Owned by: thomas
Priority: normal Milestone: 12.4
Component: BOOK Version: git
Severity: normal Keywords:
Cc:

Description

New point version.

Change History (2)

comment:1 by thomas, 10 months ago

Owner: changed from blfs-book to thomas
Status: newassigned

(https://lists.lttng.org/pipermail/lttng-dev/2025-April/030928.html)

This is a release announcement of Userspace RCU v0.15.2. The most noteworthy changes in this stable release are:

  • Tree-wide: Rename uatomic and CMM_*_SHARED callers to uatomic_load/uatomic_store

This change renames all the following callers to uatomic_load() (implicitly relaxed):

  • CMM_LOAD_SHARED(),
  • _CMM_LOAD_SHARED(),
  • uatomic_read(),
  • uatomic_load with explicit CMM_RELAXED.

It also renames all the following callers to uatomic_store() (implicitly relaxed):

  • CMM_STORE_SHARED(),
  • _CMM_STORE_SHARED(),
  • uatomic_set(),
  • uatomic_store with explicit CMM_RELAXED.

This will allow moving the CMM_{LOAD,STORE}_SHARED() API back to a volatile access, which is relevant in cases where it would be used on data type sizes not supported by C11 atomics.

  • Reintroduce read barrier depends in rcu_dereference on Alpha

for URCU_DEREFERENCE_USE_VOLATILE build.

  • Use uatomic_load CMM_RELAXED when building with URCU_DEREFERENCE_USE_VOLATILE

This makes URCU_DEREFERENCE_USE_VOLATILE mark the rcu_dereference memory read as atomic, which helps ThreadSanitizer not flag this as a data race.

  • Add cmm_annotate_mem_acquire() to URCU_DEREFERENCE_USE_VOLATILE rcu_dereference

This explicit dependency makes ThreadSanitizer understand the happen-before relationship implied by the rcu_dereference address dependency with URCU_DEREFERENCE_USE_VOLATILE.

  • Move back CMM_{LOAD,STORE}_SHARED to volatile access

The CMM_{LOAD,STORE}_SHARED() API is intended to be usable on types that are not necessarily supported by atomic operations on all platforms.

Move it back to a volatile access, all call sites both internal and in the public headers that required ThreadSanitizer support were moved to uatomic_load/store in 4d197dd19c44 ("Tree-wide: Rename to uatomic_load/uatomic_store").

  • Only define UATOMIC_HAS_ATOMIC_BYTE and UATOMIC_HAS_ATOMIC_SHORT when the

builtin atomics support those as lock-free atomics.

  • Introduce static size assertions for uatomic checks

Move away from linker tricks for validation of uatomic API usage, and use static assertions instead, which fails at compilation with a clearer error message, and does not depend on compiling the code with optimizations.

This introduces type size validation across the uatomic API, including loads and stores, thus preventing the need to link against libatomic for atomic builtin operations performed on types which are not lock-free on the architecture.

  • Introduce UATOMIC_HAS_ATOMIC_INT/LLONG macros for various architectures.

liburcu is a LGPLv2.1 userspace RCU (read-copy-update) library. This data synchronization library provides read-side access which scales linearly with the number of cores. It does so by allowing multiple copies of a given data structure to live at the same time, and by monitoring the data structure accesses to detect grace periods after which memory reclamation is possible.

liburcu-cds provides efficient data structures based on RCU and lock-free algorithms. Those structures include hash tables, queues, stacks, and doubly-linked lists.

Changelog:

2025-04-14 Userspace RCU 0.15.2

  • fix: atomic_always_lock_free() not a constant expression on g++ < 5.1
  • fix: urcu assert fallback for pre-C11 builds
  • doc: update uatomic-api for static assert
  • Add uatomic size static assert for 's390'
  • Add uatomic size static assert for 'sparc64'
  • Add uatomic size static assert for 'ppc'
  • Add uatomic size static assert for 'x86'
  • Add uatomic size static assert for 'generic'
  • Add uatomic size static assert
  • Use UATOMIC_HAS_ATOMIC_INT/LLONG in generic implementation
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for x86
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for tile
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for sparc64
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for s390
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for riscv
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for ppc
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for nios2
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for mips
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for m68k
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for loongarch
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for ia64
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for hppa
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for 'gcc' arch
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for arm
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for alpha
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for aarch64
  • Add UATOMIC_HAS_ATOMIC_INT/LLONG for atomic builtins
  • Add builtin atomics size static asserts
  • cleanup: use URCU_GCC_VERSION from compiler.h
  • fix: atomic builtins defines for type support
  • Move back CMM_LOAD/STORE_SHARED to volatile access
  • Add cmm_annotate_mem_acquire() to URCU_DEREFERENCE_USE_VOLATILE rcu_dereference
  • Use uatomic_load CMM_RELAXED in URCU_DEREFERENCE_USE_VOLATILE
  • Fix: Re-introduce URCU_DEREFERENCE_USE_VOLATILE read barrier depends for alpha
  • Tree-wide: Rename to uatomic_load/uatomic_store
  • src: Use * for attribute names
  • API: Use * for attribute names
  • Fix Changelog 0.15.1 date

comment:2 by thomas, 10 months ago

Resolution: fixed
Status: assignedclosed

Fixed in [19af0b34e2]

Note: See TracTickets for help on using tickets.