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

