]> git.droids-corp.org - dpdk.git/commitdiff
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 545c8aa395e076c76dad05a2b6276892f35f0477..9de94548850f8a575db420eb8c6d9964ae03d9c1 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 6e44a21c644dfc976f9e813c9d9c7c55247e7e5f..8c6cd224a81e390eb76b67943916ca6220fb5edf 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 */