summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2019-08-16 20:44:01 +0200
committerRichard Braun <rbraun@sceen.net>2019-08-16 20:44:01 +0200
commitee36387173ae510d23359fd76feee257db9ecbb6 (patch)
tree3da40664a2d5e47fee8b2b5321da43eb998edc1b
parentc238e2f0e32986756c9f0b817dbc7cd924e7f4b3 (diff)
Document and reimplement RCU read-side critical section primitives
-rw-r--r--kern/rcu.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/kern/rcu.h b/kern/rcu.h
index 2cc02398..eb82a6af 100644
--- a/kern/rcu.h
+++ b/kern/rcu.h
@@ -43,6 +43,7 @@
#include <kern/atomic.h>
#include <kern/init.h>
+#include <kern/latomic.h>
#include <kern/rcu_i.h>
#include <kern/rcu_types.h>
#include <kern/thread.h>
@@ -76,17 +77,27 @@ struct rcu_reader;
* that don't sleep, such as spin locks.
*/
+/*
+ * Enter a read-side critical section.
+ *
+ * This is an intra-thread acquire operation.
+ */
static inline void
rcu_read_enter(void)
{
rcu_reader_inc(thread_rcu_reader(thread_self()));
- barrier();
+ latomic_fence(LATOMIC_ACQ_REL);
}
+/*
+ * Leave a read-side critical section.
+ *
+ * This is an intra-thread release operation.
+ */
static inline void
rcu_read_leave(void)
{
- barrier();
+ latomic_fence(LATOMIC_ACQ_REL);
rcu_reader_dec(thread_rcu_reader(thread_self()));
}