userspace-rcu.git
3 years agoconfigure: centralize version information
Michael Jeanson [Thu, 18 Mar 2021 21:41:51 +0000 (17:41 -0400)] 
configure: centralize version information

Centralise version information at the beginning of configure.ac to
improve readability.

This is part of an effort to standardise our autotools setup across
project to simplify maintenance.

Change-Id: I394c706f71885dbc6ad22f6d315d48702825fd81
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
3 years agofix: exclude clang from GCC version blacklists
Michael Jeanson [Mon, 25 Jan 2021 18:36:24 +0000 (13:36 -0500)] 
fix: exclude clang from GCC version blacklists

URCU_GCC_VERSION is used to blacklist specific GCC versions with known
bugs, clang also defines these macros to an equivalent GCC version it
claims to support, so exclude it.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Idf0980fddca6533313a3367601ddda8d8e13bfdf

3 years agoaarch64: blacklist gcc prior to 5.1
Mathieu Desnoyers [Fri, 22 Jan 2021 20:27:35 +0000 (15:27 -0500)] 
aarch64: blacklist gcc prior to 5.1

Linux aarch64 requires GCC 5.1 or better because prior versions perform
unsafe access to deallocated stack.

Some Linux distributions may have backported the fix, but it was never
released into earlier upstream gcc versions.

Link: https://lwn.net/Articles/842122/
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
3 years agoFix: configure: support Autoconf 2.70
Jérémie Galarneau [Mon, 11 Jan 2021 21:49:22 +0000 (16:49 -0500)] 
Fix: configure: support Autoconf 2.70

The newly-released autoconf 2.70 introduces a number of breaking
changes [1] and is being rolled-out by some distros.

Amongst those changes, the AC_PROG_CC_STDC macro is marked as obsolete
and was merged into AC_PROG_CC, which we already use. On 2.70, this
results in a warning which we handle as an error.

A version check is added to invoke the AC_PROG_CC_STDC macro only when
running a pre-2.70 version of autoconf, fixing the issue.

Also, the AX_PTHREAD macro makes use of the $as_echo built-in shell
variable which no longer exists in 2.70. A patch was submitted to the
GNU Autoconf archive in March, but there have been no signs of life
given since then [2].

As such, our local copy is updated to the latest version and the patch
(which looks fairly straight-forward / safe) is applied. This should
minimize changes once we go back to an "official" version of the macro.

[1] https://lwn.net/Articles/839395/
[2] https://savannah.gnu.org/patch/?9906

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Id57ad87e63c2d398e3d8b81129f9b867b878e01f

3 years agoDon't force a target and optimization level on ARMv7
Michael Jeanson [Fri, 11 Dec 2020 18:52:10 +0000 (13:52 -0500)] 
Don't force a target and optimization level on ARMv7

We shouldn't force a specific target cpu for the compiler on ARMv7 but
let the system or the user choose it. If some of our code depends on a
specific target CPU features, it should be compile tested.

Also remove the default optimisation level of O1, it's potentially a
workaround to an early armv7 compiler performance problem and anyway
most builds will have an optimisation level flag set in the CFLAGS which
will override this one.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Acked-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I1d1bb5cc0fa0be8f8b1d6a9ad7bf063809be1aef

3 years agoUse DMB only on ARMv7
Michael Jeanson [Thu, 10 Dec 2020 21:52:30 +0000 (16:52 -0500)] 
Use DMB only on ARMv7

Remove the configure time CONFIG_RCU_ARM_HAVE_DMB option and replace it
by compile time detection based on the ARM ISA version. This makes sure
we unconditionnaly use the DMB instruction only on ARMv7 where it's part
of the baseline ISA.

This will change the behavior on ARMv6 platform that possibly have this
instruction but it was probably already broken since we use the 'ISH'
option which doesn't seem to be valid on this ISA.

This will also allow sharing headers in a multi-arch environment and
reduce the build system complexity.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Cc: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I8e56ada55148d8e0f198c3d2e741ea414de5fef2

3 years agoBlacklist GCC 4.4.0, 4.4.1 and 4.4.2 on ARM
Michael Jeanson [Fri, 11 Dec 2020 22:22:23 +0000 (17:22 -0500)] 
Blacklist GCC 4.4.0, 4.4.1 and 4.4.2 on ARM

GCC added __sync_synchronize() in 4.4.0 but it was broken on ARM until
4.4.3, see the GCC bug report for more details :

  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42263

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I629e3c8b4baaccb34b2311e220f30d0ad8b69a19

3 years agoCleanup: Move ARM specific code to urcu/arch/arm.h
Michael Jeanson [Fri, 11 Dec 2020 21:59:56 +0000 (16:59 -0500)] 
Cleanup: Move ARM specific code to urcu/arch/arm.h

Change-Id: I3e17308c5ae985789a2ac8361e9c9e958ff7d656
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
3 years agofix: bump tests thread limit to 4096
Michael Jeanson [Wed, 9 Dec 2020 17:05:31 +0000 (12:05 -0500)] 
fix: bump tests thread limit to 4096

Machines with more than 128 CPUs are becomming more common. A
future-proof fix here would be to dynamically allocate the array, but in
the meantime bump the limit to 4096 to fix the problem on a 160 CPUs
ppc64el system where this was reported.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Cc: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ib3cb5d8cb4515e6f626be33c2685fa38cb081782

3 years agofix: reorder x86 arch detection
Michael Jeanson [Wed, 2 Dec 2020 17:31:46 +0000 (17:31 +0000)] 
fix: reorder x86 arch detection

Reorder the detection code from most specific to most generic as defines
for i386 can be present even when building for i686.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I81531b05318a0eaa9984075311828d87be7d46fc

3 years agofix: typo in futex syscall define check
Michael Jeanson [Mon, 30 Nov 2020 16:39:38 +0000 (11:39 -0500)] 
fix: typo in futex syscall define check

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I59a654e381f3ad236a6d25c67316d04c84ddcded

4 years agoCompile time futex syscall detection
Michael Jeanson [Tue, 17 Nov 2020 23:28:20 +0000 (18:28 -0500)] 
Compile time futex syscall detection

The futex syscall availability is detected at configure time using a
simple compile test. Replace this with compile time detection using the
same test. This would allow sharing headers in a multi-arch environment
and reduce the build system complexity.

