userspace-rcu.git
11 years agodoc/examples: add dist toplevel makefile
Mathieu Desnoyers [Sat, 22 Jun 2013 18:39:12 +0000 (14:39 -0400)] 
doc/examples: add dist toplevel makefile

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: add membarrier flavor
Mathieu Desnoyers [Sat, 22 Jun 2013 18:18:22 +0000 (14:18 -0400)] 
doc/examples: add membarrier flavor

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: document call_rcu()
Mathieu Desnoyers [Sat, 22 Jun 2013 18:05:10 +0000 (14:05 -0400)] 
doc/examples: document call_rcu()

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: update qsbr example
Mathieu Desnoyers [Sat, 22 Jun 2013 18:02:30 +0000 (14:02 -0400)] 
doc/examples: update qsbr example

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agourcu signal: remove assertion on exit
Mathieu Desnoyers [Sat, 22 Jun 2013 18:00:39 +0000 (14:00 -0400)] 
urcu signal: remove assertion on exit

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: signal flavor
Mathieu Desnoyers [Sat, 22 Jun 2013 17:34:53 +0000 (13:34 -0400)] 
doc/examples: signal flavor

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: add mb flavor
Mathieu Desnoyers [Sat, 22 Jun 2013 17:26:16 +0000 (13:26 -0400)] 
doc/examples: add mb flavor

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: update qsbr
Mathieu Desnoyers [Sat, 22 Jun 2013 17:25:03 +0000 (13:25 -0400)] 
doc/examples: update qsbr

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: introduce urcu-flavors examples directory
Mathieu Desnoyers [Sat, 22 Jun 2013 17:19:36 +0000 (13:19 -0400)] 
doc/examples: introduce urcu-flavors examples directory

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: enhance rcu-flavor-qsbr example
Mathieu Desnoyers [Sat, 22 Jun 2013 17:13:22 +0000 (13:13 -0400)] 
doc/examples: enhance rcu-flavor-qsbr example

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: rename qsbr-minimal to rcu-flavor-qsbr
Mathieu Desnoyers [Sat, 22 Jun 2013 17:02:46 +0000 (13:02 -0400)] 
doc/examples: rename qsbr-minimal to rcu-flavor-qsbr

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: automake stop on error
Mathieu Desnoyers [Sat, 22 Jun 2013 16:08:31 +0000 (12:08 -0400)] 
doc/examples: automake stop on error

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: hlist
Mathieu Desnoyers [Sat, 22 Jun 2013 16:06:00 +0000 (12:06 -0400)] 
doc/examples: hlist

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agohlist/rcuhlist update
Mathieu Desnoyers [Sat, 22 Jun 2013 15:50:44 +0000 (11:50 -0400)] 
hlist/rcuhlist update

introduce:

- cds_hlist_for_each()
- cds_hlist_for_each_safe()
- CDS_HLIST_HEAD()
- CDS_HLIST_HEAD_INIT()
- cds_hlist_for_each_entry_2() (takes 3 argument, like the Linux kernel
  API),
- cds_hlist_for_each_entry_safe_2() (takes 4 arguments, like the Linux
  kernel API),
- cds_hlist_for_each_rcu()
- cds_hlist_for_each_entry_rcu_2() (takes 3 arguments, like the Linux
  kernel API).

Left cds_hlist_for_each_entry(), cds_hlist_for_each_entry_safe() and
cds_hlist_for_each_entry_rcu() as-is (different from the ones found in
the Linux kernel) because those APIs were already exposed by Userspace
RCU.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: fix typo in list example
Mathieu Desnoyers [Fri, 21 Jun 2013 21:45:48 +0000 (17:45 -0400)] 
doc/examples: fix typo in list example

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorcuhlist: make pointer stores atomic
Mathieu Desnoyers [Fri, 21 Jun 2013 21:29:42 +0000 (17:29 -0400)] 
rcuhlist: make pointer stores atomic

Use rcu_assign_pointer() to store into head->next in
cds_hlist_add_head_rcu(). This includes the write barrier needed before
publishing the new node.

