liburcu: Use membarrier private expedited when available
[urcu.git] / src / urcu.c
1 /*
2 * urcu.c
3 *
4 * Userspace RCU library
5 *
6 * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * IBM's contributions to this file may be relicensed under LGPLv2 or later.
24 */
25
26 #define _BSD_SOURCE
27 #define _LGPL_SOURCE
28 #define _DEFAULT_SOURCE
29 #include <stdio.h>
30 #include <pthread.h>
31 #include <signal.h>
32 #include <assert.h>
33 #include <stdlib.h>
34 #include <stdint.h>
35 #include <string.h>
36 #include <errno.h>
37 #include <stdbool.h>
38 #include <poll.h>
39
40 #include "urcu/arch.h"
41 #include "urcu/wfcqueue.h"
42 #include "urcu/map/urcu.h"
43 #include "urcu/static/urcu.h"
44 #include "urcu-pointer.h"
45 #include "urcu/tls-compat.h"
46
47 #include "urcu-die.h"
48 #include "urcu-wait.h"
49
50 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
51 #undef _LGPL_SOURCE
52 #include "urcu.h"
53 #define _LGPL_SOURCE
54
55 /*
56 * If a reader is really non-cooperative and refuses to commit its
57 * rcu_active_readers count to memory (there is no barrier in the reader
58 * per-se), kick it after 10 loops waiting for it.
59 */
60 #define KICK_READER_LOOPS 10
61
62 /*
63 * Active attempts to check for reader Q.S. before calling futex().
64 */
65 #define RCU_QS_ACTIVE_ATTEMPTS 100
66
67 /* If the headers do not support membarrier system call, fall back on RCU_MB */
68 #ifdef __NR_membarrier
69 # define membarrier(...) syscall(__NR_membarrier, __VA_ARGS__)
70 #else
71 # define membarrier(...) -ENOSYS
72 #endif
73
74 enum membarrier_cmd {
75 MEMBARRIER_CMD_QUERY = 0,
76 MEMBARRIER_CMD_SHARED = (1 << 0),
77 /* reserved for MEMBARRIER_CMD_SHARED_EXPEDITED (1 << 1) */
78 /* reserved for MEMBARRIER_CMD_PRIVATE (1 << 2) */
79 MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3),
80 MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4),
81 };
82
83 #ifdef RCU_MEMBARRIER
84 static int init_done;
85 static int has_sys_membarrier_private_expedited;
86
87 #ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
88 int rcu_has_sys_membarrier_memb;
89 #endif
90
91 void __attribute__((constructor)) rcu_init(void);
92 #endif
93
94 #ifdef RCU_MB
95 void rcu_init(void)
96 {
97 }
98 #endif
99
100 #ifdef RCU_SIGNAL
101 static int init_done;
102
103 void __attribute__((constructor)) rcu_init(void);
104 void __attribute__((destructor)) rcu_exit(void);
105 #endif
106
107 /*
108 * rcu_gp_lock ensures mutual exclusion between threads calling
109 * synchronize_rcu().
110 */
111 static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
112 /*
113 * rcu_registry_lock ensures mutual exclusion between threads
114 * registering and unregistering themselves to/from the registry, and
115 * with threads reading that registry from synchronize_rcu(). However,
116 * this lock is not held all the way through the completion of awaiting
117 * for the grace period. It is sporadically released between iterations
118 * on the registry.
119 * rcu_registry_lock may nest inside rcu_gp_lock.
120 */
121 static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
122 struct rcu_gp rcu_gp = { .ctr = RCU_GP_COUNT };
123
124 /*
125 * Written to only by each individual reader. Read by both the reader and the
126 * writers.
127 */
128 DEFINE_URCU_TLS(struct rcu_reader, rcu_reader);
129
130 static CDS_LIST_HEAD(registry);
131
132 /*
133 * Queue keeping threads awaiting to wait for a grace period. Contains
134 * struct gp_waiters_thread objects.
135 */
136 static DEFINE_URCU_WAIT_QUEUE(gp_waiters);
137
138 static void mutex_lock(pthread_mutex_t *mutex)
139 {
140 int ret;
141
142 #ifndef DISTRUST_SIGNALS_EXTREME
143 ret = pthread_mutex_lock(mutex);
144 if (ret)
145 urcu_die(ret);
146 #else /* #ifndef DISTRUST_SIGNALS_EXTREME */
147 while ((ret = pthread_mutex_trylock(mutex)) != 0) {
148 if (ret != EBUSY && ret != EINTR)
149 urcu_die(ret);
150 if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) {
151 cmm_smp_mb();
152 _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
153 cmm_smp_mb();
154 }
155 (void) poll(NULL, 0, 10);
156 }
157 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
158 }
159
160 static void mutex_unlock(pthread_mutex_t *mutex)
161 {
162 int ret;
163
164 ret = pthread_mutex_unlock(mutex);
165 if (ret)
166 urcu_die(ret);
167 }
168
169 #ifdef RCU_MEMBARRIER
170 static void smp_mb_master(void)
171 {
172 if (caa_likely(rcu_has_sys_membarrier_memb)) {
173 if (membarrier(has_sys_membarrier_private_expedited ?
174 MEMBARRIER_CMD_PRIVATE_EXPEDITED :
175 MEMBARRIER_CMD_SHARED, 0))
176 urcu_die(errno);
177 } else {
178 cmm_smp_mb();
179 }
180 }
181 #endif
182
183 #ifdef RCU_MB
184 static void smp_mb_master(void)
185 {
186 cmm_smp_mb();
187 }
188 #endif
189
190 #ifdef RCU_SIGNAL
191 static void force_mb_all_readers(void)
192 {
193 struct rcu_reader *index;
194
195 /*
196 * Ask for each threads to execute a cmm_smp_mb() so we can consider the
197 * compiler barriers around rcu read lock as real memory barriers.
198 */
199 if (cds_list_empty(&registry))
200 return;
201 /*
202 * pthread_kill has a cmm_smp_mb(). But beware, we assume it performs
203 * a cache flush on architectures with non-coherent cache. Let's play
204 * safe and don't assume anything : we use cmm_smp_mc() to make sure the
205 * cache flush is enforced.
206 */
207 cds_list_for_each_entry(index, &registry, node) {
208 CMM_STORE_SHARED(index->need_mb, 1);
209 pthread_kill(index->tid, SIGRCU);
210 }
211 /*
212 * Wait for sighandler (and thus mb()) to execute on every thread.
213 *
214 * Note that the pthread_kill() will never be executed on systems
215 * that correctly deliver signals in a timely manner. However, it
216 * is not uncommon for kernels to have bugs that can result in
217 * lost or unduly delayed signals.
218 *
219 * If you are seeing the below pthread_kill() executing much at
220 * all, we suggest testing the underlying kernel and filing the
221 * relevant bug report. For Linux kernels, we recommend getting
222 * the Linux Test Project (LTP).
223 */
224 cds_list_for_each_entry(index, &registry, node) {
225 while (CMM_LOAD_SHARED(index->need_mb)) {
226 pthread_kill(index->tid, SIGRCU);
227 (void) poll(NULL, 0, 1);
228 }
229 }
230 cmm_smp_mb(); /* read ->need_mb before ending the barrier */
231 }
232
233 static void smp_mb_master(void)
234 {
235 force_mb_all_readers();
236 }
237 #endif /* #ifdef RCU_SIGNAL */
238
239 /*
240 * synchronize_rcu() waiting. Single thread.
241 * Always called with rcu_registry lock held. Releases this lock and
242 * grabs it again. Holds the lock when it returns.
243 */
244 static void wait_gp(void)
245 {
246 /*
247 * Read reader_gp before read futex. smp_mb_master() needs to
248 * be called with the rcu registry lock held in RCU_SIGNAL
249 * flavor.
250 */
251 smp_mb_master();
252 /* Temporarily unlock the registry lock. */
253 mutex_unlock(&rcu_registry_lock);
254 if (uatomic_read(&rcu_gp.futex) != -1)
255 goto end;
256 while (futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
257 NULL, NULL, 0)) {
258 switch (errno) {
259 case EWOULDBLOCK:
260 /* Value already changed. */
261 goto end;
262 case EINTR:
263 /* Retry if interrupted by signal. */
264 break; /* Get out of switch. */
265 default:
266 /* Unexpected error. */
267 urcu_die(errno);
268 }
269 }
270 end:
271 /*
272 * Re-lock the registry lock before the next loop.
273 */
274 mutex_lock(&rcu_registry_lock);
275 }
276
277 /*
278 * Always called with rcu_registry lock held. Releases this lock between
279 * iterations and grabs it again. Holds the lock when it returns.
280 */
281 static void wait_for_readers(struct cds_list_head *input_readers,
282 struct cds_list_head *cur_snap_readers,
283 struct cds_list_head *qsreaders)
284 {
285 unsigned int wait_loops = 0;
286 struct rcu_reader *index, *tmp;
287 #ifdef HAS_INCOHERENT_CACHES
288 unsigned int wait_gp_loops = 0;
289 #endif /* HAS_INCOHERENT_CACHES */
290
291 /*
292 * Wait for each thread URCU_TLS(rcu_reader).ctr to either
293 * indicate quiescence (not nested), or observe the current
294 * rcu_gp.ctr value.
295 */
296 for (;;) {
297 if (wait_loops < RCU_QS_ACTIVE_ATTEMPTS)
298 wait_loops++;
299 if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
300 uatomic_dec(&rcu_gp.futex);
301 /* Write futex before read reader_gp */
302 smp_mb_master();
303 }
304
305 cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
306 switch (rcu_reader_state(&index->ctr)) {
307 case RCU_READER_ACTIVE_CURRENT:
308 if (cur_snap_readers) {
309 cds_list_move(&index->node,
310 cur_snap_readers);
311 break;
312 }
313 /* Fall-through */
314 case RCU_READER_INACTIVE:
315 cds_list_move(&index->node, qsreaders);
316 break;
317 case RCU_READER_ACTIVE_OLD:
318 /*
319 * Old snapshot. Leaving node in
320 * input_readers will make us busy-loop
321 * until the snapshot becomes current or
322 * the reader becomes inactive.
323 */
324 break;
325 }
326 }
327
328 #ifndef HAS_INCOHERENT_CACHES
329 if (cds_list_empty(input_readers)) {
330 if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
331 /* Read reader_gp before write futex */
332 smp_mb_master();
333 uatomic_set(&rcu_gp.futex, 0);
334 }
335 break;
336 } else {
337 if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
338 /* wait_gp unlocks/locks registry lock. */
339 wait_gp();
340 } else {
341 /* Temporarily unlock the registry lock. */
342 mutex_unlock(&rcu_registry_lock);
343 caa_cpu_relax();
344 /*
345 * Re-lock the registry lock before the
346 * next loop.
347 */
348 mutex_lock(&rcu_registry_lock);
349 }
350 }
351 #else /* #ifndef HAS_INCOHERENT_CACHES */
352 /*
353 * BUSY-LOOP. Force the reader thread to commit its
354 * URCU_TLS(rcu_reader).ctr update to memory if we wait
355 * for too long.
356 */
357 if (cds_list_empty(input_readers)) {
358 if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
359 /* Read reader_gp before write futex */
360 smp_mb_master();
361 uatomic_set(&rcu_gp.futex, 0);
362 }
363 break;
364 } else {
365 if (wait_gp_loops == KICK_READER_LOOPS) {
366 smp_mb_master();
367 wait_gp_loops = 0;
368 }
369 if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
370 /* wait_gp unlocks/locks registry lock. */
371 wait_gp();
372 wait_gp_loops++;
373 } else {
374 /* Temporarily unlock the registry lock. */
375 mutex_unlock(&rcu_registry_lock);
376 caa_cpu_relax();
377 /*
378 * Re-lock the registry lock before the
379 * next loop.
380 */
381 mutex_lock(&rcu_registry_lock);
382 }
383 }
384 #endif /* #else #ifndef HAS_INCOHERENT_CACHES */
385 }
386 }
387
388 void synchronize_rcu(void)
389 {
390 CDS_LIST_HEAD(cur_snap_readers);
391 CDS_LIST_HEAD(qsreaders);
392 DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
393 struct urcu_waiters waiters;
394
395 /*
396 * Add ourself to gp_waiters queue of threads awaiting to wait
397 * for a grace period. Proceed to perform the grace period only
398 * if we are the first thread added into the queue.
399 * The implicit memory barrier before urcu_wait_add()
400 * orders prior memory accesses of threads put into the wait
401 * queue before their insertion into the wait queue.
402 */
403 if (urcu_wait_add(&gp_waiters, &wait) != 0) {
404 /* Not first in queue: will be awakened by another thread. */
405 urcu_adaptative_busy_wait(&wait);
406 /* Order following memory accesses after grace period. */
407 cmm_smp_mb();
408 return;
409 }
410 /* We won't need to wake ourself up */
411 urcu_wait_set_state(&wait, URCU_WAIT_RUNNING);
412
413 mutex_lock(&rcu_gp_lock);
414
415 /*
416 * Move all waiters into our local queue.
417 */
418 urcu_move_waiters(&waiters, &gp_waiters);
419
420 mutex_lock(&rcu_registry_lock);
421
422 if (cds_list_empty(&registry))
423 goto out;
424
425 /*
426 * All threads should read qparity before accessing data structure
427 * where new ptr points to. Must be done within rcu_registry_lock
428 * because it iterates on reader threads.
429 */
430 /* Write new ptr before changing the qparity */
431 smp_mb_master();
432
433 /*
434 * Wait for readers to observe original parity or be quiescent.
435 * wait_for_readers() can release and grab again rcu_registry_lock
436 * interally.
437 */
438 wait_for_readers(&registry, &cur_snap_readers, &qsreaders);
439
440 /*
441 * Must finish waiting for quiescent state for original parity before
442 * committing next rcu_gp.ctr update to memory. Failure to do so could
443 * result in the writer waiting forever while new readers are always
444 * accessing data (no progress). Enforce compiler-order of load
445 * URCU_TLS(rcu_reader).ctr before store to rcu_gp.ctr.
446 */
447 cmm_barrier();
448
449 /*
450 * Adding a cmm_smp_mb() which is _not_ formally required, but makes the
451 * model easier to understand. It does not have a big performance impact
452 * anyway, given this is the write-side.
453 */
454 cmm_smp_mb();
455
456 /* Switch parity: 0 -> 1, 1 -> 0 */
457 CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ RCU_GP_CTR_PHASE);
458
459 /*
460 * Must commit rcu_gp.ctr update to memory before waiting for quiescent
461 * state. Failure to do so could result in the writer waiting forever
462 * while new readers are always accessing data (no progress). Enforce
463 * compiler-order of store to rcu_gp.ctr before load rcu_reader ctr.
464 */
465 cmm_barrier();
466
467 /*
468 *
469 * Adding a cmm_smp_mb() which is _not_ formally required, but makes the
470 * model easier to understand. It does not have a big performance impact
471 * anyway, given this is the write-side.
472 */
473 cmm_smp_mb();
474
475 /*
476 * Wait for readers to observe new parity or be quiescent.
477 * wait_for_readers() can release and grab again rcu_registry_lock
478 * interally.
479 */
480 wait_for_readers(&cur_snap_readers, NULL, &qsreaders);
481
482 /*
483 * Put quiescent reader list back into registry.
484 */
485 cds_list_splice(&qsreaders, &registry);
486
487 /*
488 * Finish waiting for reader threads before letting the old ptr
489 * being freed. Must be done within rcu_registry_lock because it
490 * iterates on reader threads.
491 */
492 smp_mb_master();
493 out:
494 mutex_unlock(&rcu_registry_lock);
495 mutex_unlock(&rcu_gp_lock);
496
497 /*
498 * Wakeup waiters only after we have completed the grace period
499 * and have ensured the memory barriers at the end of the grace
500 * period have been issued.
501 */
502 urcu_wake_all_waiters(&waiters);
503 }
504
505 /*
506 * library wrappers to be used by non-LGPL compatible source code.
507 */
508
509 void rcu_read_lock(void)
510 {
511 _rcu_read_lock();
512 }
513
514 void rcu_read_unlock(void)
515 {
516 _rcu_read_unlock();
517 }
518
519 int rcu_read_ongoing(void)
520 {
521 return _rcu_read_ongoing();
522 }
523
524 void rcu_register_thread(void)
525 {
526 URCU_TLS(rcu_reader).tid = pthread_self();
527 assert(URCU_TLS(rcu_reader).need_mb == 0);
528 assert(!(URCU_TLS(rcu_reader).ctr & RCU_GP_CTR_NEST_MASK));
529
530 mutex_lock(&rcu_registry_lock);
531 assert(!URCU_TLS(rcu_reader).registered);
532 URCU_TLS(rcu_reader).registered = 1;
533 rcu_init(); /* In case gcc does not support constructor attribute */
534 cds_list_add(&URCU_TLS(rcu_reader).node, &registry);
535 mutex_unlock(&rcu_registry_lock);
536 }
537
538 void rcu_unregister_thread(void)
539 {
540 mutex_lock(&rcu_registry_lock);
541 assert(URCU_TLS(rcu_reader).registered);
542 URCU_TLS(rcu_reader).registered = 0;
543 cds_list_del(&URCU_TLS(rcu_reader).node);
544 mutex_unlock(&rcu_registry_lock);
545 }
546
547 #ifdef RCU_MEMBARRIER
548
549 #ifdef CONFIG_RCU_FORCE_SYS_MEMBARRIER
550 static
551 void rcu_sys_membarrier_status(bool available)
552 {
553 if (!available)
554 abort();
555 }
556 #else
557 static
558 void rcu_sys_membarrier_status(bool available)
559 {
560 if (!available)
561 return;
562 rcu_has_sys_membarrier_memb = 1;
563 }
564 #endif
565
566 static
567 void rcu_sys_membarrier_init(void)
568 {
569 bool available = false;
570 int mask;
571
572 mask = membarrier(MEMBARRIER_CMD_QUERY, 0);
573 if (mask >= 0) {
574 if (mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) {
575 if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0))
576 urcu_die(errno);
577 has_sys_membarrier_private_expedited = 1;
578 available = true;
579 } else if (mask & MEMBARRIER_CMD_SHARED) {
580 available = true;
581 }
582 }
583 rcu_sys_membarrier_status(available);
584 }
585
586 void rcu_init(void)
587 {
588 if (init_done)
589 return;
590 init_done = 1;
591 rcu_sys_membarrier_init();
592 }
593 #endif
594
595 #ifdef RCU_SIGNAL
596 static void sigrcu_handler(int signo, siginfo_t *siginfo, void *context)
597 {
598 /*
599 * Executing this cmm_smp_mb() is the only purpose of this signal handler.
600 * It punctually promotes cmm_barrier() into cmm_smp_mb() on every thread it is
601 * executed on.
602 */
603 cmm_smp_mb();
604 _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
605 cmm_smp_mb();
606 }
607
608 /*
609 * rcu_init constructor. Called when the library is linked, but also when
610 * reader threads are calling rcu_register_thread().
611 * Should only be called by a single thread at a given time. This is ensured by
612 * holing the rcu_registry_lock from rcu_register_thread() or by running
613 * at library load time, which should not be executed by multiple
614 * threads nor concurrently with rcu_register_thread() anyway.
615 */
616 void rcu_init(void)
617 {
618 struct sigaction act;
619 int ret;
620
621 if (init_done)
622 return;
623 init_done = 1;
624
625 act.sa_sigaction = sigrcu_handler;
626 act.sa_flags = SA_SIGINFO | SA_RESTART;
627 sigemptyset(&act.sa_mask);
628 ret = sigaction(SIGRCU, &act, NULL);
629 if (ret)
630 urcu_die(errno);
631 }
632
633 void rcu_exit(void)
634 {
635 /*
636 * Don't unregister the SIGRCU signal handler anymore, because
637 * call_rcu threads could still be using it shortly before the
638 * application exits.
639 * Assertion disabled because call_rcu threads are now rcu
640 * readers, and left running at exit.
641 * assert(cds_list_empty(&registry));
642 */
643 }
644
645 #endif /* #ifdef RCU_SIGNAL */
646
647 DEFINE_RCU_FLAVOR(rcu_flavor);
648
649 #include "urcu-call-rcu-impl.h"
650 #include "urcu-defer-impl.h"
This page took 0.041695 seconds and 5 git commands to generate.