Change-Id: Ief709429e8908d0fd2d268d42f4a89d9fc14b91b
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoStatic arch and uatomic headers
Michael Jeanson [Tue, 17 Nov 2020 23:08:49 +0000 (18:08 -0500)] 
Static arch and uatomic headers

Replace the somewhat hackish symlinking of architecture specific headers
at configure time with compile time detection using compiler defines.
This would allow sharing headers in a multi-arch environment and reduce
the build system complexity.

Change-Id: I4900a18dab70bb0e51d1a8500581a445acd44cdf
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoAdd git-review config
Michael Jeanson [Thu, 19 Nov 2020 16:43:54 +0000 (11:43 -0500)] 
Add git-review config

Add .gitreview for contributors wishing to use gerrit for patch
reviews.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Change-Id: I7868b3fc3162246298f24bd90ac1a3bcf6083eb6
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agocleanup: Improve wording of CONFIG_RCU_DEBUG description
Michael Jeanson [Tue, 17 Nov 2020 20:22:46 +0000 (15:22 -0500)] 
cleanup: Improve wording of CONFIG_RCU_DEBUG description

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agofix: explicitly include urcu/config.h in files using CONFIG_RCU_ defines
Michael Jeanson [Tue, 17 Nov 2020 20:22:24 +0000 (15:22 -0500)] 
fix: explicitly include urcu/config.h in files using CONFIG_RCU_ defines

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix typo in README.md
Shuo Wang [Mon, 16 Nov 2020 12:24:46 +0000 (20:24 +0800)] 
Fix typo in README.md

Signed-off-by: Shuo Wang <wangshuo47@huawei.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agofix: add -lurcu-common to pkg-config libs for each flavor
Michael Jeanson [Fri, 30 Oct 2020 19:39:56 +0000 (15:39 -0400)] 
fix: add -lurcu-common to pkg-config libs for each flavor

The urcu-common library contains common code like the write-free queue
and compat code, each urcu flavor library is dynamicly linked with it.

Most but not all toolchains will automatically link an executable with a
transitive depency of an explicitly linked library if said binary uses a
symbol from the transitive dependency.

Since this behavior is not present in all toolchains, add
'-lurcu-common' to the 'Libs' field of each flavors pkg-config file so
that executables using symbols from urcu-common can be reliably linked
using pkg-config.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agocall_rcu: Fix race between rcu_barrier() and call_rcu_data_free()
Paul E. McKenney [Thu, 22 Oct 2020 22:30:21 +0000 (15:30 -0700)] 
call_rcu: Fix race between rcu_barrier() and call_rcu_data_free()

The current code can lose RCU callbacks at shutdown time, which can
result in hangs.  This lossage can happen as follows:

o       A thread invokes call_rcu_data_free(), which executes up through
        the wake_call_rcu_thread().  At this point, the call_rcu_data
        structure has been drained of callbacks, but is still on the
        call_rcu_data_list.  Note that this thread does not hold the
        call_rcu_mutex.

o       Another thread invokes rcu_barrier(), which traverses the
        call_rcu_data_list under the protection of call_rcu_mutex,
        a list which still includes the above newly drained structure.
        This thread therefore adds a callback to the newly drained
        call_rcu_data structure.  It then releases call_rcu_mutex and
        enters a mystifying loop that does futex stuff.

o       The first thread finishes executing call_rcu_data_free(),
        which acquires call_rcu_mutex just long enough to remove the
        newly drained call_rcu_data structure from call_rcu_data_list.
        Which causes one of the rcu_barrier() invocation's callbacks to
        be leaked.

o       The second thread's rcu_barrier() invocation never returns
        resulting in a hang.

This commit therefore changes call_rcu_data_free() to acquire
call_rcu_mutex before checking the call_rcu_data structure for callbacks.
In the case where there are no callbacks, call_rcu_mutex is held across
both the check and the removal from call_rcu_data_list, thus preventing
rcu_barrier() from adding a callback in the meantime.  In the case where
there are callbacks, call_rcu_mutex must be momentarily dropped across
the call to get_default_call_rcu_data(), which can itself acquire
call_rcu_mutex.  This momentary drop is not a problem because any
callbacks that rcu_barrier() might queue during that period of time will
be moved to the default call_rcu_data structure, and the lock will be
held across the full time including moving those callbacks and removing
the call_rcu_data structure that was passed into call_rcu_data_free()
from call_rcu_data_list.

With this fix, a several-hundred-CPU test successfully completes more
than 5,000 executions.  Without this fix, it fails within a few tens
of executions.  Although the failures happen more quickly on larger
systems, in theory this could happen on a single-CPU system, courtesy
of preemption.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: <lttng-dev@lists.lttng.org>
Cc: <linux-kernel@vger.kernel.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoCleanup: tls-compat.h: add parentheses around expression (coding style)
Mathieu Desnoyers [Tue, 21 Apr 2020 13:59:00 +0000 (09:59 -0400)] 
Cleanup: tls-compat.h: add parentheses around expression (coding style)

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: tls-compat.h exposes compiler-dependent public configuration
Mathieu Desnoyers [Mon, 20 Apr 2020 15:30:49 +0000 (11:30 -0400)] 
Fix: tls-compat.h exposes compiler-dependent public configuration

Exposing the storage class chosen by ax_tls.m4 in a public header is
a bad idea, because if a recent gcc is used when configuring
liburcu, thus detecting C11, it will choose _Thread_local. Then, if an
external project uses urcu/tls-compat.h with an older gcc (e.g. 4.8),
it will fail to build, because that storage class is unknown, and
__thread should be used instead.

Therefore, use a preprocessor conditional on __cplusplus to detect C++11
(and use thread_local). Else, the STDC version is used to select
_Thread_local. Else check if _MSC_VER is defined to select
__declspec(thread), or else rely on __thread as fallback.

Remove ax_tls.m4 because it is now unused.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoFix: tap array subscript has type char warning
Mathieu Desnoyers [Fri, 10 Apr 2020 12:30:54 +0000 (08:30 -0400)] 
Fix: tap array subscript has type char warning