Use CMM_STORE_SHARED() to store into elem->prev->next in
cds_hlist_del_rcu().

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agohlist, rcuhlist: cleanup coding style
Mathieu Desnoyers [Fri, 21 Jun 2013 21:26:09 +0000 (17:26 -0400)] 
hlist, rcuhlist: cleanup coding style

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: lfstack
Mathieu Desnoyers [Fri, 21 Jun 2013 21:17:32 +0000 (17:17 -0400)] 
doc/examples: lfstack

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: update cds_wfs_pop_all_blocking
Mathieu Desnoyers [Fri, 21 Jun 2013 20:51:14 +0000 (16:51 -0400)] 
doc/examples: update cds_wfs_pop_all_blocking

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_wfs_pop_all_blocking
Mathieu Desnoyers [Fri, 21 Jun 2013 20:46:04 +0000 (16:46 -0400)] 
doc/examples: cds_wfs_pop_all_blocking

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_wfs_pop
Mathieu Desnoyers [Fri, 21 Jun 2013 20:31:49 +0000 (16:31 -0400)] 
doc/examples: cds_wfs_pop

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: add missing Makefile
Mathieu Desnoyers [Fri, 21 Jun 2013 20:21:34 +0000 (16:21 -0400)] 
doc/examples: add missing Makefile

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_wfs_push
Mathieu Desnoyers [Fri, 21 Jun 2013 20:19:01 +0000 (16:19 -0400)] 
doc/examples: cds_wfs_push

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/wfcqueue: cds_wfcq_splice
Mathieu Desnoyers [Fri, 21 Jun 2013 19:57:35 +0000 (15:57 -0400)] 
doc/wfcqueue: cds_wfcq_splice

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: add cds_wfcq_dequeue
Mathieu Desnoyers [Fri, 21 Jun 2013 19:32:14 +0000 (15:32 -0400)] 
doc/examples: add cds_wfcq_dequeue

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: wfcq needs to link against urcu-common
Mathieu Desnoyers [Fri, 21 Jun 2013 19:31:44 +0000 (15:31 -0400)] 
doc/examples: wfcq needs to link against urcu-common

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: update queue comment
Mathieu Desnoyers [Fri, 21 Jun 2013 19:03:48 +0000 (15:03 -0400)] 
doc/examples: update queue comment

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: fix make clean
Mathieu Desnoyers [Fri, 21 Jun 2013 18:56:44 +0000 (14:56 -0400)] 
doc/examples: fix make clean

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agogitignore: add qsbr-minimal
Mathieu Desnoyers [Fri, 21 Jun 2013 18:54:42 +0000 (14:54 -0400)] 
gitignore: add qsbr-minimal

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_wfcq_enqueue
Mathieu Desnoyers [Fri, 21 Jun 2013 18:53:52 +0000 (14:53 -0400)] 
doc/examples: cds_wfcq_enqueue

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: Move LIBS to each makefile
Mathieu Desnoyers [Fri, 21 Jun 2013 18:52:44 +0000 (14:52 -0400)] 
doc/examples: Move LIBS to each makefile

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_for_each_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 18:22:32 +0000 (14:22 -0400)] 
doc/examples: cds_list_for_each_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_for_each_entry_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 18:12:54 +0000 (14:12 -0400)] 
doc/examples: cds_list_for_each_entry_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_replace_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 17:59:09 +0000 (13:59 -0400)] 
doc/examples: cds_list_replace_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_add_tail_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 17:43:43 +0000 (13:43 -0400)] 
doc/examples: cds_list_add_tail_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_del_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 16:01:06 +0000 (12:01 -0400)] 
doc/examples: cds_list_del_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/examples: cds_list_add_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 15:46:17 +0000 (11:46 -0400)] 
doc/examples: cds_list_add_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculist: ensure atomic updates of next pointers
Mathieu Desnoyers [Fri, 21 Jun 2013 16:51:13 +0000 (12:51 -0400)] 
rculist: ensure atomic updates of next pointers

in cds_list_add_rcu, use rcu_assign_pointer to update head->next
atomically and provide the memory barrier before publishing head->next.
Notice that we don't need the wmb() prior to store to prev, because RCU
traversals only go forward, and thus only use "next".

