From patchwork Tue Apr 20 08:44:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Loftus, Ciara" X-Patchwork-Id: 91827 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5BAE4A0547; Tue, 20 Apr 2021 10:45:01 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C2F2041650; Tue, 20 Apr 2021 10:44:59 +0200 (CEST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mails.dpdk.org (Postfix) with ESMTP id 11427415D0 for ; Tue, 20 Apr 2021 10:44:55 +0200 (CEST) IronPort-SDR: Zgsjb4Mb0gSEAGETlNOetD03d+WPqZJ3ukrQGjPfBqxJTrgMcd1m/Z+pmRQ3JPon5wJeOZQcxP zfMbzhjyuwJA== X-IronPort-AV: E=McAfee;i="6200,9189,9959"; a="195584161" X-IronPort-AV: E=Sophos;i="5.82,236,1613462400"; d="scan'208";a="195584161" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2021 01:44:54 -0700 IronPort-SDR: kIYwz4uCR/HyNeQ8SY7J3jSscTsaQBZIUf7JxQTv2ZxBv3GsJBBlLIIxJ5yQd27g/BjQZmvPNb zqPFhXOQVRzA== X-IronPort-AV: E=Sophos;i="5.82,236,1613462400"; d="scan'208";a="463043234" Received: from silpixa00399839.ir.intel.com (HELO silpixa00399839.ger.corp.intel.com) ([10.237.222.249]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Apr 2021 01:44:53 -0700 From: Ciara Loftus To: dev@dpdk.org Cc: Ciara Loftus Date: Tue, 20 Apr 2021 09:44:31 +0100 Message-Id: <20210420084431.6417-2-ciara.loftus@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210420084431.6417-1-ciara.loftus@intel.com> References: <20210420084431.6417-1-ciara.loftus@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 2/2] net/af_xdp: only use recvfrom if busy polling is enabled X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The recvfrom() syscall is only supported by AF_XDP sockets since kernel 5.11. Only use it if busy polling is configured. We can assume a kernel >= 5.11 is in use if busy polling is configured so we can safely call recvfrom() in that case. Fixes: 63e8989fe5a4 ("net/af_xdp: use recvfrom instead of poll syscall") Signed-off-by: Ciara Loftus --- drivers/net/af_xdp/compat.h | 28 ++++++++++++++++++++++------ drivers/net/af_xdp/rte_eth_af_xdp.c | 10 +++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/net/af_xdp/compat.h b/drivers/net/af_xdp/compat.h index 9de9454885..52fd447b69 100644 --- a/drivers/net/af_xdp/compat.h +++ b/drivers/net/af_xdp/compat.h @@ -4,6 +4,7 @@ #include #include +#include #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \ defined(RTE_LIBRTE_AF_XDP_PMD_SHARED_UMEM) @@ -41,10 +42,22 @@ create_shared_socket(struct xsk_socket **xsk_ptr __rte_unused, #endif #ifdef XDP_USE_NEED_WAKEUP -static int -rx_syscall_needed(struct xsk_ring_prod *q, uint32_t busy_budget) +static void +rx_syscall_handler(struct xsk_ring_prod *q, uint32_t busy_budget, + struct pollfd *fds, struct xsk_socket *xsk) { - return xsk_ring_prod__needs_wakeup(q) | busy_budget; + /* we can assume a kernel >= 5.11 is in use if busy polling is enabled + * and thus we can safely use the recvfrom() syscall which is only + * supported for AF_XDP sockets in kernels >= 5.11. + */ + if (busy_budget) { + (void)recvfrom(xsk_socket__fd(xsk), NULL, 0, + MSG_DONTWAIT, NULL, NULL); + return; + } + + if (xsk_ring_prod__needs_wakeup(q)) + (void)poll(fds, 1, 1000); } static int tx_syscall_needed(struct xsk_ring_prod *q) @@ -52,10 +65,13 @@ tx_syscall_needed(struct xsk_ring_prod *q) return xsk_ring_prod__needs_wakeup(q); } #else -static int -rx_syscall_needed(struct xsk_ring_prod *q __rte_unused, uint32_t busy_budget) +static void +rx_syscall_handler(struct xsk_ring_prod *q __rte_unused, uint32_t busy_budget, + struct pollfd *fds __rte_unused, struct xsk_socket *xsk) { - return busy_budget; + if (busy_budget) + (void)recvfrom(xsk_socket__fd(xsk), NULL, 0, + MSG_DONTWAIT, NULL, NULL); } static int tx_syscall_needed(struct xsk_ring_prod *q __rte_unused) diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 8c6cd224a8..0c91a40c4a 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -273,10 +272,8 @@ 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 (rx_syscall_needed(&rxq->fq, rxq->busy_budget)) - (void)recvfrom(xsk_socket__fd(rxq->xsk), NULL, 0, - MSG_DONTWAIT, NULL, NULL); - + rx_syscall_handler(&rxq->fq, rxq->busy_budget, &rxq->fds[0], + rxq->xsk); return 0; } @@ -346,8 +343,7 @@ af_xdp_rx_cp(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) if (nb_pkts == 0) { #if defined(XDP_USE_NEED_WAKEUP) if (xsk_ring_prod__needs_wakeup(fq)) - (void)recvfrom(xsk_socket__fd(rxq->xsk), NULL, 0, - MSG_DONTWAIT, NULL, NULL); + (void)poll(rxq->fds, 1, 1000); #endif return 0; }