[PATCH v4 05/29] bus/vmbus: replace SMP barriers with C11 memory fences
Stephen Hemminger
stephen at networkplumber.org
Wed Oct 14 00:22:18 CEST 2026
Full barriers order the preceding index store against the following
load of the interrupt mask or pending size and stay seq_cst; read
barriers become acquire fences. Same code generated on x86 and arm64.
The write barrier in rte_vmbus_chan_signal_tx() goes away instead.
Every caller reaches it through vmbus_txbr_write(), which ends in
vmbus_txbr_need_signal() and its full barrier, so the load of the
interrupt mask is already ordered after the write index store.
Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
Reviewed-by: Long Li <longli at microsoft.com>
Reviewed-by: Wei Hu <weh at microsoft.com>
---
drivers/bus/vmbus/vmbus_bufring.c | 4 ++--
drivers/bus/vmbus/vmbus_channel.c | 13 ++++++-------
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/drivers/bus/vmbus/vmbus_bufring.c b/drivers/bus/vmbus/vmbus_bufring.c
index 86dc446786..95f03929cb 100644
--- a/drivers/bus/vmbus/vmbus_bufring.c
+++ b/drivers/bus/vmbus/vmbus_bufring.c
@@ -58,11 +58,11 @@ void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen)
static inline bool
vmbus_txbr_need_signal(const struct vmbus_bufring *vbr, uint32_t old_windex)
{
- rte_smp_mb();
+ rte_atomic_thread_fence(rte_memory_order_seq_cst);
if (vbr->imask)
return false;
- rte_smp_rmb();
+ rte_atomic_thread_fence(rte_memory_order_acquire);
/*
* This is the only case we need to signal when the
diff --git a/drivers/bus/vmbus/vmbus_channel.c b/drivers/bus/vmbus/vmbus_channel.c
index 6887fbad46..90ba3d1ef6 100644
--- a/drivers/bus/vmbus/vmbus_channel.c
+++ b/drivers/bus/vmbus/vmbus_channel.c
@@ -104,10 +104,9 @@ rte_vmbus_chan_signal_tx(struct rte_vmbus_device *dev, const struct vmbus_channe
{
const struct vmbus_br *tbr = &chan->txbr;
- /* Make sure all updates are done before signaling host */
- rte_smp_wmb();
-
- /* If host is ignoring interrupts? */
+ /* vmbus_txbr_write() did a full barrier after the write index
+ * update, no further ordering needed here.
+ */
if (tbr->vbr->imask)
return;
@@ -211,7 +210,7 @@ bool rte_vmbus_chan_rx_empty(const struct vmbus_channel *channel)
{
const struct vmbus_br *br = &channel->rxbr;
- rte_smp_rmb();
+ rte_atomic_thread_fence(rte_memory_order_acquire);
return br->vbr->rindex == br->vbr->windex;
}
@@ -229,13 +228,13 @@ void rte_vmbus_chan_signal_read(struct rte_vmbus_device *dev,
return;
/* Make sure reading of pending happens after new read index */
- rte_smp_mb();
+ rte_atomic_thread_fence(rte_memory_order_seq_cst);
pending_sz = rbr->vbr->pending_send;
if (!pending_sz)
return;
- rte_smp_rmb();
+ rte_atomic_thread_fence(rte_memory_order_acquire);
write_sz = vmbus_br_availwrite(rbr, rbr->vbr->windex);
/* If there was space before then host was not blocked */
--
2.53.0
More information about the dev
mailing list