in cds_list_del_rcu, use CMM_STORE_SHARED() to store to elem->prev->next
atomically.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculist: implement cds_list_add_tail_rcu
Mathieu Desnoyers [Fri, 21 Jun 2013 16:48:18 +0000 (12:48 -0400)] 
rculist: implement cds_list_add_tail_rcu

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculist.h and list.h style cleanup
Mathieu Desnoyers [Fri, 21 Jun 2013 16:27:44 +0000 (12:27 -0400)] 
rculist.h and list.h style cleanup

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoexample makefile: add missing cd ..
Mathieu Desnoyers [Thu, 20 Jun 2013 13:21:03 +0000 (09:21 -0400)] 
example makefile: add missing cd ..

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoUpdate gitignore
Mathieu Desnoyers [Thu, 20 Jun 2013 12:57:57 +0000 (08:57 -0400)] 
Update gitignore

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: examples Makefile on FreeBSD
Mathieu Desnoyers [Thu, 20 Jun 2013 12:50:33 +0000 (08:50 -0400)] 
Fix: examples Makefile on FreeBSD

Support BSD-style make.

Fixes #565

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agohash table test: don't redefine CACHE_LINE_SIZE
Mathieu Desnoyers [Wed, 19 Jun 2013 14:31:57 +0000 (10:31 -0400)] 
hash table test: don't redefine CACHE_LINE_SIZE

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agotests: use thread-id.h wrapper
Mathieu Desnoyers [Wed, 19 Jun 2013 14:31:09 +0000 (10:31 -0400)] 
tests: use thread-id.h wrapper

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoImplement thread-id.h wrapper
Mathieu Desnoyers [Wed, 19 Jun 2013 14:30:58 +0000 (10:30 -0400)] 
Implement thread-id.h wrapper

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agotests: add missing unsigned long casts to pthread_self()
Mathieu Desnoyers [Wed, 19 Jun 2013 13:04:55 +0000 (09:04 -0400)] 
tests: add missing unsigned long casts to pthread_self()

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: don't build examples in static builds
Mathieu Desnoyers [Fri, 14 Jun 2013 22:32:04 +0000 (18:32 -0400)] 
Fix: don't build examples in static builds

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd QSBR minimal example
Mathieu Desnoyers [Mon, 3 Jun 2013 20:18:34 +0000 (16:18 -0400)] 
Add QSBR minimal example

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agocompiler.h: implement CAA_ARRAY_SIZE()
Mathieu Desnoyers [Fri, 14 Jun 2013 21:28:07 +0000 (17:28 -0400)] 
compiler.h: implement CAA_ARRAY_SIZE()

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodocument rcu barrier
Mathieu Desnoyers [Fri, 14 Jun 2013 12:30:21 +0000 (08:30 -0400)] 
document rcu barrier

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorcu barrier: handle OOM die urcu_die
Mathieu Desnoyers [Fri, 14 Jun 2013 12:22:50 +0000 (08:22 -0400)] 
rcu barrier: handle OOM die urcu_die

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoImplement rcu_barrier()
Mathieu Desnoyers [Fri, 31 May 2013 15:32:16 +0000 (11:32 -0400)] 
Implement rcu_barrier()

Awaits for all in-flight call_rcu handlers to complete execution before
returning.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculfhash: document destroy context limitations
Mathieu Desnoyers [Fri, 14 Jun 2013 12:15:21 +0000 (08:15 -0400)] 
rculfhash: document destroy context limitations

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd MIPS to README
Mathieu Desnoyers [Tue, 11 Jun 2013 15:18:52 +0000 (11:18 -0400)] 
Add MIPS to README

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoUpdate README
Mathieu Desnoyers [Sat, 8 Jun 2013 12:24:23 +0000 (08:24 -0400)] 
Update README

Detail i386/amd64 as tested for FreeBSD.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoUpdate README testing info about FreeBSD
Mathieu Desnoyers [Sat, 8 Jun 2013 11:57:57 +0000 (07:57 -0400)] 
Update README testing info about FreeBSD

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agotest: fix api.h missing if brackets
Mathieu Desnoyers [Wed, 15 May 2013 14:29:44 +0000 (16:29 +0200)] 
test: fix api.h missing if brackets

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agotests: fix incorrect counter
Mathieu Desnoyers [Wed, 15 May 2013 14:26:57 +0000 (16:26 +0200)] 
tests: fix incorrect counter

- not initialized to 0 in 2 tests,
- within inner loop in 3rd test, thus always 0.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: membarrier fallback symbol conflict
Mathieu Desnoyers [Wed, 8 May 2013 13:53:45 +0000 (09:53 -0400)] 
Fix: membarrier fallback symbol conflict

