net/af_xdp: fix trigger for syscall on Tx
authorCiara Loftus <ciara.loftus@intel.com>
Tue, 20 Apr 2021 08:44:30 +0000 (09:44 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 20 Apr 2021 10:09:33 +0000 (12:09 +0200)
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: 055a393626ed ("net/af_xdp: prefer busy polling")

Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
drivers/net/af_xdp/compat.h
drivers/net/af_xdp/rte_eth_af_xdp.c

index 545c8aa..9de9454 100644 (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
index 6e44a21..8c6cd22 100644 (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 */