[RFC 16/32] event/sw: replace SMP barriers with C11 atomics
Stephen Hemminger
stephen at networkplumber.org
Wed Jul 29 19:54:09 CEST 2026
The write barrier plus plain store publish patterns (cq map count,
port initialized, device started) become release stores; the barrier
after clearing started in sw_stop() becomes a release fence. All are
control path.
Scheduler reads of cq_num_mapped_cqs stay plain loads: acquire loads
would land in the inner scheduling loops on weakly ordered CPUs. The
transient window where a new count is visible before the map entry
on such CPUs predates this change and is unchanged by it; unlink is
covered by the counter handshake.
Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
drivers/event/sw/sw_evdev.c | 29 ++++++++++++++++++++---------
1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index bb6f50e03b..bdb3dff997 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -84,8 +84,10 @@ sw_port_link(struct rte_eventdev *dev, void *port, const uint8_t queues[],
}
q->cq_map[q->cq_num_mapped_cqs] = p->id;
- rte_smp_wmb();
- q->cq_num_mapped_cqs++;
+ /* Release publishes the map entry before the new count */
+ rte_atomic_store_explicit(
+ (uint32_t __rte_atomic *)&q->cq_num_mapped_cqs,
+ q->cq_num_mapped_cqs + 1, rte_memory_order_release);
}
return i;
}
@@ -105,8 +107,14 @@ sw_port_unlink(struct rte_eventdev *dev, void *port, uint8_t queues[],
if (q->cq_map[j] == p->id) {
q->cq_map[j] =
q->cq_map[q->cq_num_mapped_cqs - 1];
- rte_smp_wmb();
- q->cq_num_mapped_cqs--;
+ /* Release publishes the map update
+ * before the new count
+ */
+ rte_atomic_store_explicit(
+ (uint32_t __rte_atomic *)
+ &q->cq_num_mapped_cqs,
+ q->cq_num_mapped_cqs - 1,
+ rte_memory_order_release);
unlinked++;
p->num_qids_mapped--;
@@ -208,8 +216,9 @@ sw_port_setup(struct rte_eventdev *dev, uint8_t port_id,
}
dev->data->ports[port_id] = p;
- rte_smp_wmb();
- p->initialized = 1;
+ /* Release publishes the port setup before initialized flag */
+ rte_atomic_store_explicit((uint8_t __rte_atomic *)&p->initialized, 1,
+ rte_memory_order_release);
return 0;
}
@@ -815,8 +824,9 @@ sw_start(struct rte_eventdev *dev)
if (sw_xstats_init(sw) < 0)
return -EINVAL;
- rte_smp_wmb();
- sw->started = 1;
+ /* Release publishes device state before the started flag */
+ rte_atomic_store_explicit((uint8_t __rte_atomic *)&sw->started, 1,
+ rte_memory_order_release);
return 0;
}
@@ -845,7 +855,8 @@ sw_stop(struct rte_eventdev *dev)
sw_clean_qid_iqs(dev);
sw_xstats_uninit(sw);
sw->started = 0;
- rte_smp_wmb();
+ /* Order the started store before re-enabling the service */
+ rte_atomic_thread_fence(rte_memory_order_release);
if (runstate == 1)
rte_service_runstate_set(sw->service_id, 1);
--
2.53.0
More information about the dev
mailing list