* Lai Jiangshan (laijs@cn.fujitsu.com) wrote:
> Hi, Mathieu,
>
> There is a big compatible problem in URCU which should be fix in next round.
>
> LB: liburcu built on the system which has sys_membarrier().
> LU: liburcu built on the system which does NOT have sys_membarrier().
>
> LBM: liburcu-mb ....
> LUM: liburcu-mb ...
>
> AB: application(-lliburcu) built on the system which has sys_membarrier().
> AU: application(-lliburcu) built on the system which does NOT have
> sys_membarrier().
>
> ABM application(-lliburcu-mb) ...
> AUM application(-lliburcu-mb) ...
>
> AB/AU + LB/LU: 4 combinations
> ABM/AUM + LBM/LUM: 4 combinations
>
> I remember some of the 8 combinations can't works due to symbols are
> miss match.  only LU+AB and LB+AU ?
>
> could you check it?
>
> How to fix it: In LU and AU, keep all the symbol name/ABI as LA and
> AB, but only the behaviors falls back to URCU_MB.

Define membarrier() as -ENOSYS when SYS_membarrier is not found in the
system headers. Check dynamically for membarrier availability to ensure
ABI compatibility between applications and librairies.

Reported-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: Use a filled signal mask to disable all signals
Mathieu Desnoyers [Fri, 10 May 2013 11:30:18 +0000 (07:30 -0400)] 
Fix: Use a filled signal mask to disable all signals

Changelog from David Pelton's original patch:

While using lttng-ust with an application that was calling fork()
with pending signals, I found that all signals were getting unmasked
shortly before the underlying call to fork().  After some
investigation, I found that the rcu_bp_before_fork() function was
unmasking all signals.  Based on the comments for this function, it
should be masking all signals.  Inspection of the rest of the code
in urcu-bp.c revealed the same pattern in two other functions.

This patch changes the code to use a filled signal mask to disable
all signals.  The change to rcu_bp_before_fork() addressed the
problem I was seeing while using lttng-ust.  The changes to the
other two functions appear to fix other instances of the same
problem.

Updates by Mathieu Desnoyers:

