From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5DECBA00BE; Fri, 12 Jun 2020 16:39:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 817A61BFB6; Fri, 12 Jun 2020 16:39:06 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 71D1C1BF46 for ; Fri, 12 Jun 2020 16:39:04 +0200 (CEST) IronPort-SDR: 3dcRw9h5ZGxD6T7/aaA6G1daMS9hkTDqs87MM3dLRovY6SDuDDaUPjdMURWH9dbaovD3zImgPx 2FgvTHXquBjQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2020 07:39:03 -0700 IronPort-SDR: TMDrdKT8hupGB+7Qt4nbJ6CRJOYzQx7UgUbas6cadyhd/gOVvXf8CY1ZWBgROJAgYo1l0OBGJ0 f+9dqDPZeoWw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,503,1583222400"; d="scan'208";a="350540473" Received: from silpixa00399839.ir.intel.com (HELO localhost.localdomain) ([10.237.222.8]) by orsmga001.jf.intel.com with ESMTP; 12 Jun 2020 07:39:01 -0700 From: Ciara Loftus To: dev@dpdk.org Cc: xiaolong.ye@intel.com, magnus.karlsson@intel.com, Ciara Loftus Date: Fri, 12 Jun 2020 14:17:46 +0000 Message-Id: <20200612141746.9450-1-ciara.loftus@intel.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] net/af_xdp: optimisations to improve packet loss X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" This commit makes some changes to the AF_XDP PMD in an effort to improve its packet loss characteristics. 1. In the case of failed transmission due to inability to reserve a tx descriptor, the PMD now pulls from the completion ring, issues a syscall in which the kernel attempts to complete outstanding tx operations, then tries to reserve the tx descriptor again. Prior to this we dropped the packet after the syscall and didn't try to re-reserve. 2. During completion ring cleanup, always pull as many entries as possible from the ring as opposed to the batch size or just how many packets we're going to attempt to send. Keeping the completion ring emptier should reduce failed transmissions in the kernel, as the kernel requires space in the completion ring to successfully tx. 3. Size the fill ring as twice the receive ring size which may help reduce allocation failures in the driver. With these changes, a benchmark which measured the packet rate at which 0.01% packet loss could be reached improved from ~0.1G to ~3Gbps. Signed-off-by: Ciara Loftus --- drivers/net/af_xdp/rte_eth_af_xdp.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 06124ba789..4c23bbdf7d 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -396,6 +396,8 @@ kick_tx(struct pkt_tx_queue *txq) { struct xsk_umem_info *umem = txq->umem; + pull_umem_cq(umem, XSK_RING_CONS__DEFAULT_NUM_DESCS); + #if defined(XDP_USE_NEED_WAKEUP) if (xsk_ring_prod__needs_wakeup(&txq->tx)) #endif @@ -407,11 +409,9 @@ kick_tx(struct pkt_tx_queue *txq) /* pull from completion queue to leave more space */ if (errno == EAGAIN) - pull_umem_cq(umem, ETH_AF_XDP_TX_BATCH_SIZE); + pull_umem_cq(umem, + XSK_RING_CONS__DEFAULT_NUM_DESCS); } -#ifndef XDP_UMEM_UNALIGNED_CHUNK_FLAG - pull_umem_cq(umem, ETH_AF_XDP_TX_BATCH_SIZE); -#endif } #if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG) @@ -428,7 +428,7 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) struct xdp_desc *desc; uint64_t addr, offset; - pull_umem_cq(umem, nb_pkts); + pull_umem_cq(umem, XSK_RING_CONS__DEFAULT_NUM_DESCS); for (i = 0; i < nb_pkts; i++) { mbuf = bufs[i]; @@ -436,7 +436,9 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) if (mbuf->pool == umem->mb_pool) { if (!xsk_ring_prod__reserve(&txq->tx, 1, &idx_tx)) { kick_tx(txq); - goto out; + if (!xsk_ring_prod__reserve(&txq->tx, 1, + &idx_tx)) + goto out; } desc = xsk_ring_prod__tx_desc(&txq->tx, idx_tx); desc->len = mbuf->pkt_len; @@ -758,7 +760,7 @@ xsk_umem_info *xdp_umem_configure(struct pmd_internals *internals __rte_unused, struct xsk_umem_info *umem; int ret; struct xsk_umem_config usr_config = { - .fill_size = ETH_AF_XDP_DFLT_NUM_DESCS, + .fill_size = ETH_AF_XDP_DFLT_NUM_DESCS * 2, .comp_size = ETH_AF_XDP_DFLT_NUM_DESCS, .flags = XDP_UMEM_UNALIGNED_CHUNK_FLAG}; void *base_addr = NULL; @@ -867,7 +869,7 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq, struct xsk_socket_config cfg; struct pkt_tx_queue *txq = rxq->pair; int ret = 0; - int reserve_size = ETH_AF_XDP_DFLT_NUM_DESCS / 2; + int reserve_size = ETH_AF_XDP_DFLT_NUM_DESCS; struct rte_mbuf *fq_bufs[reserve_size]; rxq->umem = xdp_umem_configure(internals, rxq); -- 2.17.1