From: Mathieu Desnoyers Date: Wed, 6 Sep 2017 20:35:59 +0000 (-0400) Subject: Fix: don't use membarrier SHARED syscall command in liburcu-bp X-Git-Tag: v0.9.5~2 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=d4dae7fc4a6fcb4c88c65a2445ee1ddc7a8ac500;p=urcu.git 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 --- diff --git a/urcu-bp.c b/urcu-bp.c index d0bfb0d..9c7da3d 100644 --- a/urcu-bp.c +++ b/urcu-bp.c @@ -581,6 +581,17 @@ void urcu_bp_thread_exit_notifier(void *rcu_key) rcu_bp_unregister(rcu_key); } +static +void rcu_sys_membarrier_status(int available) +{ + /* + * membarrier has blocking behavior, which changes the + * application behavior too much compared to using barriers when + * synchronize_rcu is used repeatedly (without using call_rcu). + * Don't use membarrier for now. + */ +} + static void rcu_bp_init(void) { @@ -593,9 +604,8 @@ void rcu_bp_init(void) if (ret) abort(); ret = membarrier(MEMBARRIER_CMD_QUERY, 0); - if (ret >= 0 && (ret & MEMBARRIER_CMD_SHARED)) { - urcu_bp_has_sys_membarrier = 1; - } + rcu_sys_membarrier_status(ret >= 0 + && (ret & MEMBARRIER_CMD_SHARED)); initialized = 1; } mutex_unlock(&init_lock);