On architectures where "char" is signed, it should be cast to unsigned
char before being passed as parameter to isdigit or isspace. Based on
their man page:

       These  functions  check  whether  c,  which  must  have the value of an
       unsigned char or EOF, falls into a certain character class according to
       the  specified  locale.

Passing a signed char as parameter is invalid if the values fall into
the negative range of the signed char.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoVersion 0.12.0 v0.12.0
Mathieu Desnoyers [Thu, 9 Apr 2020 18:44:10 +0000 (14:44 -0400)] 
Version 0.12.0

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agotls-compat.h: introduce DEFINE_URCU_TLS_INIT
Mathieu Desnoyers [Thu, 9 Apr 2020 15:26:31 +0000 (11:26 -0400)] 
tls-compat.h: introduce DEFINE_URCU_TLS_INIT

DEFINE_URCU_TLS() cannot be used in this way for !CONFIG_RCU_TLS:

  DEFINE_URCU_TLS(ino_t, cached_net_ns) = NS_INO_UNINITIALIZED;

Introduce a new DEFINE_URCU_TLS_INIT which allows expressing a nonzero
intial value:

  DEFINE_URCU_TLS_INIT(ino_t, cached_net_ns, NS_INO_UNINITIALIZED);

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoUse _umtx_op for futex on FreeBSD
Alex Xu [Tue, 28 Jan 2020 01:17:22 +0000 (20:17 -0500)] 
Use _umtx_op for futex on FreeBSD

Tested with "make check", "make regtest" and a knotd slave.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 years agoAdd FreeBSD, DragonFly to syscall-compat.h
Alex Xu [Mon, 27 Jan 2020 20:08:29 +0000 (15:08 -0500)] 
Add FreeBSD, DragonFly to syscall-compat.h

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agourcu-bp: perform thread registration on urcu_bp_register_thread
Mathieu Desnoyers [Fri, 22 Nov 2019 16:02:36 +0000 (11:02 -0500)] 
urcu-bp: perform thread registration on urcu_bp_register_thread

Some real-time use-cases (e.g. Xenomai) require to perform urcu-bp
thread registration early in the thread life-time before it starts
performing real-time tasks.

Currently, this can be achieved by issuing a urcu_bp_read_lock() and
urcu_bp_read_unlock() pair, or by using urcu_bp_read_ongoing(), while in
the initialization phrase.

However, it seems natural to expect that calling urcu_bp_register_thread()
would have the side effect to perform the lazy thread registration
immediately rather than being a no-op.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoRequire automake >= 1.12
Michael Jeanson [Thu, 7 Nov 2019 18:39:44 +0000 (13:39 -0500)] 
Require automake >= 1.12

The test suite LOG_DRIVER statement requires that automake >= 1.12 be used
during bootstrap.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agocds_lfht_is_node_deleted parameter can be marked const
Jérémie Galarneau [Mon, 28 Oct 2019 19:24:36 +0000 (15:24 -0400)] 
cds_lfht_is_node_deleted parameter can be marked const

Mark the cds_lfht_node pointer parameter of cds_lfht_is_node_deleted
as const. The fact that this parameter is mutable makes it harder to
use liburcu in const-correct code.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: provide errno as argument to urcu_die()
Mathieu Desnoyers [Thu, 19 Sep 2019 14:10:31 +0000 (10:10 -0400)] 
Fix: provide errno as argument to urcu_die()

commit 1a990de3add "Fix: rculfhash worker needs to unblock to SIGRCU"
provides "ret" (-1) as argument to urcu_die(), but should rather provide
errno.

Reported by Coverity:

** CID 1405700:  Error handling issues  (NEGATIVE_RETURNS) /src/rculfhash.c: 2171 in cds_lfht_worker_init()

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: rculfhash worker needs to unblock to SIGRCU
hewenliang [Tue, 17 Sep 2019 14:59:18 +0000 (10:59 -0400)] 
Fix: rculfhash worker needs to unblock to SIGRCU

In urcu-signal flavor, call_rcu_thread calls synchronize_rcu which
will send SIGRCU signal to all registed threads, and then loops to
wait need_mb to be cleared. However, the registed workqueue_thread
does not process the SIGRCU signal, and never clear the need_mb.
Based on above, call_rcu_thread and workqueue_thread will wait
forever for completion of the grace period: call_rcu_thread which holds
the rcu_registry_lock, waits for workqueue_thread to do cmm_smp_mb.
While workqueue thread never does cmm_smp_mb because of signal blocking,
and it will eventually wait to get rcu_registry_lock in do_resize_cb.

The phenomenon is as follows, which is easy to be triggered:

(gdb) t 2
[Switching to thread 2 (Thread 0xffff83c3b080 (LWP 27116))]
0  0x0000ffff845296c4 in poll () from /lib64/libc.so.6
(gdb) bt
0 0x0000ffff845296c4 in poll () from /lib64/libc.so.6
1 0x0000ffff8461b93c in force_mb_all_readers () at urcu.c:241
2 0x0000ffff8461c748 in smp_mb_master () at urcu.c:249
3 urcu_signal_synchronize_rcu () at urcu.c:445
4 0x0000ffff8461d004 in call_rcu_thread  at urcu-call-rcu-impl.h:364
5 0x0000ffff845eb8bc in start_thread () from /lib64/libpthread.so.0
6 0x0000ffff845335cc in thread_start () from /lib64/libc.so.6
(gdb) t 3
[Switching to thread 3 (Thread 0xffff8443c080 (LWP 27191))]
0 0x0000ffff845f51c4 in __lll_lock_wait () from /lib64/libpthread.so.0
(gdb) bt
0 0x0000ffff845f51c4 in __lll_lock_wait () from /lib64/libpthread.so.0
1 0x0000ffff845ee048 in pthread_mutex_lock () from /lib64/libpthread.so.0
2 0x0000ffff8461b814 in mutex_lock ( <rcu_registry_lock>) at urcu.c:157
3 0x0000ffff8461b9e4 in urcu_signal_unregister_thread () at urcu.c:564
4 0x0000ffff8463e62c in do_resize_cb (work=0x11e2e790) at rculfhash.c:2042
5 0x0000ffff8463c940 in workqueue_thread (arg=0x11e1d260) at workqueue.c:228
6 0x0000ffff845eb8bc in start_thread () from /lib64/libpthread.so.0
7 0x0000ffff845335cc in thread_start () from /lib64/libc.so.6

