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:
parent
9e14c024d1
commit
5198cb1c25
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user