[lttng-dev] [PATCH V2] urcu: avoid false sharing for rcu_gp_ctr
Lai Jiangshan
laijs at cn.fujitsu.com
Wed Dec 12 04:58:55 EST 2012
On 12/11/2012 08:38 PM, Mathieu Desnoyers wrote:
> * Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
>> From 66f50786b9d5f1bcf2ad56e3a9ab905005c6cd90 Mon Sep 17 00:00:00 2001
>> From: Lai Jiangshan <laijs at cn.fujitsu.com>
>> Date: Tue, 11 Dec 2012 14:24:44 +0800
>> Subject: [PATCH] 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 at 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 at 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 at 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 at 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 at 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
>>
>> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
>> ---
>> Makefile.am | 10 +++++-----
>> compat_rcu_gp.lds | 25 +++++++++++++++++++++++++
>> compat_rcu_gp_bp.lds | 24 ++++++++++++++++++++++++
>> compat_rcu_gp_mb.lds | 25 +++++++++++++++++++++++++
>> compat_rcu_gp_qsbr.lds | 25 +++++++++++++++++++++++++
>> compat_rcu_gp_signal.lds | 25 +++++++++++++++++++++++++
>> urcu-bp.c | 14 ++++----------
>> urcu-qsbr.c | 35 +++++++++++++++--------------------
>> urcu.c | 34 +++++++++++++---------------------
>> urcu/map/urcu-bp.h | 3 +--
>> urcu/map/urcu-qsbr.h | 3 +--
>> urcu/map/urcu.h | 9 +++------
>> urcu/static/urcu-bp.h | 23 ++++++++++++++---------
>> urcu/static/urcu-qsbr.h | 39 ++++++++++++++++++++++++---------------
>> urcu/static/urcu.h | 38 ++++++++++++++++++++++++--------------
>> 15 files changed, 228 insertions(+), 104 deletions(-)
>> create mode 100644 compat_rcu_gp.lds
>> create mode 100644 compat_rcu_gp_bp.lds
>> create mode 100644 compat_rcu_gp_mb.lds
>> create mode 100644 compat_rcu_gp_qsbr.lds
>> create mode 100644 compat_rcu_gp_signal.lds
>>
>> diff --git a/Makefile.am b/Makefile.am
>> index 0a4d357..b2b7b6a 100644
>> --- a/Makefile.am
>> +++ b/Makefile.am
>> @@ -56,21 +56,21 @@ lib_LTLIBRARIES = liburcu-common.la \
>> #
>> liburcu_common_la_SOURCES = wfqueue.c wfcqueue.c wfstack.c $(COMPAT)
>>
>> -liburcu_la_SOURCES = urcu.c urcu-pointer.c $(COMPAT)
>> +liburcu_la_SOURCES = urcu.c urcu-pointer.c compat_rcu_gp.lds $(COMPAT)
>
> Hrm, I tried your patch with "make V=1", and have not found any use of
> those "lds" files. I'm not sure adding them as SOURCES is enough.
Use liburcu_mb_la_LDFLAGS = -Xlinker compat_rcu_gp_mb.lds instead!
Result(nm .libs/liburcu-mb.so):
00000000002046e0 D rcu_flavor_mb
0000000000204a80 D rcu_gp_ctr_mb
0000000000204a88 A rcu_gp_futex_mb
0000000000204c60 b rcu_gp_lock
0000000000204a80 D rcu_gp_mb
The type "A" makes me nervous, Do we expect this?
And a new problem:
liburcu.so is RCU_MB actually in my system,
but compat_rcu_gp.lds uses rcu_gp_memb(RCU_MEMBARRIER),
it can't work in my system, how to fix it?
>
>> liburcu_la_LIBADD = liburcu-common.la
>>
>> -liburcu_qsbr_la_SOURCES = urcu-qsbr.c urcu-pointer.c $(COMPAT)
>> +liburcu_qsbr_la_SOURCES = urcu-qsbr.c urcu-pointer.c compat_rcu_gp_qsbr.lds $(COMPAT)
>> liburcu_qsbr_la_LIBADD = liburcu-common.la
>>
>> -liburcu_mb_la_SOURCES = urcu.c urcu-pointer.c $(COMPAT)
>> +liburcu_mb_la_SOURCES = urcu.c urcu-pointer.c compat_rcu_gp_mb.lds $(COMPAT)
>> liburcu_mb_la_CFLAGS = -DRCU_MB
>> liburcu_mb_la_LIBADD = liburcu-common.la
More information about the lttng-dev
mailing list