net/memif: relax load of ring head for S2M zc ring

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>
This commit is contained in:
Honnappa Nagarahalli 2020-09-28 14:03:33 -05:00 committed by Ferruh Yigit
parent 9e14c024d1
commit 5198cb1c25

View 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); memif_free_stored_mbufs(proc_private, mq);
/* ring type always MEMIF_RING_S2M */ /* ring type always MEMIF_RING_S2M */
/* The ring->head acts as a guard variable between Tx and Rx /* For S2M queues ring->head is updated by the sender and
* threads, so using load-acquire pairs with store-release * this function is called in the context of sending thread.
* to synchronize it between threads. * 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; n_free = ring_size - slot + mq->last_tail;
int used_slots; int used_slots;
@ -812,6 +814,10 @@ eth_memif_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
no_free_slots: no_free_slots:
/* ring type always MEMIF_RING_S2M */ /* 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); __atomic_store_n(&ring->head, slot, __ATOMIC_RELEASE);
/* Send interrupt, if enabled. */ /* Send interrupt, if enabled. */