For zero-copy M2S rings, ring->head is updated by the receiver
and eth_memif_rx_zc function is called in the context of
receiving thread. The loads in the receiver do not need to
synchronize with its own stores.

Signed-off-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>
Reviewed-by: Phil Yang <phil.y...@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.w...@arm.com>
---
 drivers/net/memif/rte_eth_memif.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/net/memif/rte_eth_memif.c 
b/drivers/net/memif/rte_eth_memif.c
index 96db76121..404c86ae8 100644
--- a/drivers/net/memif/rte_eth_memif.c
+++ b/drivers/net/memif/rte_eth_memif.c
@@ -514,11 +514,11 @@ eth_memif_rx_zc(void *queue, struct rte_mbuf **bufs, 
uint16_t nb_pkts)
 
 /* Supply master with new buffers */
 refill:
-       /* The ring->head acts as a guard variable between Tx and Rx
-        * threads, so using load-acquire pairs with store-release
-        * to synchronize it between threads.
+       /* ring->head is updated by the receiver and this function
+        * is called in the context of receiver thread. The loads in
+        * the receiver do not need to synchronize with its own stores.
         */
-       head = __atomic_load_n(&ring->head, __ATOMIC_ACQUIRE);
+       head = __atomic_load_n(&ring->head, __ATOMIC_RELAXED);
        n_slots = ring_size - head + mq->last_tail;
 
        if (n_slots < 32)
@@ -543,6 +543,10 @@ eth_memif_rx_zc(void *queue, struct rte_mbuf **bufs, 
uint16_t nb_pkts)
                        (uint8_t *)proc_private->regions[d0->region]->addr;
        }
 no_free_mbufs:
+       /* The ring->head acts as a guard variable between Tx and Rx
+        * threads, so using store-release pairs with load-acquire
+        * in function eth_memif_tx.
+        */
        __atomic_store_n(&ring->head, head, __ATOMIC_RELEASE);
 
        mq->n_pkts += n_rx_pkts;
-- 
2.17.1

Reply via email to