This commit completes removal of the urcu-signal flavor.
Users can migrate to liburcu-memb with a kernel implementing the
membarrier(2) system call to have similar read-side performance without
requiring use of a reserved signal, and with improved grace period
performance.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I75b9171e705b9b2ef4c8eeabe6164e5587816fb4
- `memb`,
- `qsbr`,
- `mb`,
- - `signal`,
- `bp`.
The API members start with the prefix `urcu_<flavor>_`, where
results in slower reads.
-### Usage of `liburcu-signal`
-
- 1. `#include <urcu/urcu-signal.h>`
- 2. Link the application with `-lurcu-signal`
-
-NOTE: The `liburcu-signal` flavor is *deprecated* and will be removed in the
-future. It is now identical to `liburcu-mb` at the exception of the symbols and
-public header files. It is therefore slower than previous versions. Users are
-encouraged to migrate to the `liburcu-memb` flavor.
-
### Usage of `liburcu-bp`
1. `#include <urcu/urcu-bp.h>`
### Usage of `liburcu-defer`
- Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
- `liburcu-mb`, `liburcu-signal`, or `liburcu-bp` above.
+ `liburcu-mb`, or `liburcu-bp` above.
The `liburcu-defer` functionality is pulled into each of
those library modules.
- Provides `urcu_<flavor>_defer_rcu()` primitive to enqueue delayed
### Usage of `urcu-call-rcu`
- Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
- `liburcu-mb`, `liburcu-signal`, or `liburcu-bp` above.
+ `liburcu-mb`, or `liburcu-bp` above.
The `urcu-call-rcu` functionality is pulled into each of
those library modules.
- Provides the `urcu_<flavor>_call_rcu()` primitive to enqueue delayed
### Being careful with signals
-The `liburcu-signal` library uses signals internally. The signal handler is
-registered with the `SA_RESTART` flag. However, these signals may cause
-some non-restartable system calls to fail with `errno = EINTR`. Care
-should be taken to restart system calls manually if they fail with this
-error. A list of non-restartable system calls may be found in
-`signal(7)`.
-
Read-side critical sections are allowed in a signal handler,
except those setup with `sigaltstack(2)`, with `liburcu-memb` and
`liburcu-mb`. Be careful, however, to disable these signals
src/liburcu-qsbr.pc
src/liburcu-mb.pc
src/liburcu-memb.pc
- src/liburcu-signal.pc
])
AC_CONFIG_FILES([tests/utils/env.sh],[chmod +x tests/utils/env.sh])
urcu/map/urcu-mb.h \
urcu/map/urcu-memb.h \
urcu/map/urcu-qsbr.h \
- urcu/map/urcu-signal.h \
urcu/pointer.h \
urcu/rcuhlist.h \
urcu/rculfhash.h \
urcu/static/urcu-mb.h \
urcu/static/urcu-memb.h \
urcu/static/urcu-qsbr.h \
- urcu/static/urcu-signal.h \
- urcu/static/urcu-signal-nr.h \
urcu/static/wfcqueue.h \
urcu/static/wfqueue.h \
urcu/static/wfstack.h \
urcu/urcu-memb.h \
urcu/urcu-qsbr.h \
urcu/urcu_ref.h \
- urcu/urcu-signal.h \
urcu/wfcqueue.h \
urcu/wfqueue.h \
urcu/wfstack.h \
+++ /dev/null
-// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
-// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-//
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-/*
- * Userspace RCU header -- name mapping to allow multiple flavors to be
- * used in the same executable.
- *
- * LGPL-compatible code should include this header with :
- *
- * #define _LGPL_SOURCE
- * #include <urcu.h>
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#define rcu_read_lock urcu_signal_read_lock
-#define _rcu_read_lock _urcu_signal_read_lock
-#define rcu_read_unlock urcu_signal_read_unlock
-#define _rcu_read_unlock _urcu_signal_read_unlock
-#define rcu_read_ongoing urcu_signal_read_ongoing
-#define _rcu_read_ongoing _urcu_signal_read_ongoing
-#define rcu_quiescent_state urcu_signal_quiescent_state
-#define _rcu_quiescent_state _urcu_signal_quiescent_state
-#define rcu_thread_offline urcu_signal_thread_offline
-#define rcu_thread_online urcu_signal_thread_online
-#define rcu_register_thread urcu_signal_register_thread
-#define rcu_unregister_thread urcu_signal_unregister_thread
-#define rcu_init urcu_signal_init
-#define rcu_exit urcu_signal_exit
-#define synchronize_rcu urcu_signal_synchronize_rcu
-#define rcu_reader urcu_signal_reader
-#define rcu_gp urcu_signal_gp
-
-#define get_cpu_call_rcu_data urcu_signal_get_cpu_call_rcu_data
-#define get_call_rcu_thread urcu_signal_get_call_rcu_thread
-#define create_call_rcu_data urcu_signal_create_call_rcu_data
-#define set_cpu_call_rcu_data urcu_signal_set_cpu_call_rcu_data
-#define get_default_call_rcu_data urcu_signal_get_default_call_rcu_data
-#define get_call_rcu_data urcu_signal_get_call_rcu_data
-#define get_thread_call_rcu_data urcu_signal_get_thread_call_rcu_data
-#define set_thread_call_rcu_data urcu_signal_set_thread_call_rcu_data
-#define create_all_cpu_call_rcu_data urcu_signal_create_all_cpu_call_rcu_data
-#define free_all_cpu_call_rcu_data urcu_signal_free_all_cpu_call_rcu_data
-#define call_rcu urcu_signal_call_rcu
-#define call_rcu_data_free urcu_signal_call_rcu_data_free
-#define call_rcu_before_fork urcu_signal_call_rcu_before_fork
-#define call_rcu_after_fork_parent urcu_signal_call_rcu_after_fork_parent
-#define call_rcu_after_fork_child urcu_signal_call_rcu_after_fork_child
-#define rcu_barrier urcu_signal_barrier
-
-#define defer_rcu urcu_signal_defer_rcu
-#define rcu_defer_register_thread urcu_signal_defer_register_thread
-#define rcu_defer_unregister_thread urcu_signal_defer_unregister_thread
-#define rcu_defer_barrier urcu_signal_defer_barrier
-#define rcu_defer_barrier_thread urcu_signal_defer_barrier_thread
-#define rcu_defer_exit urcu_signal_defer_exit
-
-#define rcu_flavor urcu_signal_flavor
-
-#define urcu_register_rculfhash_atfork \
- urcu_signal_register_rculfhash_atfork
-#define urcu_unregister_rculfhash_atfork \
- urcu_signal_unregister_rculfhash_atfork
-
-#define start_poll_synchronize_rcu urcu_signal_start_poll_synchronize_rcu
-#define poll_state_synchronize_rcu urcu_signal_poll_state_synchronize_rcu
-
-
-/* Compat identifiers for prior undocumented multiflavor usage */
-#ifndef URCU_NO_COMPAT_IDENTIFIERS
-
-#define rcu_dereference_sig urcu_signal_dereference
-#define rcu_cmpxchg_pointer_sig urcu_signal_cmpxchg_pointer
-#define rcu_xchg_pointer_sig urcu_signal_xchg_pointer
-#define rcu_set_pointer_sig urcu_signal_set_pointer
-
-#define rcu_sig_before_fork urcu_signal_before_fork
-#define rcu_sig_after_fork_parent urcu_signal_after_fork_parent
-#define rcu_sig_after_fork_child urcu_signal_after_fork_child
-
-#define rcu_read_lock_sig urcu_signal_read_lock
-#define _rcu_read_lock_sig _urcu_signal_read_lock
-#define rcu_read_unlock_sig urcu_signal_read_unlock
-#define _rcu_read_unlock_sig _urcu_signal_read_unlock
-#define rcu_read_ongoing_sig urcu_signal_read_ongoing
-#define _rcu_read_ongoing_sig _urcu_signal_read_ongoing
-#define rcu_register_thread_sig urcu_signal_register_thread
-#define rcu_unregister_thread_sig urcu_signal_unregister_thread
-#define rcu_init_sig urcu_signal_init
-#define rcu_exit_sig urcu_signal_exit
-#define synchronize_rcu_sig urcu_signal_synchronize_rcu
-#define rcu_reader_sig urcu_signal_reader
-#define rcu_gp_sig urcu_signal_gp
-
-#define get_cpu_call_rcu_data_sig urcu_signal_get_cpu_call_rcu_data
-#define get_call_rcu_thread_sig urcu_signal_get_call_rcu_thread
-#define create_call_rcu_data_sig urcu_signal_create_call_rcu_data
-#define set_cpu_call_rcu_data_sig urcu_signal_set_cpu_call_rcu_data
-#define get_default_call_rcu_data_sig urcu_signal_get_default_call_rcu_data
-#define get_call_rcu_data_sig urcu_signal_get_call_rcu_data
-#define get_thread_call_rcu_data_sig urcu_signal_get_thread_call_rcu_data
-#define set_thread_call_rcu_data_sig urcu_signal_set_thread_call_rcu_data
-#define create_all_cpu_call_rcu_data_sig \
- urcu_signal_create_all_cpu_call_rcu_data
-#define free_all_cpu_call_rcu_data_sig urcu_signal_free_all_cpu_call_rcu_data
-#define call_rcu_sig urcu_signal_call_rcu
-#define call_rcu_data_free_sig urcu_signal_call_rcu_data_free
-#define call_rcu_before_fork_sig \
- urcu_signal_call_rcu_before_fork
-#define call_rcu_after_fork_parent_sig urcu_signal_call_rcu_after_fork_parent
-#define call_rcu_after_fork_child_sig urcu_signal_call_rcu_after_fork_child
-#define rcu_barrier_sig urcu_signal_barrier
-
-#define defer_rcu_sig urcu_signal_defer_rcu
-#define rcu_defer_register_thread_sig urcu_signal_defer_register_thread
-#define rcu_defer_unregister_thread_sig urcu_signal_defer_unregister_thread
-#define rcu_defer_barrier_sig urcu_signal_defer_barrier
-#define rcu_defer_barrier_thread_sig urcu_signal_defer_barrier_thread
-#define rcu_defer_exit_sig urcu_signal_defer_exit
-
-#define rcu_flavor_sig urcu_signal_flavor
-
-#define urcu_register_rculfhash_atfork_sig \
- urcu_signal_register_rculfhash_atfork
-#define urcu_unregister_rculfhash_atfork_sig \
- urcu_signal_unregister_rculfhash_atfork
-
-#endif /* URCU_NO_COMPAT_IDENTIFIERS */
#ifdef RCU_MEMBARRIER
#include <urcu/map/urcu-memb.h>
-#elif defined(RCU_SIGNAL)
-#include <urcu/map/urcu-signal.h>
#elif defined(RCU_MB)
#include <urcu/map/urcu-mb.h>
#else
+++ /dev/null
-// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
-//
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#ifndef _STATIC_URCU_SIGNAL_NR_H
-#define _STATIC_URCU_SIGNAL_NR_H
-
-/*
- * Userspace RCU header.
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-/*
- * The signal number used by the RCU library can be overridden with
- * -DSIGRCU= when compiling the library.
- * Provide backward compatibility for liburcu 0.3.x SIGURCU.
- */
-#ifdef SIGURCU
-#define SIGRCU SIGURCU
-#endif
-
-#ifndef SIGRCU
-#define SIGRCU SIGUSR1
-#endif
-
-#endif /* _STATIC_URCU_SIGNAL_NR_H */
+++ /dev/null
-// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
-//
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#ifndef _URCU_SIGNAL_STATIC_H
-#define _URCU_SIGNAL_STATIC_H
-
-/*
- * Userspace RCU header.
- *
- * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
- * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdint.h>
-
-#include <urcu/debug.h>
-#include <urcu/config.h>
-#include <urcu/compiler.h>
-#include <urcu/arch.h>
-#include <urcu/system.h>
-#include <urcu/uatomic.h>
-#include <urcu/list.h>
-#include <urcu/futex.h>
-#include <urcu/tls-compat.h>
-#include <urcu/static/urcu-common.h>
-#include <urcu/static/urcu-signal-nr.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This code section can only be included in LGPL 2.1 compatible source code.
- * See below for the function call wrappers which can be used in code meant to
- * be only linked with the Userspace RCU library. This comes with a small
- * performance degradation on the read-side due to the added function calls.
- * This is required to permit relinking with newer versions of the library.
- */
-
-extern struct urcu_gp urcu_signal_gp;
-
-extern DECLARE_URCU_TLS(struct urcu_reader, urcu_signal_reader);
-
-/*
- * Helper for _rcu_read_lock(). The format of urcu_signal_gp.ctr (as well as
- * the per-thread rcu_reader.ctr) has the lower-order bits containing a count of
- * _rcu_read_lock() nesting, and a single high-order URCU_BP_GP_CTR_PHASE bit
- * that contains either zero or one. The cmm_barrier() ensures that the accesses in
- * _rcu_read_lock() happen before the subsequent read-side critical section.
- */
-static inline void _urcu_signal_read_lock_update(unsigned long tmp)
-{
- if (caa_likely(!(tmp & URCU_GP_CTR_NEST_MASK))) {
- _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, _CMM_LOAD_SHARED(urcu_signal_gp.ctr));
- cmm_smp_mb();
- } else
- _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp + URCU_GP_COUNT);
-}
-
-/*
- * Enter an RCU read-side critical section.
- *
- * The first cmm_barrier() call ensures that the compiler does not reorder
- * the body of _rcu_read_lock() with a mutex.
- *
- * This function and its helper are both less than 10 lines long. The
- * intent is that this function meets the 10-line criterion in LGPL,
- * allowing this function to be invoked directly from non-LGPL code.
- */
-static inline void _urcu_signal_read_lock(void)
-{
- unsigned long tmp;
-
- urcu_assert_debug(URCU_TLS(urcu_signal_reader).registered);
- cmm_barrier();
- tmp = URCU_TLS(urcu_signal_reader).ctr;
- urcu_assert_debug((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
- _urcu_signal_read_lock_update(tmp);
-}
-
-/*
- * This is a helper function for _rcu_read_unlock().
- *
- * The first cmm_barrier() call ensures that the critical section is
- * seen to precede the store to rcu_reader.ctr.
- * The second cmm_barrier() call ensures that we write to rcu_reader.ctr
- * before reading the update-side futex.
- */
-static inline void _urcu_signal_read_unlock_update_and_wakeup(unsigned long tmp)
-{
- unsigned long *ctr = &URCU_TLS(urcu_signal_reader).ctr;
-
- if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
- uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_SEQ_CST);
- urcu_common_wake_up_gp(&urcu_signal_gp);
- } else {
- uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED);
- }
-}
-
-/*
- * Exit an RCU read-side critical section. Both this function and its
- * helper are smaller than 10 lines of code, and are intended to be
- * usable by non-LGPL code, as called out in LGPL.
- */
-static inline void _urcu_signal_read_unlock(void)
-{
- unsigned long tmp;
-
- urcu_assert_debug(URCU_TLS(urcu_signal_reader).registered);
- tmp = URCU_TLS(urcu_signal_reader).ctr;
- urcu_assert_debug(tmp & URCU_GP_CTR_NEST_MASK);
- _urcu_signal_read_unlock_update_and_wakeup(tmp);
- cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
-}
-
-/*
- * Returns whether within a RCU read-side critical section.
- *
- * This function is less than 10 lines long. The intent is that this
- * function meets the 10-line criterion for LGPL, allowing this function
- * to be invoked directly from non-LGPL code.
- */
-static inline int _urcu_signal_read_ongoing(void)
-{
- return URCU_TLS(urcu_signal_reader).ctr & URCU_GP_CTR_NEST_MASK;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _URCU_SIGNAL_STATIC_H */
*/
/* Default is RCU_MEMBARRIER */
-#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB) && !defined(RCU_SIGNAL)
+#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB)
#define RCU_MEMBARRIER
#endif
#include <urcu/static/urcu-mb.h>
#endif
-#ifdef RCU_SIGNAL
-#include <urcu/static/urcu-signal.h>
-#endif
-
#endif /* _URCU_STATIC_H */
+++ /dev/null
-// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
-//
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#ifndef _URCU_SIGNAL_H
-#define _URCU_SIGNAL_H
-
-/*
- * Userspace RCU header
- *
- * LGPL-compatible code should include this header with :
- *
- * #define _LGPL_SOURCE
- * #include <urcu.h>
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#include <stdlib.h>
-#include <pthread.h>
-#include <stdbool.h>
-
-/*
- * See urcu/pointer.h and urcu/static/pointer.h for pointer
- * publication headers.
- */
-#include <urcu/pointer.h>
-#include <urcu/urcu-poll.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <urcu/map/urcu-signal.h>
-
-/*
- * Important !
- *
- * Each thread containing read-side critical sections must be registered
- * with rcu_register_thread_mb() before calling rcu_read_lock_mb().
- * rcu_unregister_thread_mb() should be called before the thread exits.
- */
-
-#ifdef _LGPL_SOURCE
-
-#include <urcu/static/urcu-signal.h>
-
-/*
- * Mappings for static use of the userspace RCU library.
- * Should only be used in LGPL-compatible code.
- */
-
-/*
- * rcu_read_lock()
- * rcu_read_unlock()
- *
- * Mark the beginning and end of a read-side critical section.
- * DON'T FORGET TO USE RCU_REGISTER/UNREGISTER_THREAD() FOR EACH THREAD WITH
- * READ-SIDE CRITICAL SECTION.
- */
-#define urcu_signal_read_lock _urcu_signal_read_lock
-#define urcu_signal_read_unlock _urcu_signal_read_unlock
-#define urcu_signal_read_ongoing _urcu_signal_read_ongoing
-
-#else /* !_LGPL_SOURCE */
-
-/*
- * library wrappers to be used by non-LGPL compatible source code.
- * See LGPL-only urcu/static/pointer.h for documentation.
- */
-
-extern void urcu_signal_read_lock(void);
-extern void urcu_signal_read_unlock(void);
-extern int urcu_signal_read_ongoing(void);
-
-#endif /* !_LGPL_SOURCE */
-
-extern void urcu_signal_synchronize_rcu(void);
-
-/*
- * RCU grace period polling API.
- */
-extern struct urcu_gp_poll_state urcu_signal_start_poll_synchronize_rcu(void);
-extern bool urcu_signal_poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
-
-/*
- * Reader thread registration.
- */
-extern void urcu_signal_register_thread(void);
-extern void urcu_signal_unregister_thread(void);
-
-/*
- * Explicit rcu initialization, for "early" use within library constructors.
- */
-extern void urcu_signal_init(void);
-
-/*
- * Q.S. reporting are no-ops for these URCU flavors.
- */
-static inline void urcu_signal_quiescent_state(void)
-{
-}
-
-static inline void urcu_signal_thread_offline(void)
-{
-}
-
-static inline void urcu_signal_thread_online(void)
-{
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#include <urcu/call-rcu.h>
-#include <urcu/defer.h>
-#include <urcu/flavor.h>
-
-#ifndef URCU_API_MAP
-#include <urcu/map/clear.h>
-#endif
-
-#endif /* _URCU_SIGNAL_H */
* IBM's contributions to this file may be relicensed under LGPLv2 or later.
*/
-#if !defined(RCU_MEMBARRIER) && !defined(RCU_SIGNAL) && !defined(RCU_MB)
+#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB)
#define RCU_MEMBARRIER
#endif
#ifdef RCU_MEMBARRIER
#include <urcu/urcu-memb.h>
-#elif defined(RCU_SIGNAL)
-#include <urcu/urcu-signal.h>
#elif defined(RCU_MB)
#include <urcu/urcu-mb.h>
#else
lib_LTLIBRARIES = liburcu-common.la \
liburcu.la liburcu-qsbr.la \
- liburcu-mb.la liburcu-signal.la liburcu-bp.la \
+ liburcu-mb.la liburcu-bp.la \
liburcu-memb.la liburcu-cds.la
#
liburcu_mb_la_CFLAGS = -DRCU_MB $(AM_CFLAGS)
liburcu_mb_la_LIBADD = liburcu-common.la
-liburcu_signal_la_SOURCES = urcu.c urcu-pointer.c $(COMPAT)
-liburcu_signal_la_CFLAGS = -DRCU_SIGNAL $(AM_CFLAGS)
-liburcu_signal_la_LIBADD = liburcu-common.la
-
liburcu_bp_la_SOURCES = urcu-bp.c urcu-pointer.c $(COMPAT)
liburcu_bp_la_LIBADD = liburcu-common.la
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = liburcu-cds.pc liburcu.pc liburcu-bp.pc liburcu-qsbr.pc \
- liburcu-signal.pc liburcu-mb.pc liburcu-memb.pc
+ liburcu-mb.pc liburcu-memb.pc
EXTRA_DIST = \
urcu-call-rcu-impl.h \
+++ /dev/null
-# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
-#
-# SPDX-License-Identifier: MIT
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Userspace RCU signal
-Description: A userspace RCU (read-copy-update) library, signal version
-Version: @PACKAGE_VERSION@
-Requires:
-Libs: -L${libdir} -lurcu-common -lurcu-signal
-Cflags: -I${includedir}
#include <urcu/uatomic.h>
#include <urcu/compiler.h>
#include <urcu/rculfhash.h>
-#include <urcu/static/urcu-signal-nr.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
void __attribute__((constructor)) rcu_init(void);
#endif
-#if defined(RCU_MB) || defined(RCU_SIGNAL)
+#if defined(RCU_MB)
void rcu_init(void)
{
}
}
#endif
-#if defined(RCU_MB) || defined(RCU_SIGNAL)
+#if defined(RCU_MB)
static void smp_mb_master(void)
{
cmm_smp_mb();