So we should not block SIGRCU in workqueue thread to avoid blocking
forever in the grace period awaiting on the worker thread when using
urcu-signal flavor.

Signed-off-by: hewenliang <hewenliang4@huawei.com>
Co-developed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
5 years agoCleanup: test_perthreadlock_timing: handle pthread mutex errors
Mathieu Desnoyers [Tue, 4 Jun 2019 19:09:53 +0000 (15:09 -0400)] 
Cleanup: test_perthreadlock_timing: handle pthread mutex errors

Found by Coverity:
CID 1357055 (#1 of 1): Unchecked return value (CHECKED_RETURN)
4. check_return: Calling pthread_mutex_lock without checking return value
(as is done elsewhere 44 out of 48 times).

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: SONAME bump to 6.1.0
Michael Jeanson [Mon, 3 Jun 2019 20:36:43 +0000 (16:36 -0400)] 
Fix: SONAME bump to 6.1.0

In commit d6c78161aed9b2d550ce201b0a8cd5b3ee515ac8 we bumped the 'age'
part of the library version with the intention of keeping the same major
SONAME because we only introduced new symbols. However by bumping the
'age' and not the 'current' we substracted 1 to the major SONAME which
we did not intend. Seems like we missed this in testing.

Fix it by bumping the 'current' to end up with an SONAME of 6.1.0 which
is what we originally intended.

From the libtool manual for reference :

  Programs using the previous version may use the new version as drop-in
  replacement, but programs using the new version may use APIs not present
  in the previous one. In other words, a program linking against the new
  version may fail with “unresolved symbols” if linking against the old
  version at runtime: set revision to 0, bump current and age.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: remove unused variable from configure.ac check
Mathieu Desnoyers [Mon, 27 May 2019 16:38:38 +0000 (12:38 -0400)] 
Cleanup: remove unused variable from configure.ac check

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: urcu/futex.h: users of struct timespec should include time.h
Mathieu Desnoyers [Mon, 27 May 2019 15:50:20 +0000 (11:50 -0400)] 
Fix: urcu/futex.h: users of struct timespec should include time.h

Fixes: #1187
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoVersion 0.11.0 v0.11.0
Mathieu Desnoyers [Mon, 6 May 2019 20:24:29 +0000 (16:24 -0400)] 
Version 0.11.0

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoBump library version to 6:0:1
Mathieu Desnoyers [Mon, 6 May 2019 19:50:28 +0000 (15:50 -0400)] 
Bump library version to 6:0:1

Public symbol were added between 0.10 and 0.11.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: update code layout to fix old gcc warning
Mathieu Desnoyers [Mon, 6 May 2019 13:56:19 +0000 (09:56 -0400)] 
Cleanup: update code layout to fix old gcc warning

Some CI jobs show:

urcu-pointer.o
13:46:22 In file included from urcu.c:49:0:
13:46:22 urcu-wait.h:70:9: warning: missing initializer for field 'lock' of 'struct cds_wfs_stack' [-Wmissing-field-initializers]
13:46:22   struct urcu_wait_queue name = URCU_WAIT_QUEUE_HEAD_INIT(name)
13:46:22          ^
13:46:22 urcu.c:150:8: note: in expansion of macro 'DEFINE_URCU_WAIT_QUEUE'
13:46:22  static DEFINE_URCU_WAIT_QUEUE(gp_waiters);
13:46:22         ^
13:46:22 In file included from urcu-wait.h:27:0,
13:46:22                  from urcu.c:49:
13:46:22 ../include/urcu/wfstack.h:92:18: note: 'lock' declared here
13:46:22   pthread_mutex_t lock;
13:46:22

Change code layout so not to confuse old gcc.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: typo CPPLAGS in examples Makefile
Michael Jeanson [Mon, 22 Apr 2019 16:04:04 +0000 (12:04 -0400)] 
Fix: typo CPPLAGS in examples Makefile

Overriding CPPFLAGS throught the environment was ignored for the
examples.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoHarmonize pprint macro across projects
Michael Jeanson [Tue, 16 Apr 2019 20:41:45 +0000 (16:41 -0400)] 
Harmonize pprint macro across projects

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCheck for TLS support after CC detection
Michael Jeanson [Tue, 16 Apr 2019 17:48:00 +0000 (13:48 -0400)] 
Check for TLS support after CC detection

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUpdate macros from the autotools archive
Michael Jeanson [Tue, 16 Apr 2019 17:47:59 +0000 (13:47 -0400)] 
Update macros from the autotools archive

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agotap-driver.sh: flush stdout after each test result
Michael Jeanson [Thu, 14 Mar 2019 15:35:39 +0000 (11:35 -0400)] 
tap-driver.sh: flush stdout after each test result

This is useful in a CI system where stdout is fully buffered and you
look at the console output to see which test is hanging.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUpdate dead link in lgpl-relicensing.txt
Michael Jeanson [Thu, 7 Mar 2019 20:53:54 +0000 (15:53 -0500)] 
Update dead link in lgpl-relicensing.txt

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd multiflavor compat identifiers
Michael Jeanson [Mon, 28 Jan 2019 16:56:02 +0000 (11:56 -0500)] 
Add multiflavor compat identifiers

This will maintain buildtime compatibility with softwares like lttng-ust
that used the prior undocumented multiflavor API.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: missing sign compare fixes
Michael Jeanson [Wed, 19 Dec 2018 16:44:57 +0000 (11:44 -0500)] 
Cleanup: missing sign compare fixes

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: enable signed/unsigned compare compiler warning
Michael Jeanson [Tue, 18 Dec 2018 19:21:22 +0000 (14:21 -0500)] 
Cleanup: enable signed/unsigned compare compiler warning

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: compiler warning on 32-bit architectures
Michael Jeanson [Mon, 17 Dec 2018 20:23:14 +0000 (15:23 -0500)] 
Cleanup: compiler warning on 32-bit architectures

Replace a runtime test for 64-bit arch by a preprocessor test to
fix this compiler warning on 32-bit archs :

  comparison is always true due to limited range of data type [-Wtype-limits]

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoconfig.h.in: rename CONFIG_RCU_MULTIFLAVOR to CONFIG_RCU_HAVE_MULTIFLAVOR
Mathieu Desnoyers [Thu, 13 Dec 2018 20:48:12 +0000 (15:48 -0500)] 
config.h.in: rename CONFIG_RCU_MULTIFLAVOR to CONFIG_RCU_HAVE_MULTIFLAVOR

Considering that this config option cannot be selected by
configure, and is just exposing the capabilities of liburcu,
use the "HAVE" semantic.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agorculfhash: implement iterator debugging config option
Mathieu Desnoyers [Thu, 13 Dec 2018 02:15:32 +0000 (21:15 -0500)] 
rculfhash: implement iterator debugging config option

Building liburcu with --enable-cds-lfht-iter-debug and rebuilding
application to match the ABI change allows finding cases where the
hash table iterator is re-purposed to be used on a different hash
table while still being used to iterate on a hash table.

This is a common programming mistake that happens often enough
to justify creating a debugging mode to track this automatically.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: examples silent rules on Solaris
Michael Jeanson [Wed, 12 Dec 2018 20:30:59 +0000 (15:30 -0500)] 
Fix: examples silent rules on Solaris

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd missing fall through annotations
Michael Jeanson [Wed, 12 Dec 2018 20:01:39 +0000 (15:01 -0500)] 
Add missing fall through annotations

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: symbol aliases with TLS compat
Michael Jeanson [Wed, 12 Dec 2018 20:01:38 +0000 (15:01 -0500)] 
Fix: symbol aliases with TLS compat

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoPort: no symbols aliases on MacOS
Michael Jeanson [Wed, 12 Dec 2018 20:01:37 +0000 (15:01 -0500)] 
Port: no symbols aliases on MacOS

There is no equivalent to symbols aliases on MacOS, this will
unfortunatly break the ABI for SONAME(6) and will require a rebuild of
client applications.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd -Wextra to CFLAGS
Michael Jeanson [Fri, 30 Nov 2018 19:28:51 +0000 (14:28 -0500)] 
Add -Wextra to CFLAGS

Edited by Mathieu Desnoyers:

Use /* fall through */ rather than __attribute__((fallthrough)) to
stay compatible with clang and gcc < 7. The fallthrough attribute
was introduced in gcc 7.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoAdd silent mode to examples Makefiles
Michael Jeanson [Fri, 30 Nov 2018 23:06:45 +0000 (18:06 -0500)] 
Add silent mode to examples Makefiles

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agodoc: update examples to API changes
Mathieu Desnoyers [Thu, 29 Nov 2018 20:59:18 +0000 (15:59 -0500)] 
doc: update examples to API changes

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agotest multiflavor single compile unit
Mathieu Desnoyers [Fri, 30 Nov 2018 19:20:33 +0000 (14:20 -0500)] 
test multiflavor single compile unit

Test multiple liburcu flavors within a compile unit.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUpdate README following API changes
Mathieu Desnoyers [Thu, 29 Nov 2018 20:49:11 +0000 (15:49 -0500)] 
Update README following API changes

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUse new header locations for includes from urcu code
Mathieu Desnoyers [Fri, 30 Nov 2018 22:19:44 +0000 (17:19 -0500)] 
Use new header locations for includes from urcu code

This also moves urcu/static/urcu-pointer.h to urcu/static/pointer.h.
Considering that it is not meant to be included directly by library
users, it should not cause any problem.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoUpdate call-rcu.h and defer.h comments and include guards
Mathieu Desnoyers [Fri, 30 Nov 2018 22:08:13 +0000 (17:08 -0500)] 
Update call-rcu.h and defer.h comments and include guards

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agorculfqueue.h: do not include urcu-call-rcu.h
Mathieu Desnoyers [Fri, 30 Nov 2018 21:59:18 +0000 (16:59 -0500)] 
rculfqueue.h: do not include urcu-call-rcu.h

urcu-call-rcu.h is included by rculfhqueue.h only for struct rcu_head
forward declaration, but as a result the urcu flavor needs to be chosen
beforehand, and therefore prevents using rculfqueue.h with multiple
urcu flavors in a given compile unit.

Remove that include and do a forward declaration of struct rcu_head
instead.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agorculfhash: support use with multiple flavors per compile unit
Mathieu Desnoyers [Fri, 30 Nov 2018 21:34:03 +0000 (16:34 -0500)] 
rculfhash: support use with multiple flavors per compile unit

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agorculfhash: do not include urcu-call-rcu.h from public API
Mathieu Desnoyers [Fri, 30 Nov 2018 21:22:08 +0000 (16:22 -0500)] 
rculfhash: do not include urcu-call-rcu.h from public API

This include is not needed, and because of it rculfhash needs to be
included after the RCU flavor is chosen.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoRefactor liburcu to support many flavors per compile unit
Mathieu Desnoyers [Wed, 28 Nov 2018 17:07:09 +0000 (12:07 -0500)] 
Refactor liburcu to support many flavors per compile unit

This refactoring keeps the prior use of liburcu "map" APIs unchanged.
However, it introduces the following new APIs:

Each urcu flavor is now available as its own header:

include/urcu/urcu-memb.h
include/urcu/urcu-mb.h
include/urcu/urcu-signal.h
include/urcu/urcu-bp.h
include/urcu/urcu-qsbr.h

The installed urcu headers that were not under the urcu/ subdirectory
are moved there:

include/urcu-call-rcu.h -> include/urcu/call-rcu.h
include/urcu-defer.h -> include/urcu/defer.h
include/urcu-flavor.h -> include/urcu/flavor.h
include/urcu-pointer.h -> include/urcu/pointer.h
include/urcu-bp.h -> include/urcu/urcu-bp.h
include/urcu.h -> include/urcu/urcu.h
include/urcu-qsbr.h -> include/urcu/urcu-qsbr.h

The liburcu "map" API is now only available for use when URCU_API_MAP is
defined before including the liburcu flavor headers.

The old headers are now placeholders defining URCU_API_MAP and including
the new headers for backward compatibility:

include/urcu-bp.h
include/urcu-call-rcu.h
include/urcu-defer.h
include/urcu-flavor.h
include/urcu-pointer.h
include/urcu-qsbr.h
include/urcu.h

The header include/urcu/urcu.h now includes the right header between the
memb, signal, or mb flavors based on the compiler defines.

The symbol names of liburcu flavors are cleaned up, favoring the
following hierarchy:

urcu_<flavor name>_...

This is an ABI-breaking change, however the previous symbols name were
kept as aliases to maintain backward compatibility. They will be removed
when the next SONAME bump occurs.

The new liburcu-memb.so shared object is introduced, properly
namespacing this flavor. It is a duplicate of the previous liburcu.so,
which is kept around for backward compatibility.

The new URCU_API_MAP macro is introduced, controlling whether the
urcu API "mapping" should stay defined after inclusion of the flavor
headers. Users wishing to use the prior urcu API should either
explicitly define URCU_API_MAP before including the urcu/urcu*.h flavor
headers, or include the flavor header files from the include toplevel
directory, which are placeholders for backward compatibility. Use of
many urcu flavors within the same _LGPL_SOURCE compile unit should not
use the "map" APIs.

Internally, the "map" header files are split into one header per
flavor. The include guards are removed, so their effect can be
applied more than once. A new include/urcu/map/clear.h header is
introduced, which undefines the mappings at the end of the flavor
header if URCU_API_MAP is not set.

The new APIs namespaced for each urcu flavor is the recommended way to
use liburcu. We can expect the prior APIs to eventually become
deprecated over time.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: only wait if work queue is empty in real-time mode
Jérémie Galarneau [Fri, 7 Dec 2018 22:06:39 +0000 (17:06 -0500)] 
Fix: only wait if work queue is empty in real-time mode

Unconditionally waiting for 10 ms after the completion of every batch
of jobs of the work queue in real-time mode appears to be a behaviour
inherited from the call-rcu thread.

While this is a fair trade-off in the context of call-rcu, it is less
evident that it is desirable in the context of a general-purpose
work queue. Waiting when work is available artificially degrades the
latency characteristics of the work queue.

If a workqueue user even need the explicit delay for batching (e.g. if
a call-rcu implementation would ever use the workqueue worker thread),
it can add it within the worker_before_wait_fct callback received as
argument from workqueue creation.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: don't wait after completion of a work queue job batch
Jérémie Galarneau [Fri, 7 Dec 2018 22:06:38 +0000 (17:06 -0500)] 
Fix: don't wait after completion of a work queue job batch

As indicated in the previous patch of this series, waiting on
completion of a job batch from the work queue artificially increases
the latency of the work queue.

The previous patch removed the wait that is performed when the
work queue is observed to be empty and was observed as the cause of a
performance problem.

It is likely that waiting when the queue is observed to be non-empty
is similarly unintended. Note that I have not observed such a problem
myself.

If a workqueue user even need the explicit delay for batching (e.g. if
a call-rcu implementation would ever use the workqueue worker thread),
it can add it within the worker_before_wait_fct callback received as
argument from workqueue creation.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: don't wait after completion of job batch if work queue is empty
Jérémie Galarneau [Fri, 7 Dec 2018 22:06:37 +0000 (17:06 -0500)] 
Fix: don't wait after completion of job batch if work queue is empty

On completion of a batch of jobs from the work queue, a wait of 10
ms (using poll()) is performed if there is no work present in the
work queue before waiting on its futex.

The work queue thread's structure is inspired by the call-rcu thread.
In the context of the call-rcu thread, my understanding is that the
intention is to ensure that the thread does not continuously wake-up
to process a single queued item. This is fine as an application should
not wait for a call-rcu job to be executed (or at least I don't see a
use-case for that).

In the context of the work queue, waiting for more work to be available
artificially slows down the execution of work on which an application
may wait.

I have observed a case where LTTng's session daemon's shutdown is
takes around 4 seconds as a large number of cds_lfht objects are
destroyed. Removing the wait reduces the duration of this phase of the
shut-down to almost ~10ms.

If a workqueue user even need the explicit delay for batching (e.g. if
a call-rcu implementation would ever use the workqueue worker thread),
it can add it within the worker_before_wait_fct callback received as
argument from workqueue creation.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: workqueue: struct urcu_work vs rcu_head mixup
Mathieu Desnoyers [Sun, 9 Dec 2018 11:37:09 +0000 (06:37 -0500)] 
Fix: workqueue: struct urcu_work vs rcu_head mixup

The workqueue code was derived from call-rcu, and its API
expects a struct urcu_work for work items, but it internally iterates
over struct rcu_head.

This is not an issue at runtime because both structures have the
exact same layout and content, but it is a type mixup nevertheless.

Use the right type in the implementation.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoCleanup: workqueue: update comments referring to call-rcu
Mathieu Desnoyers [Sun, 9 Dec 2018 11:31:57 +0000 (06:31 -0500)] 
Cleanup: workqueue: update comments referring to call-rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 years agoFix: mixup between URCU_WORKQUEUE_RT and URCU_CALL_RCU_RT
Jérémie Galarneau [Fri, 7 Dec 2018 22:06:36 +0000 (17:06 -0500)] 
Fix: mixup between URCU_WORKQUEUE_RT and URCU_CALL_RCU_RT

The work queue implementation is derived from the call-rcu thread. A
number of references seem to have been left in place when adapting the
code for its new purpose.

The URCU_CALL_RCU_RT flag is used by wake_worker_thread() while the
rest of the workqueue.c code uses URCU_WORKQUEUE_RT to determine if
the work queue was configured in real-time mode. Both flags are defined
to the same value (0x1) and the current internal user of the
work queue (lfht) never specifies any flags.

In practice, this does not cause any problem, but this mixup should
be fixed nevertheless.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agotest_rwlock: Add per-thread count to verbose output
Michael Jeanson [Fri, 23 Nov 2018 20:27:07 +0000 (15:27 -0500)] 
test_rwlock: Add per-thread count to verbose output

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoAdd *.exe to gitignore for Cygwin
Michael Jeanson [Fri, 23 Nov 2018 20:27:06 +0000 (15:27 -0500)] 
Add *.exe to gitignore for Cygwin

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoFix: pthread_rwlock initialization on Cygwin
Michael Jeanson [Fri, 23 Nov 2018 21:47:18 +0000 (16:47 -0500)] 
Fix: pthread_rwlock initialization on Cygwin

On Cygwin the PTHREAD_RWLOCK_INITIALIZER macro is not
sufficient to get a properly initialized pthread_rwlock_t
struct. Use the pthread_rwlock_init function instead which
should work on all platforms.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoFix: compat_futex_noasync on Cygwin
Michael Jeanson [Fri, 23 Nov 2018 20:27:04 +0000 (15:27 -0500)] 
Fix: compat_futex_noasync on Cygwin

The futex_noasync compat code uses a weak symbol to share state across
different shared object which is not possible on Windows with the
Portable Executable format. Use the async compat code for both cases.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agowfcqueue: allow defining CDS_WFCQ_WAIT_SLEEP to override `poll'
Eric Wong [Wed, 1 Aug 2018 18:54:45 +0000 (18:54 +0000)] 
wfcqueue: allow defining CDS_WFCQ_WAIT_SLEEP to override `poll'

Users may want to use alternative sleeping behavior instead of
`poll'.  Make CDS_WFCQ_WAIT_SLEEP a macro which may be defined
before including wfcqueue.h.

This alternative behavior could include logging, performing
low-priority cleanup work, sleeping a shorter/longer interval
or any combination of that.

This will also make integration into glibc easier, as `poll'
linkage causes conformance test failures even when relegated
to an impossible code path:
https://public-inbox.org/libc-alpha/20180801092626.jrwyrojfye4avcis@whir/

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoUpdate documentation for call_rcu before/after fork
Mathieu Desnoyers [Tue, 26 Jun 2018 23:43:48 +0000 (19:43 -0400)] 
Update documentation for call_rcu before/after fork

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoAdd support for the RISC-V architecture
Michael Jeanson [Wed, 21 Mar 2018 21:38:41 +0000 (17:38 -0400)] 
Add support for the RISC-V architecture

Tested in QEMU 2.12.0-rc0, requires --disable-compiler-tls to go
through the benchmarks reliably.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoTests: Add tap-driver.sh for automake < 1.12
Michael Jeanson [Tue, 20 Feb 2018 17:30:45 +0000 (12:30 -0500)] 
Tests: Add tap-driver.sh for automake < 1.12

Add the tap-driver.sh script in the aux directory to enable
systems with an automake version prior to 1.12 to bootstrap
the source tree from git.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoTests: Replace prove by autotools tap runner
Michael Jeanson [Fri, 8 Dec 2017 16:00:17 +0000 (11:00 -0500)] 
Tests: Replace prove by autotools tap runner

This patch removes the dependency on the prove perl script
to run the TAP test suite. It replaces it with the autotools
shell TAP driver that only requires a shell and awk.

Custom arguments can be passed to the test runner with
env variables as follow:

  env LOG_DRIVER_FLAGS='--comments --ignore-exit' \
      TESTS='foo.test baz.test' make -e check

This tap driver also creates a log file for each test that
can then be used by another system to build a test report.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoliburcu-bp: Use membarrier private expedited when available
Mathieu Desnoyers [Fri, 22 Dec 2017 15:57:59 +0000 (10:57 -0500)] 
liburcu-bp: Use membarrier private expedited when available

For the liburcu-bp flavor, use the membarrier private expedited command
when available. It is faster than the shared expedited command, but has
only been introduced in 4.14 Linux kernels.

When configured with --disable-sys-membarrier-fallback, liburcu-bp
will abort if running on a kernel that do not provide the membarrier
private expedited command (e.g. CONFIG_MEMBARRIER=n or kernel version
below 4.14).

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 years agoliburcu: Use membarrier private expedited when available
Mathieu Desnoyers [Thu, 21 Dec 2017 18:42:23 +0000 (13:42 -0500)] 
liburcu: Use membarrier private expedited when available

For the liburcu flavor, use the membarrier private expedited
command when available. It is faster than the shared expedited
command, but has only been introduced in 4.14 Linux kernels.

When configured with --disable-sys-membarrier-fallback, liburcu
will abort if running on a kernel that provide neither the shared
nor the private expedited membarrier commands. This is the case
if running on a CONFIG_MEMBARRIER=n kernel, or a kernel version
below 4.3.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agorculfhash: improve error handling of mmap backend
Mathieu Desnoyers [Tue, 7 Nov 2017 22:03:53 +0000 (17:03 -0500)] 
rculfhash: improve error handling of mmap backend

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoFix: don't use overlapping mmap mappings on Cygwin
Michael Jeanson [Fri, 28 Jul 2017 15:51:15 +0000 (11:51 -0400)] 
Fix: don't use overlapping mmap mappings on Cygwin

The allocation scheme used by the mmap based RCU hash table is to make a
large unaccessible mapping to reserve memory without allocating it.
Then smaller chunks are allocated by overlapping read/write mappings which
do allocate memory. Deallocation is done by an overlapping unaccessible
mapping.

This scheme was tested on Linux, macOS and Solaris. However, on Cygwin the
mmap wrapper is based on the Windows NtMapViewOfSection API which doesn't
support overlapping mappings.

An alternative to the overlapping mappings is to use mprotect to change the
protection on chunks of the large mapping, read/write to allocate and none
to deallocate. This works perfecty on Cygwin and Solaris but on Linux a
call to madvise is also required to deallocate and it just doesn't work on
macOS.

For this reason, we keep to original scheme on all platforms except Cygwin.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoTests fix: errors in shell scripts
Michael Jeanson [Wed, 26 Jul 2017 17:31:04 +0000 (13:31 -0400)] 
Tests fix: errors in shell scripts

Fix all shellcheck errors in the test scripts, switch to posix
compatible syntax. Remove duplicated code already included in common.sh.
Call the tap.sh cleanup code from our exit trap instead of overriding
it.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoRevert "Use initial-exec tls model"
Mathieu Desnoyers [Tue, 7 Nov 2017 14:35:37 +0000 (09:35 -0500)] 
Revert "Use initial-exec tls model"

This reverts commit 6fd172f599e8d798e68974a786dd930d876f182e.

The initial-exec model seems to behave differently than global-dynamic
with respect to lazy initialization, causing locks to be taken then
first time each thread touch the TLS. This introduces deadlocks
with library constructors waiting on other threads.

This will require further investigation.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoUse initial-exec tls model
Mathieu Desnoyers [Wed, 18 Oct 2017 20:55:18 +0000 (16:55 -0400)] 
Use initial-exec tls model

The initial-exec tls model removes requirement on performing memory
allocation the first time a tls variable is touched by any given thread.
This is needed to ensure usage of the TLS from a signal handler works
fine.

Given that the link-editor figures out the right model to use at
runtime, we can change the tls model without changing the soname major
version.

This also brings interesting speedups over the GD model. This does not
affects TLS accesses performed by executables, but does affect TLS
accesses performed by libraries.

* Executable (no change)

./test_urcu 1 0 10
SUMMARY /media/truecrypt1/compudj/doc/userspace-rcu/tests/benchmark/.libs/test_urcu testdur   10 nr_readers   1 rdur      0 wdur      0 nr_writers   0 wdelay      0 nr_reads   4420328692 nr_writes            0 nr_ops   4420328692

(with initial-exec)
./test_urcu 1 0 10
SUMMARY /media/truecrypt1/compudj/doc/userspace-rcu/tests/benchmark/.libs/test_urcu testdur   10 nr_readers   1 rdur      0 wdur      0 nr_writers   0 wdelay      0 nr_reads   4424925864 nr_writes            0 nr_ops   4424925864

* Library

(with global-dynamic)
./test_urcu_dynamic_link 1 0 10
SUMMARY /media/truecrypt1/compudj/doc/userspace-rcu/tests/benchmark/.libs/test_urcu_dynamic_link testdur   10 nr_readers   1 rdur      0 wdur      0 nr_writers   0 wdelay      0 nr_reads    573209491 nr_writes            0 nr_ops    573209491

(with initial-exec)
./test_urcu_dynamic_link 1 0 10
SUMMARY /media/truecrypt1/compudj/doc/userspace-rcu/tests/benchmark/.libs/test_urcu_dynamic_link testdur   10 nr_readers   1 rdur      0 wdur      0 nr_writers   0 wdelay      0 nr_reads   1088836185 nr_writes            0 nr_ops   1088836185

Link: https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter8-20.html
Link: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#Common-Variable-Attributes
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoFix: don't use membarrier SHARED syscall command in liburcu-bp
Mathieu Desnoyers [Wed, 6 Sep 2017 20:35:59 +0000 (16:35 -0400)] 
Fix: don't use membarrier SHARED syscall command in liburcu-bp

One main user of liburcu-bp (lttng-ust) invokes synchronize_rcu()
repeatedly, without batching (does not use call_rcu).

Those delays introduced by sys_membarrier SHARED command significantly
impacts application startup time. Therefore, revert to not using the
membarrier SHARED command.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoTests fix: add missing Cygwin thread id
Michael Jeanson [Thu, 20 Jul 2017 21:33:47 +0000 (17:33 -0400)] 
Tests fix: add missing Cygwin thread id

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoFix: assignment from incompatible pointer type warnings
Michael Jeanson [Thu, 20 Jul 2017 21:33:46 +0000 (17:33 -0400)] 
Fix: assignment from incompatible pointer type warnings

On some platforms, mmap returns a caddr_t pointer which generates
compiler warnings, cast to the proper pointer type to eliminate them.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoTests fix: unused variable warnings
Michael Jeanson [Thu, 20 Jul 2017 21:33:45 +0000 (17:33 -0400)] 
Tests fix: unused variable warnings

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoFix: add missing m68k headers to dist
Michael Jeanson [Fri, 14 Jul 2017 14:20:44 +0000 (10:20 -0400)] 
Fix: add missing m68k headers to dist

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoBump version to 0.11-pre
Michael Jeanson [Mon, 19 Jun 2017 20:44:41 +0000 (16:44 -0400)] 
Bump version to 0.11-pre

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoVersion 0.10.0 v0.10.0
Mathieu Desnoyers [Mon, 12 Jun 2017 23:36:29 +0000 (19:36 -0400)] 
Version 0.10.0

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoBump library soname due to urcu flavor structure change
Mathieu Desnoyers [Thu, 8 Jun 2017 14:33:18 +0000 (10:33 -0400)] 
Bump library soname due to urcu flavor structure change

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoCleanup: use mutex_lock() wrapper in rculfhash
Mathieu Desnoyers [Thu, 8 Jun 2017 00:19:13 +0000 (20:19 -0400)] 
Cleanup: use mutex_lock() wrapper in rculfhash

Fixes this coverity issue:

*** CID 1375952:  Error handling issues  (CHECKED_RETURN)
/src/rculfhash.c: 1950 in cds_lfht_resize()
1944     }
1945
1946     void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size)
1947     {
1948             resize_target_update_count(ht, new_size);
1949             CMM_STORE_SHARED(ht->resize_initiated, 1);
>>>     CID 1375952:  Error handling issues  (CHECKED_RETURN)
>>>     Calling "pthread_mutex_lock" without checking return value (as is done elsewhere 44 out of 50 times).
1950             pthread_mutex_lock(&ht->resize_mutex);
1951             _do_cds_lfht_resize(ht);
1952             pthread_mutex_unlock(&ht->resize_mutex);
1953     }
1954
1955     static

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoUse workqueue in rculfhash
Mathieu Desnoyers [Tue, 30 May 2017 19:51:45 +0000 (15:51 -0400)] 
Use workqueue in rculfhash

The RCU lock-free hash table currently requires that the destroy
function should not be called from within RCU read-side critical
sections. This is caused by the lazy resize, which uses the call_rcu
worker thread, even though all it really needs is a workqueue/worker
thread scheme.

Use the new internal workqueue API instead of call_rcu in rculfhash to
overcome this limitation.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoImplement urcu workqueues internal API
Mathieu Desnoyers [Tue, 30 May 2017 19:14:58 +0000 (15:14 -0400)] 
Implement urcu workqueues internal API

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoAdd support for m68k architecture
Michael Jeanson [Mon, 15 May 2017 18:10:32 +0000 (14:10 -0400)] 
Add support for m68k architecture

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Tested-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 years agoSet -Wall globally in AM_CFLAGS
Michael Jeanson [Mon, 8 May 2017 20:15:22 +0000 (16:15 -0400)] 
Set -Wall globally in AM_CFLAGS

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
This page took 0.04556 seconds and 4 git commands to generate.