Page MenuHomeFreeBSD

D23711.id68390.diff
No OneTemporary

D23711.id68390.diff

Index: sys/sys/smr.h
===================================================================
--- sys/sys/smr.h
+++ sys/sys/smr.h
@@ -77,6 +77,70 @@
#define SMR_ASSERT_NOT_ENTERED(smr) \
KASSERT(!SMR_ENTERED(smr), ("In smr section."));
+#define SMR_ASSERT(ex, fn) \
+ KASSERT((ex), (fn ": Assertion " #ex " failed at %s:%d", __FILE__, __LINE__))
+
+/* Type restricting pointer access to force smr accessors. */
+struct smr_ptr {
+ uintptr_t __ptr; /* Do not access directly */
+};
+typedef struct smr_ptr smr_ptr_t;
+
+/*
+ * Read from an SMR protected pointer while in a section.
+ */
+#define smr_entered_load(p, smr) ({ \
+ SMR_ASSERT(SMR_ENTERED((smr)), "smr_entered_load"); \
+ (void *)atomic_load_acq_ptr(&(p)->__ptr); \
+})
+
+/*
+ * Read from an SMR protected pointer while serialized by an
+ * external mechanism. 'ex' should contain an assert that the
+ * external mechanism is held. i.e. mtx_owned()
+ */
+#define smr_serialized_load(p, ex) ({ \
+ SMR_ASSERT(ex, "smr_serialized_load"); \
+ (void *)atomic_load_ptr(&(p)->__ptr); \
+})
+
+/*
+ * Store 'v' to an SMR protected pointer while serialized by an
+ * external mechanism. 'ex' should contain an assert that the
+ * external mechanism is held. i.e. mtx_owned()
+ */
+#define smr_serialized_store(p, v, ex) do { \
+ SMR_ASSERT(ex, "smr_serialized_store"); \
+ atomic_store_rel_ptr(&(p)->__ptr, (uintptr_t)v); \
+} while (0)
+
+/*
+ * swap 'v' with an SMR protected pointer and return the old value
+ * while serialized by an external mechanism. 'ex' should contain
+ * an assert that the external mechanism is provided. i.e. mtx_owned()
+ */
+#define smr_serialized_swap(p, v, ex) ({ \
+ SMR_ASSERT(ex, "smr_serialized_swap"); \
+ /* Release barrier guarantees contents are visible to reader */ \
+ atomic_thread_fence_rel(); \
+ (void *)atomic_swap_ptr(&(p)->__ptr, (uintptr_t)v); \
+})
+
+/*
+ * Read from an SMR protected pointer when no serialization is required
+ * such as in the destructor callback or when the caller guarantees other
+ * mechanisms.
+ */
+#define smr_unserialized_load(p, ex) ({ \
+ SMR_ASSERT(ex, "smr_unserialized_load"); \
+ (void *)atomic_load_ptr(&(p)->__ptr); \
+})
+
+#define smr_unserialized_store(p, v, ex) do { \
+ SMR_ASSERT(ex, "smr_unserialized_store"); \
+ atomic_store_ptr(&(p)->__ptr, (uintptr_t)v); \
+} while (0)
+
/*
* Return the current write sequence number.
*/

File Metadata

Mime Type
text/plain
Expires
Sun, Jan 19, 7:49 PM (19 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15956905
Default Alt Text
D23711.id68390.diff (2 KB)

Event Timeline