diff mbox series

[v2,5/8] net/memif: relax the load of ring head pointer for M2S zc ring

Message ID 20200928190334.40624-5-honnappa.nagarahalli@arm.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers show
Series [v2,1/8] net/memif: do not update local copy of tail in tx function | expand

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Honnappa Nagarahalli Sept. 28, 2020, 7:03 p.m. UTC
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.nagarahalli@arm.com>
Reviewed-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/memif/rte_eth_memif.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
diff mbox series

Patch

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;