From: Honnappa Nagarahalli Date: Mon, 28 Sep 2020 19:03:31 +0000 (-0500) Subject: net/memif: relax load of ring head for M2S zc ring X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=3a086c203829e1c258a47a4e02d1511933456e4a;p=dpdk.git net/memif: relax load of ring head for M2S zc ring 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 Reviewed-by: Phil Yang Reviewed-by: Ruifeng Wang Reviewed-by: Jakub Grajciar --- diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index b16c73f231..2a71a7841b 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -514,11 +514,11 @@ next_slot: /* 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 @@ refill: (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;