- Use SIG_BLOCK instead of SIG_SETMASK when setting a filled mask. This
  has the same behavior in this case (since we're blocking all signals),
  but is semantically neater: if we ever some signals from that mask,
  we'd like to to a union with the signal mask already blocked by the
  application.
- Also fix incorrect signal masking in compat_arch_x86.c.

Reported-by: David Pelton <dpelton@ciena.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agourcu-bp: introduce struct urcu_gp
Mathieu Desnoyers [Mon, 6 May 2013 14:30:57 +0000 (10:30 -0400)] 
urcu-bp: introduce struct urcu_gp

Make urcu-bp similar to urcu-qsbr and other urcu flavors.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: struct urcu_gp broke multiflavor
Mathieu Desnoyers [Mon, 6 May 2013 14:24:14 +0000 (10:24 -0400)] 
Fix: struct urcu_gp broke multiflavor

Add mapping to namespace urcu_gp.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoCleanup test usage printout
Mathieu Desnoyers [Mon, 6 May 2013 14:03:55 +0000 (10:03 -0400)] 
Cleanup test usage printout

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agowfstack tests: use pop "last" state info
Mathieu Desnoyers [Mon, 6 May 2013 13:35:42 +0000 (09:35 -0400)] 
wfstack tests: use pop "last" state info

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agowfstack: return whether pop is popping the last element
Mathieu Desnoyers [Mon, 6 May 2013 13:35:07 +0000 (09:35 -0400)] 
wfstack: return whether pop is popping the last element

Newly introduced "with_state" pop API members return stack state
atomically sampled with the pop operation.

Allow testing behavior of pop with respect to number of push-to-empty
and pop-all-from-non-empty.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agowfcqueue tests: use dequeue empty state
Mathieu Desnoyers [Mon, 6 May 2013 13:34:00 +0000 (09:34 -0400)] 
wfcqueue tests: use dequeue empty state

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agowfcqueue: return whether dequeue is dequeuing last element
Mathieu Desnoyers [Mon, 6 May 2013 13:33:36 +0000 (09:33 -0400)] 
wfcqueue: return whether dequeue is dequeuing last element

Newly introduced "with_state" dequeue API members return queue state
atomically sampled with the dequeue operation.

Allow testing behavior of dequeue with respect to number of
enqueue-to-empty and splice-from-non-empty.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agourcu: avoid false sharing for rcu_gp_ctr
Lai Jiangshan [Mon, 6 May 2013 12:42:27 +0000 (08:42 -0400)] 
urcu: avoid false sharing for rcu_gp_ctr

@rcu_gp_ctr and @registry share the same cache line, it causes
false sharing and slowdown both of the read site and update site.

Fix: Use different cache line for them.

Although rcu_gp_futex is updated less than rcu_gp_ctr, but
they always be accessed at almost the same time, so we also move rcu_gp_futex
to the cacheline of rcu_gp_ctr to reduce the cacheline-usage or cache-missing
of read site.

test: (4X6=24 CPUs)

Before patch:

[root@localhost userspace-rcu]# ./tests/test_urcu_mb 20 1 20
SUMMARY ./tests/test_urcu_mb      testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads   2100285330 nr_writes      3390219 nr_ops   2103675549
[root@localhost userspace-rcu]# ./tests/test_urcu_mb 20 1 20
SUMMARY ./tests/test_urcu_mb      testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads   1619868562 nr_writes      3529478 nr_ops   1623398040
[root@localhost userspace-rcu]# ./tests/test_urcu_mb 20 1 20
SUMMARY ./tests/test_urcu_mb      testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads   1949067038 nr_writes      3469334 nr_ops   1952536372

after patch:

[root@localhost userspace-rcu]# ./tests/test_urcu_mb 20 1 20
SUMMARY ./tests/test_urcu_mb      testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads   3380191848 nr_writes      4903248 nr_ops   3385095096
[root@localhost userspace-rcu]# ./tests/test_urcu_mb 20 1 20
SUMMARY ./tests/test_urcu_mb      testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads   3397637486 nr_writes      4129809 nr_ops   3401767295

Singed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agourcu: make the code of urcu-qsbr as normal urcu
Lai Jiangshan [Mon, 6 May 2013 12:32:02 +0000 (08:32 -0400)] 
urcu: make the code of urcu-qsbr as normal urcu

urcu-qsbr's read site's quiescence is much longer than normal urcu ==>
synchronize_rcu() is much slower ==>
rcu_gp_ctr is updated much less ==>
the whole urcu-qsbr will not be slowed down by false sharing of rcu_gp_ctr.

But this patch makes sense to keep the code of urcu-qsbr like normal urcu,
better readability and maintenance.

Test: (4*6 CPUs)
Before patch:
[root@localhost userspace-rcu]# ./tests/test_urcu_qsbr 20 1 20
SUMMARY ./tests/test_urcu_qsbr    testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads  65498297587 nr_writes      2000665 nr_ops  65500298252
[root@localhost userspace-rcu]# ./tests/test_urcu_qsbr 20 1 20
SUMMARY ./tests/test_urcu_qsbr    testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads  67218079467 nr_writes      1981593 nr_ops  67220061060

After patch
./tests/test_urcu_qsbr 20 1 20
SUMMARY ./tests/test_urcu_qsbr    testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads  67473798999 nr_writes      1999151 nr_ops  67475798150
[root@localhost userspace-rcu]# ./tests/test_urcu_qsbr 20 1 20
SUMMARY ./tests/test_urcu_qsbr    testdur   20 nr_readers  20 rdur      0 wdur      0 nr_writers   1 wdelay      0 nr_reads  67065521397 nr_writes      1993956 nr_ops  67067515353

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculfhash: detect if resize/destroy are called within RCU read-side C.S.
Mathieu Desnoyers [Tue, 30 Apr 2013 01:30:17 +0000 (21:30 -0400)] 
rculfhash: detect if resize/destroy are called within RCU read-side C.S.

Report errors.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoDocumentation: rculfhash: cds_lfht_resize not within read-side C.S.
Mathieu Desnoyers [Tue, 30 Apr 2013 00:48:40 +0000 (20:48 -0400)] 
Documentation: rculfhash: cds_lfht_resize not within read-side C.S.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agofix: rculfhash don't change qsbr online state
Mathieu Desnoyers [Tue, 30 Apr 2013 00:28:10 +0000 (20:28 -0400)] 
fix: rculfhash don't change qsbr online state

resize and destroy should not change the QSBR online state. Use the new
rcu_read_ongoing() API for this.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd rcu_read_ongoing() API to each urcu flavor
Mathieu Desnoyers [Tue, 30 Apr 2013 00:17:22 +0000 (20:17 -0400)] 
Add rcu_read_ongoing() API to each urcu flavor

This will allow checking whether:

- thread is online (QSBR),
- thread is nested within read-side critical section (other flavors),

This is useful for libraries that need to know if QSBR is online in
order to save the original state temporarily so it can be restored
before returning to the caller.

Eventually, this API can be called by a "debugging" implementation of
rcu_dereference() and other urcu-pointer.h API members to check that no
RCU pointer is read outside of RCU read-side critical sections.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd "sparc" host cpu to configure.ac
Mathieu Desnoyers [Wed, 17 Apr 2013 21:26:05 +0000 (17:26 -0400)] 
Add "sparc" host cpu to configure.ac

Some sparc Debian setups advertise a "sparc" host cpu (rather than
sparc64).

In all cases, I think it should be safe to add a "sparc" entry to
userspace RCU configure.ac upstream, e.g.

        [sparc], [ARCHTYPE="sparc64"],

in the event someone would launch the build on an environment not
supporting sparc v9, the build would fail because the 32-bit compiler
would not be able to generate sparc v9 instructions (unless
explicitely instructed to do so by the -m32 -Wa,-Av9a flags).

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agofutex: include syscall.h instead of sys/syscall.h
Mathieu Desnoyers [Tue, 16 Apr 2013 17:09:02 +0000 (13:09 -0400)] 
futex: include syscall.h instead of sys/syscall.h

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd tab to output in order to allow easy nesting of tables.
Paul E. McKenney [Thu, 14 Mar 2013 15:22:23 +0000 (11:22 -0400)] 
Add tab to output in order to allow easy nesting of tables.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoRemove urcu-api-list.sh from dist tarball
Mathieu Desnoyers [Thu, 14 Mar 2013 14:32:13 +0000 (10:32 -0400)] 
Remove urcu-api-list.sh from dist tarball

It needs to be run in the git repository.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd urcu-api-list.sh script
Paul E. McKenney [Thu, 14 Mar 2013 14:11:53 +0000 (10:11 -0400)] 
Add urcu-api-list.sh script

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agolist: implement cds_list_for_each_safe()
Mathieu Desnoyers [Wed, 13 Mar 2013 16:23:11 +0000 (12:23 -0400)] 
list: implement cds_list_for_each_safe()

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix: tests/api.h use cpuset.h
Mathieu Desnoyers [Fri, 22 Feb 2013 16:34:25 +0000 (11:34 -0500)] 
Fix: tests/api.h use cpuset.h

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix hurd-i386: move cpuset tests outside of sched_setaffinity conditional
Mathieu Desnoyers [Fri, 22 Feb 2013 15:57:48 +0000 (10:57 -0500)] 
Fix hurd-i386: move cpuset tests outside of sched_setaffinity conditional

Comment about introduction of cpuset.h within urcu tests:

> Unfortunately it doesn't work, because sched_setaffinity is for now
> just a fail-stub on hurd-i386, and thus configure considers it as
> missing, and thus the CPU_SET test is disabled completely.
>
> I however guess you could just disable defining your own cpu_set_t
> when !HAVE_SCHED_SETAFFINITY, since it is probably used only for using
> sched_setaffinity.

Fix by moving cpu_set_t, CPU_SET and CPU_ZERO tests outside of the
sched_setaffinity conditional.

Reported-by: Samuel Thibault <sthibault@debian.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix tests: finer-grained use of CPU_SET, CPU_ZERO and cpu_set_t
Mathieu Desnoyers [Fri, 22 Feb 2013 14:05:32 +0000 (09:05 -0500)] 
Fix tests: finer-grained use of CPU_SET, CPU_ZERO and cpu_set_t

Noticed build failure at
https://buildd.debian.org/status/package.php?p=liburcu :

Tail of log for liburcu on hurd-i386:

test_urcu.c:110:0: warning: "CPU_SET" redefined [enabled by default]
In file included from /usr/include/pthread/pthread.h:50:0,
                 from /usr/include/pthread.h:2,
                 from test_urcu.c:26:
/usr/include/sched.h:80:0: note: this is the location of the previous definition
make[3]: *** [test_urcu.o] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all] Error 2
dh_auto_build: make -j1 returned exit code 2
make: *** [build-arch] Error 2
dpkg-buildpackage: error: debian/rules build-arch gave error exit status 2
make[3]: Entering directory `/build/buildd-liburcu_0.7.6-1-hurd-i386-wGBAtt/liburcu-0.7.6/tests'
  CC     test_urcu.o
make[3]: Leaving directory `/build/buildd-liburcu_0.7.6-1-hurd-i386-wGBAtt/liburcu-0.7.6/tests'
make[2]: Leaving directory `/build/buildd-liburcu_0.7.6-1-hurd-i386-wGBAtt/liburcu-0.7.6'

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoTest for CPU_SET
Mathieu Desnoyers [Fri, 22 Feb 2013 13:50:49 +0000 (08:50 -0500)] 
Test for CPU_SET

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix build on architectures with HAVE_SCHED_GETCPU but without HAVE_SYSCONF
Mathieu Desnoyers [Fri, 22 Feb 2013 13:35:37 +0000 (08:35 -0500)] 
Fix build on architectures with HAVE_SCHED_GETCPU but without HAVE_SYSCONF

Noticed on: https://buildd.debian.org/status/package.php?p=liburcu

Tail of log for liburcu on kfreebsd-amd64:

  CC     urcu.lo
In file included from urcu.c:450:0:
urcu-call-rcu-impl.h:145:12: error: static declaration of 'sched_getcpu' follows non-static declaration
In file included from /usr/include/sched.h:43:0,
                 from /usr/include/pthread.h:20,
                 from urcu.c:30:
/usr/include/x86_64-kfreebsd-gnu/bits/sched.h:65:12: note: previous declaration of 'sched_getcpu' was here
make[3]: *** [urcu.lo] Error 1
make[3]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-amd64-nnkICd/liburcu-0.7.6'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-amd64-nnkICd/liburcu-0.7.6'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-amd64-nnkICd/liburcu-0.7.6'
dh_auto_build: make -j1 returned exit code 2
make: *** [build-arch] Error 2

Tail of log for liburcu on kfreebsd-i386:

  CC     urcu.lo
In file included from urcu.c:450:0:
urcu-call-rcu-impl.h:145:12: error: static declaration of 'sched_getcpu' follows non-static declaration
In file included from /usr/include/sched.h:43:0,
                 from /usr/include/pthread.h:20,
                 from urcu.c:30:
/usr/include/i386-kfreebsd-gnu/bits/sched.h:65:12: note: previous declaration of 'sched_getcpu' was here
make[3]: *** [urcu.lo] Error 1
make[3]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-i386-sWzNKU/liburcu-0.7.6'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-i386-sWzNKU/liburcu-0.7.6'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/build/buildd-liburcu_0.7.6-1-kfreebsd-i386-sWzNKU/liburcu-0.7.6'
dh_auto_build: make -j1 returned exit code 2
make: *** [build-arch] Error 2

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoREADME: document that Clang 3.0 (based on LLVM 3.0) is supported
Mathieu Desnoyers [Fri, 22 Feb 2013 13:04:29 +0000 (08:04 -0500)] 
README: document that Clang 3.0 (based on LLVM 3.0) is supported

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoclang: silence "unused expression result" warning
Mathieu Desnoyers [Fri, 22 Feb 2013 12:57:16 +0000 (07:57 -0500)] 
clang: silence "unused expression result" warning

CMM_STORE_SHARED(x, v) is a macro that really acts like an assignment
expression, e.g.:

  x = v;

but internally also has "mc" barriers (useful for cache-incoherent
architectures).

The issue here is that (x = v) can evaluate to "v", but very often we're
not interested to use the assignment expression result. When we have an
explicit assignment, the compiler won't complain that the result of this
expression is unused, but given that the added barrier requires that we
make this macro evaluate explicitly to a value, clang complains.

Fix this by adding "_v = _v" at the last line of the macro, thus
performing what would appear like an effect-less assignment, but
actually tricks clang into thinking we are evaluating to an assignment
expression, thus suppressing the warning.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculfhash: add assertions on node alignment
Mathieu Desnoyers [Thu, 14 Feb 2013 16:36:43 +0000 (11:36 -0500)] 
rculfhash: add assertions on node alignment

I've had a report of someone running into issues with the RCU lock-free
hash table by embedding the struct cds_lfht_node into a packed structure
by mistake, thus not respecting alignment requirements stated in
urcu/rculfhash.h. Assertions on "replace" and "add" operations should
catch this, but I notice that we should add assertions on the
REMOVAL_OWNER_FLAG to cover all possible misalignments.

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoSpelling cleanups within comments and documentation
Etienne Bergeron [Wed, 13 Feb 2013 02:33:16 +0000 (21:33 -0500)] 
Spelling cleanups within comments and documentation

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix configure checks for Tile
Simon Marchi [Tue, 12 Feb 2013 00:10:44 +0000 (19:10 -0500)] 
Fix configure checks for Tile

The previous method of checking whether the architecture is TileGx or
not was buggy. urcu/arch/tile.h included urcu/arch/gcc.h, which was not
installed on the system, causing a configure error. I am not sure why it
worked when I tested commit 1000f1f4204e5fbb337f4ea911f1e29f67df79aa,
maybe some previous partial install or something.

The check is now done earlier, during the configure step and should not
cause any trouble.

Signed-off-by: Simon Marchi <simon.marchi@polymtl.ca>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agouatomic: style fix
Mathieu Desnoyers [Thu, 31 Jan 2013 16:31:39 +0000 (11:31 -0500)] 
uatomic: style fix

- Functions that don't take arguments should be "void" in C, otherwise
  those functions can take a variable number of arguments.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agodoc/cds-api.txt: expand documentation
Mathieu Desnoyers [Sat, 26 Jan 2013 15:51:48 +0000 (10:51 -0500)] 
doc/cds-api.txt: expand documentation

Expand explanations, reorder items to have all wait-free descriptions
first, so that the rculfqueue API comes last, since it is less
featureful and is the only API of the queues/stacks to actually rely on
RCU.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoREADME: document each API file
Mathieu Desnoyers [Sat, 26 Jan 2013 15:51:31 +0000 (10:51 -0500)] 
README: document each API file

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoREADME: reorganize
Mathieu Desnoyers [Sat, 26 Jan 2013 15:48:28 +0000 (10:48 -0500)] 
README: reorganize

Move debug build options, and smp support description, to end of README

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoAdd compilation support for the TileGX architecture
Simon Marchi [Thu, 24 Jan 2013 20:40:54 +0000 (15:40 -0500)] 
Add compilation support for the TileGX architecture

This patch adds compilation support for the TileGx architecture. Since
the tests were not ran on other architectures of the Tile family
(Tile64, TIlepro), errors are triggered during compilation if the
architecture is another Tile arch.

Signed-off-by: Simon Marchi <simon.marchi@polymtl.ca>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agowfstack: add nonblocking to _LGPL_SOURCE API
Mathieu Desnoyers [Sun, 20 Jan 2013 21:59:36 +0000 (16:59 -0500)] 
wfstack: add nonblocking to _LGPL_SOURCE API

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoDiscourage use of pthread_atfork() for call_rcu handlers
Mathieu Desnoyers [Wed, 26 Dec 2012 17:18:06 +0000 (12:18 -0500)] 
Discourage use of pthread_atfork() for call_rcu handlers

Discourage use of glibc pthread_atfork() for call_rcu handlers due to
its inappropriate assumptions about single-threadedness while pthread
atfork handlers are executing. This results in hangs within the glibc
memory allocator.

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agoFix call_rcu fork handling
Mathieu Desnoyers [Wed, 19 Dec 2012 00:31:21 +0000 (19:31 -0500)] 
Fix call_rcu fork handling

Fix call_rcu fork handling by putting all call_rcu threads in a
quiescent state before fork (paused state), and unpausing them when the
parent returns from fork.

On the child, everything will run fine as long as we don't issue fork()
from a call_rcu callback.

Side-note: pthread_atfork is not appropriate when using with multithread
and malloc/free. The glibc malloc implementation sadly expects that all
malloc/free are executed from the context of a single thread while
pthread atfork handlers are running, which leads to interesting hang in
glibc.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agotest: fork handling
Mathieu Desnoyers [Tue, 18 Dec 2012 04:43:14 +0000 (23:43 -0500)] 
test: fork handling

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 years agorculfhash: add cds_lfht_replace to the write operations in the comments
Lai Jiangshan [Thu, 20 Dec 2012 11:13:57 +0000 (06:13 -0500)] 
rculfhash: add cds_lfht_replace to the write operations in the comments

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
This page took 0.042785 seconds and 4 git commands to generate.