Page MenuHomeFreeBSD

D6986.diff
No OneTemporary

D6986.diff

Index: sys/sys/buf_ring.h
===================================================================
--- sys/sys/buf_ring.h
+++ sys/sys/buf_ring.h
@@ -162,8 +162,34 @@
uint32_t prod_tail;
void *buf;
+ /*
+ * This is a workaround to allow using buf_ring on ARM and ARM64.
+ * ARM64TODO: Fix buf_ring in a generic way.
+ *
+ * Preventing following situation:
+
+ * Core(0) - buf_ring_enqueue() Core(1) - buf_ring_dequeue_sc()
+ * ----------------------------------------- ----------------------------------------------
+ *
+ * cons_head = br->br_cons_head;
+ * atomic_cmpset_acq_32(&br->br_prod_head, ...));
+ * buf = br->br_ring[cons_head]; <see <1>>
+ * br->br_ring[prod_head] = buf;
+ * atomic_store_rel_32(&br->br_prod_tail, ...);
+ * prod_tail = br->br_prod_tail;
+ * if (cons_head == prod_tail)
+ * return (NULL);
+ * <condition is false and code uses invalid(old) buf>`
+ *
+ * <1> Load (on core 1) from br->br_ring[cons_head] can be reordered (speculative readed) by CPU.
+ */
+#if defined(__arm__) || defined(__aarch64__)
+ cons_head = atomic_load_acq_32(&br->br_cons_head);
+ prod_tail = atomic_load_acq_32(&br->br_prod_tail);
+#else
cons_head = br->br_cons_head;
prod_tail = br->br_prod_tail;
+#endif
cons_next = (cons_head + 1) & br->br_cons_mask;
#ifdef PREFETCH_DEFINED

File Metadata

Mime Type
text/plain
Expires
Mon, Sep 30, 10:21 PM (8 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13208575
Default Alt Text
D6986.diff (1 KB)

Event Timeline