net/af_xdp: fix trigger for syscall on Tx

The send() syscall on the Tx path is not concerned with busy polling
and as such its invocation should not depend on whether or not it is
configured. Fix this by distinguishing the conditions necessary for
syscalls on the Rx and Tx paths individually.

Fixes: 055a393626 ("net/af_xdp: prefer busy polling")

Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
This commit is contained in:
Ciara Loftus 2021-04-20 09:44:30 +01:00 committed by Ferruh Yigit
parent be1fb9fe3c
commit 2aa51cdd55
2 changed files with 14 additions and 4 deletions

View File

@ -42,14 +42,24 @@ create_shared_socket(struct xsk_socket **xsk_ptr __rte_unused,
#ifdef XDP_USE_NEED_WAKEUP
static int
syscall_needed(struct xsk_ring_prod *q, uint32_t busy_budget)
rx_syscall_needed(struct xsk_ring_prod *q, uint32_t busy_budget)
{
return xsk_ring_prod__needs_wakeup(q) | busy_budget;
}
static int
tx_syscall_needed(struct xsk_ring_prod *q)
{
return xsk_ring_prod__needs_wakeup(q);
}
#else
static int
syscall_needed(struct xsk_ring_prod *q __rte_unused, uint32_t busy_budget)
rx_syscall_needed(struct xsk_ring_prod *q __rte_unused, uint32_t busy_budget)
{
return busy_budget;
}
static int
tx_syscall_needed(struct xsk_ring_prod *q __rte_unused)
{
return 1;
}
#endif

View File

@ -273,7 +273,7 @@ af_xdp_rx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
nb_pkts = xsk_ring_cons__peek(rx, nb_pkts, &idx_rx);
if (nb_pkts == 0) {
if (syscall_needed(&rxq->fq, rxq->busy_budget))
if (rx_syscall_needed(&rxq->fq, rxq->busy_budget))
(void)recvfrom(xsk_socket__fd(rxq->xsk), NULL, 0,
MSG_DONTWAIT, NULL, NULL);
@ -456,7 +456,7 @@ kick_tx(struct pkt_tx_queue *txq, struct xsk_ring_cons *cq)
pull_umem_cq(umem, XSK_RING_CONS__DEFAULT_NUM_DESCS, cq);
if (syscall_needed(&txq->tx, txq->pair->busy_budget))
if (tx_syscall_needed(&txq->tx))
while (send(xsk_socket__fd(txq->pair->xsk), NULL,
0, MSG_DONTWAIT) < 0) {
/* some thing unexpected */