net/memif: relax load of ring head for S2M zc ring
authorHonnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Mon, 28 Sep 2020 19:03:33 +0000 (14:03 -0500)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:18:47 +0000 (19:18 +0200)
For zero-copy S2M rings, ring->head is updated by the sender and
eth_memif_tx_zc function is called in the context of sending thread.
The loads in the sender 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>
Reviewed-by: Jakub Grajciar <jgrajcia@cisco.com>
drivers/net/memif/rte_eth_memif.c

index 0b64e47..68f3e60 100644 (file)
@@ -752,11 +752,13 @@ eth_memif_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        memif_free_stored_mbufs(proc_private, mq);
 
        /* ring type always MEMIF_RING_S2M */
-       /* 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.
+       /* For S2M queues ring->head is updated by the sender and
+        * this function is called in the context of sending thread.
+        * The loads in the sender do not need to synchronize with
+        * its own stores. Hence, the following load can be a
+        * relaxed load.
         */
-       slot = __atomic_load_n(&ring->head, __ATOMIC_ACQUIRE);
+       slot = __atomic_load_n(&ring->head, __ATOMIC_RELAXED);
        n_free = ring_size - slot + mq->last_tail;
 
        int used_slots;
@@ -812,6 +814,10 @@ eth_memif_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
 no_free_slots:
        /* ring type always MEMIF_RING_S2M */
+       /* 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_rx for S2M rings.
+        */
        __atomic_store_n(&ring->head, slot, __ATOMIC_RELEASE);
 
        /* Send interrupt, if enabled. */