projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
qsbr: save two full smp_mb() when the writer is also a reader.
[urcu.git]
/
urcu-qsbr.c
diff --git
a/urcu-qsbr.c
b/urcu-qsbr.c
index b387536adc6ef923d8254934b41955389002f0fc..3f21be3160731979b6f39455b1202ccf00849237 100644
(file)
--- a/
urcu-qsbr.c
+++ b/
urcu-qsbr.c
@@
-106,11
+106,6
@@
static void force_mb_single_thread(struct reader_registry *index)
}
#endif /* #ifdef HAS_INCOHERENT_CACHES */
}
#endif /* #ifdef HAS_INCOHERENT_CACHES */
-static void force_mb_all_threads(void)
-{
- smp_mb();
-}
-
static void wait_for_quiescent_state(void)
{
struct reader_registry *index;
static void wait_for_quiescent_state(void)
{
struct reader_registry *index;
@@
-153,18
+148,18
@@
void synchronize_rcu(void)
* our own quiescent state. This allows using synchronize_rcu() in
* threads registered as readers.
*/
* our own quiescent state. This allows using synchronize_rcu() in
* threads registered as readers.
*/
+ smp_mb();
if (was_online)
if (was_online)
-
_rcu_thread_offline(
);
+
STORE_SHARED(rcu_reader_qs_gp, 0
);
- force_mb_all_threads();
internal_urcu_lock();
STORE_SHARED(urcu_gp_ctr, urcu_gp_ctr + 2);
wait_for_quiescent_state();
internal_urcu_unlock();
internal_urcu_lock();
STORE_SHARED(urcu_gp_ctr, urcu_gp_ctr + 2);
wait_for_quiescent_state();
internal_urcu_unlock();
- force_mb_all_threads();
if (was_online)
if (was_online)
- _rcu_thread_online();
+ _STORE_SHARED(rcu_reader_qs_gp, LOAD_SHARED(urcu_gp_ctr) + 1);
+ smp_mb();
}
/*
}
/*
This page took
0.022706 seconds
and
4
git commands to generate.