net/mlx5: revert mbuf address calculation for x86

When replenishing mbufs on Rx, buffer address (mbuf->buf_addr) should be
loaded. non-x86 processors (mostly RISC such as ARM and Power) are more
vulnerable to load stall. For x86, reducing the number of instructions
seems to matter most.

For x86, this is simply a load but for other architectures, it is
calculated from the address of mbuf structure by rte_mbuf_buf_addr()
without having to load the first cacheline of the mbuf.

Fixes: 12d468a62b ("net/mlx5: fix instruction hotspot on replenishing Rx buffer")
Cc: stable@dpdk.org

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Acked-by: Shahaf Shuler <shahafs@mellanox.com>
This commit is contained in:
Yongseok Koh 2019-03-25 12:13:10 -07:00 committed by Ferruh Yigit
parent 219a6e74ca
commit 9c55c6bd86

View File

@ -102,9 +102,21 @@ mlx5_rx_replenish_bulk_mbuf(struct mlx5_rxq_data *rxq, uint16_t n)
return;
}
for (i = 0; i < n; ++i) {
void *buf_addr = rte_mbuf_buf_addr(elts[i], rxq->mp);
void *buf_addr;
/*
* Load the virtual address for Rx WQE. non-x86 processors
* (mostly RISC such as ARM and Power) are more vulnerable to
* load stall. For x86, reducing the number of instructions
* seems to matter most.
*/
#ifdef RTE_ARCH_X86_64
buf_addr = elts[i]->buf_addr;
assert(buf_addr == rte_mbuf_buf_addr(elts[i], rxq->mp));
#else
buf_addr = rte_mbuf_buf_addr(elts[i], rxq->mp);
assert(buf_addr == elts[i]->buf_addr);
#endif
wq[i].addr = rte_cpu_to_be_64((uintptr_t)buf_addr +
RTE_PKTMBUF_HEADROOM);
/* If there's only one MR, no need to replace LKey in WQE. */