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 <[email protected]>
Reviewed-by: Long Li <[email protected]>
Reviewed-by: Wei Hu <[email protected]>
---
 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

Reply via email to