From patchwork Wed Mar 5 22:52:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003580 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1811220767B for ; Wed, 5 Mar 2025 22:52:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215153; cv=none; b=Zt/vbb6bPWIllP245XbHHCRH0lc74agSKaUB8Z0JiVIBs/HJ09AR7b/DujVJqRQN2j0vSlazY1BEFcsxYf/LhM8D053wCneh2CyGs3eynIpFIgUxeETy9aD3AJM7ifQ//aohg4gZhCDsogp8ZGNCUACXSvMqX5AYRU/RjnX3+7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215153; c=relaxed/simple; bh=xlfesCAYFJuORciIZ6LM+t4QFT/GvQSC3mgpWimbL/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sHxNa6/gHFIRExOzdiGOMLP68EutsRasulZxsP+o4RRLsqa4m1s1y6wPlO/WVaY8q3RMvh/mtNFXp4u3e1+B1CqJy2sDDgpvswWxPW6Nw2242z40eePYASeYZNlWSNzkuKEQ/tJO7y0NQ7BN3oI0aXhp/a3MAqqZEvjAwsn1s6A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XnMhcNN6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XnMhcNN6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4ED01C4CEE0; Wed, 5 Mar 2025 22:52:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215152; bh=xlfesCAYFJuORciIZ6LM+t4QFT/GvQSC3mgpWimbL/E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XnMhcNN6FmYw2BD57DmHgdTmTxAUKsYhz7p4ysndf5MAf0oosCG8sZS5gfM2e0zpj xGR6UdNaWj2AM13fGIDuxt4dURnkYpGN3vtDWqGa3PcWPGjmVOjmK3tsPaj3Xq6Y2b EJ7rC99vU3Y16gfq/iC+eoMVDGsXPVYYKdQO2RBpgO6z1AaeNJ8pJMgGJyweLACPPt EkqoyLdk5GfwUOybQEphf/rfLdJGcTYh/+E6ALBACrL+bSumPeiFVsp4rymCBNC2/Y 95SBn1X3NUfSwlEwXg5gwv0chO6/H4YA31bWFjeKD6yYOGwa9EIINutNBTbITENK8p MCXmicoIbu2dA== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 01/10] eth: bnxt: use napi_consume_skb() Date: Wed, 5 Mar 2025 14:52:06 -0800 Message-ID: <20250305225215.1567043-2-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Use napi_consume_skb() to improve skb recycling. __bnxt_tx_int() already has the real NAPI passed in budget. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 15c57a06ecaf..f6a26f6f85bb 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -855,7 +855,7 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, next_tx_int: cons = NEXT_TX(cons); - dev_consume_skb_any(skb); + napi_consume_skb(skb, budget); } WRITE_ONCE(txr->tx_cons, cons); From patchwork Wed Mar 5 22:52:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003581 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 95EAE208986 for ; Wed, 5 Mar 2025 22:52:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215153; cv=none; b=ShQQDAejke+CupiaxXujLicsclODtokTraPpXimURYz4hTQiUx8XktsH6Dc6+G50t1sRxcLafayW1rHaGsjYNJj+P1pA4OQ1m+pwnINHCGIQgt+fdO21vbQN0Ok5fQYflfssH4tz8hOoQTEJangOTB75bdUdpw/NdgE/xwNb/ro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215153; c=relaxed/simple; bh=5FwXI0JHZeEs/jdTBFDkRhfXA548Trn5OFBR8o0iA4k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d07h5DOxEVQBmabGju09vPu5wP48nGFBCmAA1+H+y+x4rhr3HqVIFo7aJmEoNw1kTK6zr9Zxqa+wwJLxyXKIkorxZEVAG4aAUfsmsH+wRp5oqfuwqsKijff0odrVp6YM9VTT5LcL20DvL7RDI7eVXKQ6QvjpX/6eug56j4Qp1RI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rUpK3bJb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rUpK3bJb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B89B3C4CEE9; Wed, 5 Mar 2025 22:52:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215153; bh=5FwXI0JHZeEs/jdTBFDkRhfXA548Trn5OFBR8o0iA4k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rUpK3bJbyd3xdLg378hU/WnIaOrKemac4a3I9bz4wmtMdMaLwBK8+fv5YVhe9R29I Pg2VX44dUWpEk74jW8qwrnAia3yUthCBmu9JJwYdWxECxPjrEkwT61BCwzwXgebEsO PrQflikhZS0TQ2RNmrir8Gv/zWBNyYoIU+Voczqk68dnCfc29K2aJKkhCl/RwT3xcb bv4Lf7IBKIznDgFvSqqL1aiFDHkOrkXv99Gb/3H2lIpdd508pozFggLnu8L74iurU4 gTSuIXGqVWSqMA9mSCz5Yn20BaIlkpweJ9if1ox+tk7/Dg8OuScwxs01L1GT9weV/Y P+5dbpN57zhyg== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 02/10] eth: bnxt: don't run xdp programs on fallback traffic Date: Wed, 5 Mar 2025 14:52:07 -0800 Message-ID: <20250305225215.1567043-3-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The XDP program attached to the PF should not be executed on the fallback traffic. Pass the desired dev to bnxt_rx_xdp() and abort if the packet is for a representor. bnxt_rx_xdp() has a lot of arguments already, so presumably adding one more is okay. Compile tested only. Well behaved drivers (nfp) do not execute XDP on fallback traffic, but perhaps this is a matter of opinion rather than a hard rule, therefore I'm not considering this a fix. Signed-off-by: Jakub Kicinski --- v2: - pass dev to bnxt_rx_xdp(), and skip just the BPF execution, to avoid unintentionally skipping the Tx ring handling v1: https://lore.kernel.org/20250226211003.2790916-3-kuba@kernel.org --- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 3 ++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 11 +++++++---- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 8 ++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h index 0122782400b8..752b6cf0022c 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h @@ -17,7 +17,8 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, dma_addr_t mapping, u32 len, struct xdp_buff *xdp); void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget); -bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, +bool bnxt_rx_xdp(struct bnxt *bp, struct net_device *dev, + struct bnxt_rx_ring_info *rxr, u16 cons, struct xdp_buff *xdp, struct page *page, u8 **data_ptr, unsigned int *len, u8 *event); int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index f6a26f6f85bb..94bc9121d3f9 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2036,7 +2036,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, { struct bnxt_napi *bnapi = cpr->bnapi; struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; - struct net_device *dev = bp->dev; + struct net_device *dev; struct rx_cmp *rxcmp; struct rx_cmp_ext *rxcmp1; u32 tmp_raw_cons = *raw_cons; @@ -2159,6 +2159,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, len = flags >> RX_CMP_LEN_SHIFT; dma_addr = rx_buf->mapping; + dev = bp->dev; + if (cmp_type == CMP_TYPE_RX_L2_CMP) + dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); + if (bnxt_xdp_attached(bp, rxr)) { bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); if (agg_bufs) { @@ -2172,7 +2176,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } if (xdp_active) { - if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { + if (bnxt_rx_xdp(bp, dev, rxr, cons, &xdp, data, &data_ptr, &len, + event)) { rc = 1; goto next_rx; } @@ -2239,8 +2244,6 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, skb_set_hash(skb, le32_to_cpu(rxcmp->rx_cmp_rss_hash), type); } - if (cmp_type == CMP_TYPE_RX_L2_CMP) - dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); skb->protocol = eth_type_trans(skb, dev); if (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX) { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index e6c64e4bd66c..aba49ddb0e66 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -221,7 +221,8 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr, * true - packet consumed by XDP and new buffer is allocated. * false - packet should be passed to the stack. */ -bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, +bool bnxt_rx_xdp(struct bnxt *bp, struct net_device *dev, + struct bnxt_rx_ring_info *rxr, u16 cons, struct xdp_buff *xdp, struct page *page, u8 **data_ptr, unsigned int *len, u8 *event) { @@ -246,7 +247,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, /* BNXT_RX_PAGE_MODE(bp) when XDP enabled */ orig_data = xdp->data; - act = bpf_prog_run_xdp(xdp_prog, xdp); + if (bp->dev == dev) + act = bpf_prog_run_xdp(xdp_prog, xdp); + else /* packet is for a VF representor */ + act = XDP_PASS; tx_avail = bnxt_tx_avail(bp, txr); /* If the tx ring is not full, we must not update the rx producer yet From patchwork Wed Mar 5 22:52:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003582 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E6C2E209684 for ; Wed, 5 Mar 2025 22:52:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215154; cv=none; b=Y1UPbAIYuxn8ZznKfxJ0qkPkPNun4TGsFckKTwmE3zSoux/NAaXrB9uhzEcYsVmQHoKPk0KNZuS+V5dEN+g93AXFf+aQziLDQiUPrKo8kbgGeVghDjjOkDtuqdFktSE3QrHbj02lWC6pGnSz5J18SPDUQTJQ2o7i/Z0bdzPHRwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215154; c=relaxed/simple; bh=mn1Be16fzDSwbQI6VkqqgHlKFNjuHngeyCHLUcGNyTI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aJsn90nGive7rNQIpfWW5pZE4IlXPoEP355hk0IlLVhaoo5aKT1EmOrx4bksVWvr0SCLotIKW5zixa72vsVGRp6uzftVRUBrRZQqXhO5q/PD4IJ5TjPnYzGDCNhN4v0Mm1/l4nsqC2NNWGBtXarXOasIXLE+EdTEi7t5g0iHg6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rhRf22fl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rhRf22fl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E638C4CED1; Wed, 5 Mar 2025 22:52:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215153; bh=mn1Be16fzDSwbQI6VkqqgHlKFNjuHngeyCHLUcGNyTI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rhRf22flosiYeiaoZcedpjBJFoq7MtE8dbSQk9Nmm6UZW71OaLuRUCWBWzYS1m5jF nKAki7KH8BN5LLnaHY39NqSz0Kayda7ZTyXNcFlHJlpJqWLQsd8jYS7yWVIepJJp6H i4IG+m6v9hiev9UkRs6cKPxW7VySOrhegG7NpqfDnWwwJ3rp7xqG3NZGq+lfZU80A4 zCACzW33PDFQehO03Xhc1aP2BFoummeS5bXAYHmKH9/HEZTZK5Ly9SDT951xv/a45M Nm5+C69lURiSVdZBTYsYuR+qX1Z3TQyTYw41onWh+pHCeZR1RTObpfRU15EnFVEI7x vgvr1zWyTXgcg== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 03/10] eth: bnxt: rename ring_err_stats -> ring_drv_stats Date: Wed, 5 Mar 2025 14:52:08 -0800 Message-ID: <20250305225215.1567043-4-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org We will soon store non-error stats to the ring struct. Rename them to "drv" stats, as these are all maintained by the driver (even if partially based on info from descriptors). Pure rename using sed. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 8 ++++---- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 14 ++++++------- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 20 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index e85b5ce94f58..34f23ddd4d71 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -1136,7 +1136,7 @@ struct bnxt_sw_stats { struct bnxt_cmn_sw_stats cmn; }; -struct bnxt_total_ring_err_stats { +struct bnxt_total_ring_drv_stats { u64 rx_total_l4_csum_errors; u64 rx_total_resets; u64 rx_total_buf_errors; @@ -2538,7 +2538,7 @@ struct bnxt { u8 pri2cos_idx[8]; u8 pri2cos_valid; - struct bnxt_total_ring_err_stats ring_err_stats_prev; + struct bnxt_total_ring_drv_stats ring_drv_stats_prev; u16 hwrm_max_req_len; u16 hwrm_max_ext_req_len; @@ -2936,8 +2936,8 @@ int bnxt_half_open_nic(struct bnxt *bp); void bnxt_half_close_nic(struct bnxt *bp); void bnxt_reenable_sriov(struct bnxt *bp); void bnxt_close_nic(struct bnxt *, bool, bool); -void bnxt_get_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats); +void bnxt_get_ring_drv_stats(struct bnxt *bp, + struct bnxt_total_ring_drv_stats *stats); bool bnxt_rfs_capable(struct bnxt *bp, bool new_rss_ctx); int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words, u32 *reg_buf); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 94bc9121d3f9..4b85f224c344 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -12941,7 +12941,7 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, /* Save ring stats before shutdown */ if (bp->bnapi && irq_re_init) { bnxt_get_ring_stats(bp, &bp->net_stats_prev); - bnxt_get_ring_err_stats(bp, &bp->ring_err_stats_prev); + bnxt_get_ring_drv_stats(bp, &bp->ring_drv_stats_prev); } if (irq_re_init) { bnxt_free_irq(bp); @@ -13191,8 +13191,8 @@ bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) clear_bit(BNXT_STATE_READ_STATS, &bp->state); } -static void bnxt_get_one_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats, +static void bnxt_get_one_ring_drv_stats(struct bnxt *bp, + struct bnxt_total_ring_drv_stats *stats, struct bnxt_cp_ring_info *cpr) { struct bnxt_sw_stats *sw_stats = cpr->sw_stats; @@ -13211,13 +13211,13 @@ static void bnxt_get_one_ring_err_stats(struct bnxt *bp, stats->total_missed_irqs += sw_stats->cmn.missed_irqs; } -void bnxt_get_ring_err_stats(struct bnxt *bp, - struct bnxt_total_ring_err_stats *stats) +void bnxt_get_ring_drv_stats(struct bnxt *bp, + struct bnxt_total_ring_drv_stats *stats) { int i; for (i = 0; i < bp->cp_nr_rings; i++) - bnxt_get_one_ring_err_stats(bp, stats, &bp->bnapi[i]->cp_ring); + bnxt_get_one_ring_drv_stats(bp, stats, &bp->bnapi[i]->cp_ring); } static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask) @@ -15643,7 +15643,7 @@ static void bnxt_get_base_stats(struct net_device *dev, rx->packets = bp->net_stats_prev.rx_packets; rx->bytes = bp->net_stats_prev.rx_bytes; - rx->alloc_fail = bp->ring_err_stats_prev.rx_total_oom_discards; + rx->alloc_fail = bp->ring_drv_stats_prev.rx_total_oom_discards; tx->packets = bp->net_stats_prev.tx_packets; tx->bytes = bp->net_stats_prev.tx_bytes; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 9c5820839514..023a0c2d52fd 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -340,7 +340,7 @@ enum { RX_NETPOLL_DISCARDS, }; -static const char *const bnxt_ring_err_stats_arr[] = { +static const char *const bnxt_ring_drv_stats_arr[] = { "rx_total_l4_csum_errors", "rx_total_resets", "rx_total_buf_errors", @@ -500,7 +500,7 @@ static const struct { BNXT_TX_STATS_PRI_ENTRIES(tx_packets), }; -#define BNXT_NUM_RING_ERR_STATS ARRAY_SIZE(bnxt_ring_err_stats_arr) +#define BNXT_NUM_RING_DRV_STATS ARRAY_SIZE(bnxt_ring_drv_stats_arr) #define BNXT_NUM_PORT_STATS ARRAY_SIZE(bnxt_port_stats_arr) #define BNXT_NUM_STATS_PRI \ (ARRAY_SIZE(bnxt_rx_bytes_pri_arr) + \ @@ -539,7 +539,7 @@ static int bnxt_get_num_stats(struct bnxt *bp) int num_stats = bnxt_get_num_ring_stats(bp); int len; - num_stats += BNXT_NUM_RING_ERR_STATS; + num_stats += BNXT_NUM_RING_DRV_STATS; if (bp->flags & BNXT_FLAG_PORT_STATS) num_stats += BNXT_NUM_PORT_STATS; @@ -594,7 +594,7 @@ static bool is_tx_ring(struct bnxt *bp, int ring_num) static void bnxt_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *buf) { - struct bnxt_total_ring_err_stats ring_err_stats = {0}; + struct bnxt_total_ring_drv_stats ring_drv_stats = {0}; struct bnxt *bp = netdev_priv(dev); u64 *curr, *prev; u32 tpa_stats; @@ -643,12 +643,12 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, buf[j] = sw[k]; } - bnxt_get_ring_err_stats(bp, &ring_err_stats); + bnxt_get_ring_drv_stats(bp, &ring_drv_stats); skip_ring_stats: - curr = &ring_err_stats.rx_total_l4_csum_errors; - prev = &bp->ring_err_stats_prev.rx_total_l4_csum_errors; - for (i = 0; i < BNXT_NUM_RING_ERR_STATS; i++, j++, curr++, prev++) + curr = &ring_drv_stats.rx_total_l4_csum_errors; + prev = &bp->ring_drv_stats_prev.rx_total_l4_csum_errors; + for (i = 0; i < BNXT_NUM_RING_DRV_STATS; i++, j++, curr++, prev++) buf[j] = *curr + *prev; if (bp->flags & BNXT_FLAG_PORT_STATS) { @@ -752,8 +752,8 @@ static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) ethtool_sprintf(&buf, "[%d]: %s", i, str); } } - for (i = 0; i < BNXT_NUM_RING_ERR_STATS; i++) - ethtool_puts(&buf, bnxt_ring_err_stats_arr[i]); + for (i = 0; i < BNXT_NUM_RING_DRV_STATS; i++) + ethtool_puts(&buf, bnxt_ring_drv_stats_arr[i]); if (bp->flags & BNXT_FLAG_PORT_STATS) for (i = 0; i < BNXT_NUM_PORT_STATS; i++) { From patchwork Wed Mar 5 22:52:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003586 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C4A5266EE8 for ; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; cv=none; b=sMf4vpnzhbaJO/9fUa4OVFKW5GgwhtvpavW7RtSxMv+UnJ+NSfUK8aZg3QAMObwK8Tw22lE4LruDd2pxx5fJN0dPGmCpmuGadknT8Tf79iDt/MPrIod/ei/wc76HuTX7mz26jdlpqL6XQZRKkiSR2Fr9wHoYULN4oH2SXKkp2QU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; c=relaxed/simple; bh=7xfdE6ulWRHzqg2UefNkQLPvSQm33yTlOcS3wYTbyYU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BonUe+374/z3GpIV7Rx4L86r6ihknX92xBckPatyiAFwBKcHii7ecftjoM3KJqtItvTfTFFLsl5IJlBT9zEICjabrQROTnJ6Ho7283l6F2qk1UlhlYTr09RhFf8taMF1LsxCBIBs2AefzPatEU9yketd1b4cq1nd9ctDvVRFrVk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TbhIJ9Va; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TbhIJ9Va" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 999D9C4CEEE; Wed, 5 Mar 2025 22:52:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215153; bh=7xfdE6ulWRHzqg2UefNkQLPvSQm33yTlOcS3wYTbyYU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TbhIJ9VatxUj2krlfBGA5XKxqbSG38IGbke/8zn1aatG3yTXQ5qhxK4H1ngl0Wws+ 2rpEGQkcpJekGnUPiIIkt8JVCvPw6GWqbeOLnFrAA6F9z/0mrgf4HpVrH4Cqh3NL2z 6ETdnpxg/aUZziFPOzGamu9Mld1mkIS13V+eLDhduC2yLRRsGjvJBAxoXYShMxzZ+4 uNHh6kvYSGpEXWt/xm7iq158VimlOqclcfLZwKEQF008KMDwBs0UZII3eH6FlQfo+X TAL1Om8WW2lWdGEorcnpTB/OtzXDbR0aM4rnlT5B/eYCMT9+Iq4Fj0D46MZGJubAcq 2U0rtZjwh/QdA== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 04/10] eth: bnxt: snapshot driver stats Date: Wed, 5 Mar 2025 14:52:09 -0800 Message-ID: <20250305225215.1567043-5-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Subsequent commits will add datapath stats which need u64_stats protection. Make current readers work on a snapshot, so it's easier to extend this code without much duplication. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 4b85f224c344..854e7ec5390b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -13093,6 +13093,12 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return -EOPNOTSUPP; } +static void bnxt_drv_stat_snapshot(const struct bnxt_sw_stats *sw_stats, + struct bnxt_sw_stats *snapshot) +{ + memcpy(snapshot, sw_stats, sizeof(*snapshot)); +} + static void bnxt_get_ring_stats(struct bnxt *bp, struct rtnl_link_stats64 *stats) { @@ -13101,8 +13107,11 @@ static void bnxt_get_ring_stats(struct bnxt *bp, for (i = 0; i < bp->cp_nr_rings; i++) { struct bnxt_napi *bnapi = bp->bnapi[i]; struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; + struct bnxt_sw_stats sw_stats; u64 *sw = cpr->stats.sw_stats; + bnxt_drv_stat_snapshot(cpr->sw_stats, &sw_stats); + stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_ucast_pkts); stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts); stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_bcast_pkts); @@ -13127,8 +13136,8 @@ static void bnxt_get_ring_stats(struct bnxt *bp, stats->tx_dropped += BNXT_GET_RING_STATS64(sw, tx_error_pkts); stats->rx_dropped += - cpr->sw_stats->rx.rx_netpoll_discards + - cpr->sw_stats->rx.rx_oom_discards; + sw_stats.rx.rx_netpoll_discards + + sw_stats.rx.rx_oom_discards; } } @@ -13195,20 +13204,22 @@ static void bnxt_get_one_ring_drv_stats(struct bnxt *bp, struct bnxt_total_ring_drv_stats *stats, struct bnxt_cp_ring_info *cpr) { - struct bnxt_sw_stats *sw_stats = cpr->sw_stats; u64 *hw_stats = cpr->stats.sw_stats; + struct bnxt_sw_stats sw_stats; - stats->rx_total_l4_csum_errors += sw_stats->rx.rx_l4_csum_errors; - stats->rx_total_resets += sw_stats->rx.rx_resets; - stats->rx_total_buf_errors += sw_stats->rx.rx_buf_errors; - stats->rx_total_oom_discards += sw_stats->rx.rx_oom_discards; - stats->rx_total_netpoll_discards += sw_stats->rx.rx_netpoll_discards; + bnxt_drv_stat_snapshot(cpr->sw_stats, &sw_stats); + + stats->rx_total_l4_csum_errors += sw_stats.rx.rx_l4_csum_errors; + stats->rx_total_resets += sw_stats.rx.rx_resets; + stats->rx_total_buf_errors += sw_stats.rx.rx_buf_errors; + stats->rx_total_oom_discards += sw_stats.rx.rx_oom_discards; + stats->rx_total_netpoll_discards += sw_stats.rx.rx_netpoll_discards; stats->rx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, rx_discard_pkts); - stats->tx_total_resets += sw_stats->tx.tx_resets; + stats->tx_total_resets += sw_stats.tx.tx_resets; stats->tx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, tx_discard_pkts); - stats->total_missed_irqs += sw_stats->cmn.missed_irqs; + stats->total_missed_irqs += sw_stats.cmn.missed_irqs; } void bnxt_get_ring_drv_stats(struct bnxt *bp, From patchwork Wed Mar 5 22:52:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003583 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7834D263C97 for ; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215154; cv=none; b=dFyMT2rbDwWoG7xhDseazV2u8aS3/RGbX6TGyKSgpJiHx9raTtBUiXhYPCM6eyCOjtKVcfJsiScwYQVgFe+3cL5GAogSPYRh8gXsQ0z7gmRooH36i/oICiUJhQ4AG5FoPHxUI1FwK39GN+uyuUHnYOj10thzIGS8uafn78mL7Ew= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215154; c=relaxed/simple; bh=j+HM0zxu1T9sDSYQfj0qD5Ow787jp4ngF/cckbf0Hoo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tGWTLJyNdsMz5h4EOKDCMcf1jJWog1Q61O2Gsj6Z7eO/NCvG6Iwi/8xg9h/wLdR3wilC91NmlBxBHkf8WAr0l3v3cm/Se9tnEp42FmnAA8FVwOZmeyTq5EmV+bY3vm2KmPBFAx2HwhzMtJF2aZi0VtsLSoA82WhfJpYqWbGFAmU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hsbN9juf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hsbN9juf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 14720C4CED1; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215154; bh=j+HM0zxu1T9sDSYQfj0qD5Ow787jp4ngF/cckbf0Hoo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hsbN9juf/Gtg26oYdsJrx/WfmJFPz7fda5dWD7qyVAI0rzBkiyht+g6xPl0i9PYGy wv6m/vRhJYVEqaR+HIEaOTHu6jN+1it6prmksF4NU4hGgeBtdiBPb6sQbJARAgMgot IJ+BSrkKthrjC6usziabPHDDus+n7qxtP2Pez+1ZiokNPYwvQG+qOUyw+6t5MhWSc+ 1JHjeWGxI7+c1ix67khMGFIyycejpFfWTqV1nAHpHfQQcbvENu1Tpj4xs8B7ZgvenK jOCzJCRhubiw5HSdpuZX3Vk+JKfBsxT+xKDGMCBw33T4OD8Xp8VMeH05K37YgPFAHE JRnuSB87Leufw== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 05/10] eth: bnxt: don't use ifdef to check for CONFIG_INET in GRO Date: Wed, 5 Mar 2025 14:52:10 -0800 Message-ID: <20250305225215.1567043-6-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Use IS_ENABLED(CONFIG_INET) to make the code easier to refactor. Now all packets which did not go thru GRO will exit in the same branch. Reviewed-by: Michael Chan Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 854e7ec5390b..d8a24a8bcfe8 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1740,12 +1740,11 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, struct rx_tpa_end_cmp_ext *tpa_end1, struct sk_buff *skb) { -#ifdef CONFIG_INET int payload_off; u16 segs; segs = TPA_END_TPA_SEGS(tpa_end); - if (segs == 1) + if (segs == 1 || !IS_ENABLED(CONFIG_INET)) return skb; NAPI_GRO_CB(skb)->count = segs; @@ -1759,7 +1758,6 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb); if (likely(skb)) tcp_gro_complete(skb); -#endif return skb; } From patchwork Wed Mar 5 22:52:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003584 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4EF326659A for ; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; cv=none; b=F7PiZUoQiizBkrGda77wD5KVjCSifZbBpHKpEmE98hmrRPg5WkJpK1DJmLBrflZa+sD0/brhGT9tRRVkEK6Eq7r812AWLRFWN45LMDHY10LLftNxhDq/719nbyP5ouNsXMr8Y6NOUYWBRZcjD4iKdthpLM3Dm//a47Z52OAsi24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; c=relaxed/simple; bh=jO7kihAP+Sb7V3Z6IYHTsg0B4M7LBa82xyGfMD578qU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I35tJLg70uFoaQ0tup1NtlXFalpQxqctFcH/1FjaRsjlRHCnnYfmjSx49BfozXaHSHyo2xbgB/yYB3KfyyFMI2BBmXkr2ZsQLgOcn4tSyYINOYMloRTk9KnjL79QI2U03LGyGcs60oyihkBV2D6oqHocHU2rxMCO7ETic0g26/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qKJJyHlK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qKJJyHlK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E397C4CEE9; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215154; bh=jO7kihAP+Sb7V3Z6IYHTsg0B4M7LBa82xyGfMD578qU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qKJJyHlKzHXfEfb0IoIR4awyzU3FFHwSsLHCaeIkE8OzlVmJMOoQvN8kLFxMZiqly 9ukwKfMBXhcn26C9bh5zyxPmX7dbx372tSgaXeqtkN0nfLGsj3+SW2nFYKxQ3vS3aJ wmjMwNOIho75B/K4RnmPQHKGUjqdRstswGROaW/QlvvZupJdP5hBdY9x23d3gP5/UB XVv3r8feqvOUVsOomcnGp/dDHma97zlcvrrz8+2oTypsKB6PyV1cr66YR2cHfWSZTQ mLV4F/pbBXqMapK5aeNEyjbqmjZT8r1g9veaHU2ssUhRf8Auueq6Jrcu4JStagC/h5 0dQhHYUcqHJ4A== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 06/10] eth: bnxt: consolidate the GRO-but-not-really paths in bnxt_gro_skb() Date: Wed, 5 Mar 2025 14:52:11 -0800 Message-ID: <20250305225215.1567043-7-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org bnxt_tpa_end() skips calling bnxt_gro_skb() if it determines that GRO should not be performed. For ease of packet counting pass the gro bool into bnxt_gro_skb(), this way we have a single point thru which all packets coming out of bnxt_tpa_end() should pass. Signed-off-by: Jakub Kicinski --- v3: - flatten it harder, so we can reuse on normal Rx v2: https://lore.kernel.org/20250228012534.3460918-7-kuba@kernel.org --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index d8a24a8bcfe8..dba4779f0925 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1735,6 +1735,7 @@ static struct sk_buff *bnxt_gro_func_5730x(struct bnxt_tpa_info *tpa_info, } static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, + bool gro, struct bnxt_tpa_info *tpa_info, struct rx_tpa_end_cmp *tpa_end, struct rx_tpa_end_cmp_ext *tpa_end1, @@ -1743,9 +1744,9 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, int payload_off; u16 segs; - segs = TPA_END_TPA_SEGS(tpa_end); + segs = gro ? TPA_END_TPA_SEGS(tpa_end) : 1; if (segs == 1 || !IS_ENABLED(CONFIG_INET)) - return skb; + goto non_gro; NAPI_GRO_CB(skb)->count = segs; skb_shinfo(skb)->gso_size = @@ -1756,8 +1757,12 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, else payload_off = TPA_END_PAYLOAD_OFF(tpa_end); skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb); - if (likely(skb)) - tcp_gro_complete(skb); + if (!skb) + goto non_gro; + + tcp_gro_complete(skb); + +non_gro: /* note: skb may be null! */ return skb; } @@ -1917,10 +1922,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, (tpa_info->flags2 & RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3; } - if (gro) - skb = bnxt_gro_skb(bp, tpa_info, tpa_end, tpa_end1, skb); - - return skb; + return bnxt_gro_skb(bp, gro, tpa_info, tpa_end, tpa_end1, skb); } static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, From patchwork Wed Mar 5 22:52:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003585 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B5ED266B6E for ; Wed, 5 Mar 2025 22:52:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; cv=none; b=OGpJxpXd487V935y6u5eKduyS2QG4eskZaMDhlsR5jHKHeT93irZ0QD8m4B/rjs4Ya7Snq/3TWUmwDFKBpeS5Wutey4KyALg2pUAQ/3QsHsufW4y0GpymaDCQNGZq+GheEpk3Dcq8c1sgA1QBDx/+qqTSfdXyWouCrFLnd5X+M0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215155; c=relaxed/simple; bh=IY20lfkY+UNYlWGCZFCHdOtNVnxbujeCAbHCmOJ+44E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qaDzABKLNAr6OhLCsm7srB6Fuo0Od6nIP3u66AcY3XkyDEVpwZxLTzVVeaxgwOYg02UQ6zEbVjxOriHKhFPbxoKlUGmKq/KJMFTMmxvLyWJFMKfFRSE3RgkWPuzXG2OvY8cLhmqpyZRwWZUXC63UpjJNvH/O++DRyrth3pnB9DU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aT3OOD8j; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aT3OOD8j" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB0FFC4CEEA; Wed, 5 Mar 2025 22:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215155; bh=IY20lfkY+UNYlWGCZFCHdOtNVnxbujeCAbHCmOJ+44E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aT3OOD8jKI7VdY+OAGk9+sE31vGyy32v0A1KgSyS4+mM7yY7A+gNF6MxNqN/SclhA 3LSA9kVlXOm5UrSvoe7pJ0dOc7vvWaVuTJunEZHpOtBTbKFirk9+kVg/jenvPODuuF jjIRJkrYVEM1EB0pQG0jBO3hff66RmvHTaCHb8p3Gv8bTu6fV6eo3q1EMcO975iHBS fZkOGA01CivkytgNc0E6I8JeMLd6jT9gIkB54XRMnMTj1YDmMkvoA4KDh7Oou5anFN ztYTZpVShdMqy0qDDzXyC42Tzv4MwRIHijkhSk2+pTlc+TMoY3tezzwUkzhtxYVIKD tBHWceMf1xAFQ== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 07/10] eth: bnxt: extract VLAN info early on Date: Wed, 5 Mar 2025 14:52:12 -0800 Message-ID: <20250305225215.1567043-8-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Michael would like the SW stats to include VLAN bytes, perhaps uniquely among ethernet drivers. To do this we need to extract the VLAN info before we call XDP, so before skb is allocated. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 42 ++++++++++------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index dba4779f0925..b0a9e3c6b377 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1966,45 +1966,36 @@ static bool bnxt_rx_ts_valid(struct bnxt *bp, u32 flags, return true; } -static struct sk_buff *bnxt_rx_vlan(struct sk_buff *skb, u8 cmp_type, - struct rx_cmp *rxcmp, - struct rx_cmp_ext *rxcmp1) +static u32 +bnxt_rx_vlan(u8 cmp_type, struct rx_cmp *rxcmp, struct rx_cmp_ext *rxcmp1) { - __be16 vlan_proto; - u16 vtag; + u16 vlan_proto = 0, vtag = 0; if (cmp_type == CMP_TYPE_RX_L2_CMP) { __le32 flags2 = rxcmp1->rx_cmp_flags2; u32 meta_data; if (!(flags2 & cpu_to_le32(RX_CMP_FLAGS2_META_FORMAT_VLAN))) - return skb; + return 0; meta_data = le32_to_cpu(rxcmp1->rx_cmp_meta_data); vtag = meta_data & RX_CMP_FLAGS2_METADATA_TCI_MASK; - vlan_proto = htons(meta_data >> RX_CMP_FLAGS2_METADATA_TPID_SFT); - if (eth_type_vlan(vlan_proto)) - __vlan_hwaccel_put_tag(skb, vlan_proto, vtag); - else - goto vlan_err; + vlan_proto = meta_data >> RX_CMP_FLAGS2_METADATA_TPID_SFT; } else if (cmp_type == CMP_TYPE_RX_L2_V3_CMP) { if (RX_CMP_VLAN_VALID(rxcmp)) { u32 tpid_sel = RX_CMP_VLAN_TPID_SEL(rxcmp); if (tpid_sel == RX_CMP_METADATA1_TPID_8021Q) - vlan_proto = htons(ETH_P_8021Q); + vlan_proto = ETH_P_8021Q; else if (tpid_sel == RX_CMP_METADATA1_TPID_8021AD) - vlan_proto = htons(ETH_P_8021AD); + vlan_proto = ETH_P_8021AD; else - goto vlan_err; + vlan_proto = 0xffff; vtag = RX_CMP_METADATA0_TCI(rxcmp1); - __vlan_hwaccel_put_tag(skb, vlan_proto, vtag); } } - return skb; -vlan_err: - dev_kfree_skb(skb); - return NULL; + + return (u32)vlan_proto << 16 | vtag; } static enum pkt_hash_types bnxt_rss_ext_op(struct bnxt *bp, @@ -2049,6 +2040,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, struct sk_buff *skb; struct xdp_buff xdp; u32 flags, misc; + u32 vlan_info; u32 cmpl_ts; void *data; int rc = 0; @@ -2163,6 +2155,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, if (cmp_type == CMP_TYPE_RX_L2_CMP) dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); + vlan_info = bnxt_rx_vlan(cmp_type, rxcmp, rxcmp1); + if (vlan_info && !eth_type_vlan(htons(vlan_info >> 16))) + goto next_rx; + if (bnxt_xdp_attached(bp, rxr)) { bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); if (agg_bufs) { @@ -2246,11 +2242,9 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, skb->protocol = eth_type_trans(skb, dev); - if (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX) { - skb = bnxt_rx_vlan(skb, cmp_type, rxcmp, rxcmp1); - if (!skb) - goto next_rx; - } + if (vlan_info && skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX) + __vlan_hwaccel_put_tag(skb, htons(vlan_info >> 16), + vlan_info & 0xffff); skb_checksum_none_assert(skb); if (RX_CMP_L4_CS_OK(rxcmp1)) { From patchwork Wed Mar 5 22:52:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003587 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 38BCD267390 for ; Wed, 5 Mar 2025 22:52:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; cv=none; b=M2cyWEEmK6jLIc3wyFo6Zwow92P7OCuWnjPfX8ixrkAnSajUMZmMKvYnPRaw7b7N5Ko85miRblhenHSgxWdAWH4YeyBOL06ld0wRBJUFTxyZZGHLukUbTGDB2TToBlGNTUqPYlYHYytONJNee4m8SYAUxQXUcxPF4wbMWWB2XWU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; c=relaxed/simple; bh=AlQD/q1Xtmx50Xo9SOrsHDwj+L3R78eO/rtmRqvLxcw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aEF3vQG1/JynMQPjwucIJX8ITL5hrlR+jlUBXtBJIySJhVAjDuCohQOrPUkN/2g2TtJy3QUkFyXQi6uLuuXSgXj5bEsj3rFtw6GZ+rqXJYnMqkg/zQ5CM7YvqxTJSPIFpeZtf3nyXiWzpT6iRPfJMMb8CJ+W+agezi3Zf/BcboU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C9/N+2Lw; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C9/N+2Lw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62696C4CED1; Wed, 5 Mar 2025 22:52:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215155; bh=AlQD/q1Xtmx50Xo9SOrsHDwj+L3R78eO/rtmRqvLxcw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C9/N+2LwO1ZiyIAKa037Z5HDtanbXwrc7e7QGaagACLXNfCJozC1KQCiy0CRnAJYe tLX5VgHurfrad7oHNtzhtPQbjWnH1T+Bg8t4b/FMWkTjWik3RHv8YqTOuwwOqQ+PXB nmrJ3rixiZl66tw8CCNMO0jimiYxG4Q/3HREy8hvbwrTChLSqnymZ3Bl2fpYPbwuu1 CMQCGiKTiCDajlOAbP1ebdRUISj4wDPRRNInqcMt1GPWcavRdC+zkKH33vTWOVAdjn Cf/Jt9D+Svk74KUC4eiDVgipQILw+U+VvB+UM1jNJvRkc5ixCjfQ/hAQ0rmJwTW9Eq 2N8lqDWB871vg== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 08/10] eth: bnxt: maintain rx pkt/byte stats in SW Date: Wed, 5 Mar 2025 14:52:13 -0800 Message-ID: <20250305225215.1567043-9-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Some workloads want to be able to track bandwidth utilization on the scale of 10s of msecs. Updating all HW stats at this rate is both hard and wasteful of PCIe bandwidth. Maintain basic Rx pkt/byte counters in software. ethtool -S will still show the HW stats, but qstats and rtnl stats will show SW statistics. We need to take care of HW-GRO, XDP and VF representors. Per netdev qstat definition Rx stats should reflect packets passed to XDP (if active, otherwise to the stack). XDP and GRO do not interoperate in bnxt, so we need to count the packets in a few places. Add a helper and call it where needed. Do not count VF representor traffic as traffic for the main netdev. The stats are added towards the end of the struct since ethtool code expects existing members to be first. Signed-off-by: Jakub Kicinski --- v3: - count vlan tags - pass all non-XDP packets thru bnxt_gro_skb() v2: https://lore.kernel.org/20250228012534.3460918-8-kuba@kernel.org - adjust to skipping XDP inside bnxt_rx_pkt() v1: https://lore.kernel.org/20250226211003.2790916-8-kuba@kernel.org --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 25 +++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 68 +++++++++++-------- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 18 ++++- 4 files changed, 82 insertions(+), 31 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 34f23ddd4d71..376141a41ecf 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -1118,8 +1118,12 @@ struct bnxt_rx_sw_stats { u64 rx_l4_csum_errors; u64 rx_resets; u64 rx_buf_errors; + /* non-ethtool stats follow */ u64 rx_oom_discards; u64 rx_netpoll_discards; + u64 rx_packets; + u64 rx_bytes; + struct u64_stats_sync syncp; }; struct bnxt_tx_sw_stats { @@ -1146,6 +1150,9 @@ struct bnxt_total_ring_drv_stats { u64 tx_total_resets; u64 tx_total_ring_discards; u64 total_missed_irqs; + /* non-ethtool stats follow */ + u64 rx_total_packets; + u64 rx_total_bytes; }; struct bnxt_stats_mem { @@ -2797,6 +2804,24 @@ static inline u32 bnxt_tx_avail(struct bnxt *bp, return bp->tx_ring_size - (used & bp->tx_ring_mask); } +static inline void bnxt_rx_pkt_cnt(struct bnxt *bp, struct bnxt_napi *bnapi, + struct net_device *dev, + int segs, int len, int payload_off) +{ + struct bnxt_sw_stats *sw_stats = bnapi->cp_ring.sw_stats; + + /* Packet is for a representor */ + if (bp->dev != dev) + return; + + u64_stats_update_begin(&sw_stats->rx.syncp); + sw_stats->rx.rx_packets += segs; + sw_stats->rx.rx_bytes += len; + if (segs > 1) + sw_stats->rx.rx_bytes += (segs - 1) * payload_off; + u64_stats_update_end(&sw_stats->rx.syncp); +} + static inline void bnxt_writeq(struct bnxt *bp, u64 val, volatile void __iomem *addr) { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h index 752b6cf0022c..0461f6783d95 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h @@ -20,7 +20,7 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget); bool bnxt_rx_xdp(struct bnxt *bp, struct net_device *dev, struct bnxt_rx_ring_info *rxr, u16 cons, struct xdp_buff *xdp, struct page *page, u8 **data_ptr, - unsigned int *len, u8 *event); + unsigned int *len, u8 *event, u32 vlan_info); int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp); int bnxt_xdp_xmit(struct net_device *dev, int num_frames, struct xdp_frame **frames, u32 flags); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index b0a9e3c6b377..bdc052b247ba 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1735,15 +1735,23 @@ static struct sk_buff *bnxt_gro_func_5730x(struct bnxt_tpa_info *tpa_info, } static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, + struct bnxt_napi *bnapi, bool gro, struct bnxt_tpa_info *tpa_info, struct rx_tpa_end_cmp *tpa_end, struct rx_tpa_end_cmp_ext *tpa_end1, struct sk_buff *skb) { + struct net_device *dev = skb->dev; int payload_off; + int full_len; u16 segs; + full_len = skb->len - skb_mac_offset(skb); + if (skb_vlan_tag_present(skb)) + full_len += 4; + + payload_off = 0; segs = gro ? TPA_END_TPA_SEGS(tpa_end) : 1; if (segs == 1 || !IS_ENABLED(CONFIG_INET)) goto non_gro; @@ -1763,6 +1771,7 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, tcp_gro_complete(skb); non_gro: /* note: skb may be null! */ + bnxt_rx_pkt_cnt(bp, bnapi, dev, segs, full_len, payload_off); return skb; } @@ -1922,7 +1931,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, (tpa_info->flags2 & RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3; } - return bnxt_gro_skb(bp, gro, tpa_info, tpa_end, tpa_end1, skb); + return bnxt_gro_skb(bp, bnapi, gro, tpa_info, tpa_end, tpa_end1, skb); } static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, @@ -2173,7 +2182,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, if (xdp_active) { if (bnxt_rx_xdp(bp, dev, rxr, cons, &xdp, data, &data_ptr, &len, - event)) { + event, vlan_info)) { rc = 1; goto next_rx; } @@ -2273,6 +2282,11 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } } } + + if (!xdp_active) + /* For accounting only, XDP packets counted in bnxt_rx_xdp() */ + bnxt_gro_skb(bp, bnapi, false, NULL, NULL, NULL, skb); + bnxt_deliver_skb(bp, bnapi, skb); rc = 1; @@ -5113,6 +5127,8 @@ static int bnxt_alloc_stats(struct bnxt *bp) if (!cpr->sw_stats) return -ENOMEM; + u64_stats_init(&cpr->sw_stats->rx.syncp); + cpr->stats.len = size; rc = bnxt_alloc_stats_mem(bp, &cpr->stats, !i); if (rc) @@ -13090,7 +13106,14 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static void bnxt_drv_stat_snapshot(const struct bnxt_sw_stats *sw_stats, struct bnxt_sw_stats *snapshot) { - memcpy(snapshot, sw_stats, sizeof(*snapshot)); + unsigned int seq_rx; + + do { + seq_rx = u64_stats_fetch_begin(&sw_stats->rx.syncp); + + memcpy(snapshot, sw_stats, sizeof(*snapshot)); + + } while (u64_stats_fetch_retry(&sw_stats->rx.syncp, seq_rx)); } static void bnxt_get_ring_stats(struct bnxt *bp, @@ -13106,18 +13129,13 @@ static void bnxt_get_ring_stats(struct bnxt *bp, bnxt_drv_stat_snapshot(cpr->sw_stats, &sw_stats); - stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_ucast_pkts); - stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts); - stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_bcast_pkts); + stats->rx_packets += sw_stats.rx.rx_packets; + stats->rx_bytes += sw_stats.rx.rx_bytes; stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_ucast_pkts); stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_mcast_pkts); stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_bcast_pkts); - stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_ucast_bytes); - stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_mcast_bytes); - stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_bcast_bytes); - stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_ucast_bytes); stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_mcast_bytes); stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_bcast_bytes); @@ -13208,6 +13226,8 @@ static void bnxt_get_one_ring_drv_stats(struct bnxt *bp, stats->rx_total_buf_errors += sw_stats.rx.rx_buf_errors; stats->rx_total_oom_discards += sw_stats.rx.rx_oom_discards; stats->rx_total_netpoll_discards += sw_stats.rx.rx_netpoll_discards; + stats->rx_total_packets += sw_stats.rx.rx_packets; + stats->rx_total_bytes += sw_stats.rx.rx_bytes; stats->rx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, rx_discard_pkts); stats->tx_total_resets += sw_stats.tx.tx_resets; @@ -15600,23 +15620,17 @@ static void bnxt_get_queue_stats_rx(struct net_device *dev, int i, struct netdev_queue_stats_rx *stats) { struct bnxt *bp = netdev_priv(dev); - struct bnxt_cp_ring_info *cpr; - u64 *sw; + struct bnxt_sw_stats *sw_stats; + unsigned int seq; - cpr = &bp->bnapi[i]->cp_ring; - sw = cpr->stats.sw_stats; + sw_stats = bp->bnapi[i]->cp_ring.sw_stats; - stats->packets = 0; - stats->packets += BNXT_GET_RING_STATS64(sw, rx_ucast_pkts); - stats->packets += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts); - stats->packets += BNXT_GET_RING_STATS64(sw, rx_bcast_pkts); - - stats->bytes = 0; - stats->bytes += BNXT_GET_RING_STATS64(sw, rx_ucast_bytes); - stats->bytes += BNXT_GET_RING_STATS64(sw, rx_mcast_bytes); - stats->bytes += BNXT_GET_RING_STATS64(sw, rx_bcast_bytes); - - stats->alloc_fail = cpr->sw_stats->rx.rx_oom_discards; + do { + seq = u64_stats_fetch_begin(&sw_stats->rx.syncp); + stats->packets = sw_stats->rx.rx_packets; + stats->bytes = sw_stats->rx.rx_bytes; + stats->alloc_fail = sw_stats->rx.rx_oom_discards; + } while (u64_stats_fetch_retry(&sw_stats->rx.syncp, seq)); } static void bnxt_get_queue_stats_tx(struct net_device *dev, int i, @@ -15646,8 +15660,8 @@ static void bnxt_get_base_stats(struct net_device *dev, { struct bnxt *bp = netdev_priv(dev); - rx->packets = bp->net_stats_prev.rx_packets; - rx->bytes = bp->net_stats_prev.rx_bytes; + rx->packets = bp->ring_drv_stats_prev.rx_total_packets; + rx->bytes = bp->ring_drv_stats_prev.rx_total_bytes; rx->alloc_fail = bp->ring_drv_stats_prev.rx_total_oom_discards; tx->packets = bp->net_stats_prev.tx_packets; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index aba49ddb0e66..d13c8e06d299 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -224,7 +224,7 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr, bool bnxt_rx_xdp(struct bnxt *bp, struct net_device *dev, struct bnxt_rx_ring_info *rxr, u16 cons, struct xdp_buff *xdp, struct page *page, u8 **data_ptr, - unsigned int *len, u8 *event) + unsigned int *len, u8 *event, u32 vlan_info) { struct bpf_prog *xdp_prog = READ_ONCE(rxr->xdp_prog); struct bnxt_tx_ring_info *txr; @@ -247,10 +247,22 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct net_device *dev, /* BNXT_RX_PAGE_MODE(bp) when XDP enabled */ orig_data = xdp->data; - if (bp->dev == dev) + if (bp->dev == dev) { + struct skb_shared_info *sinfo; + int stat_len = *len; + + if (vlan_info) + stat_len += 4; + if (unlikely(xdp_buff_has_frags(xdp))) { + sinfo = xdp_get_shared_info_from_buff(xdp); + stat_len += sinfo->xdp_frags_size; + } + + bnxt_rx_pkt_cnt(bp, rxr->bnapi, dev, 1, stat_len, 0); act = bpf_prog_run_xdp(xdp_prog, xdp); - else /* packet is for a VF representor */ + } else { /* packet is for a VF representor */ act = XDP_PASS; + } tx_avail = bnxt_tx_avail(bp, txr); /* If the tx ring is not full, we must not update the rx producer yet From patchwork Wed Mar 5 22:52:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003588 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C69A2673A1 for ; Wed, 5 Mar 2025 22:52:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; cv=none; b=d3QUHXj59iuMnL6PpTZ0QuZGplvazvw9bJV8f8SBOfCZcZshOyOHEZmd0wPiAFQq6Jy2ATwD5ECsjKENBwesHOO7i64cfkxYKu5/P6Ga8NDgJLeMJirSItcBC7POVjWwMsj2+E08F9S1Z0yz4WwBGHpkdeLq+uh4OUDNFcFEi6k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; c=relaxed/simple; bh=2NMABfEWHv9SKr+Fyd6GVBpwZwonaqx56fcprY4oHPc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eCnelXnAJqo8sXx8R4xoaSy41RbpTVPgIBq6Z7PuLpJIKGwFRjAon0dAqaYNOsNUYtV3+o0KIIj8zjNAJ/oC/oAAPAUbZ7wBi9JaZwpuLPmgho0GJ4C6JuWW6tWsv7G/vZzE4tCel0wpLT45wvidaLNMn3ysjem8w3e53pd3ZnA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iufm6RIM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iufm6RIM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D43B6C4CEE0; Wed, 5 Mar 2025 22:52:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215156; bh=2NMABfEWHv9SKr+Fyd6GVBpwZwonaqx56fcprY4oHPc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iufm6RIMPR6lWRXy6eRHmrBHgrUFxEG1layymUWoCEICxv2tpVsQkJ4CwLKDLV3Tf 4Ly+W0pTt3wCWOQ0VCftOOiPk8aWHw8Z0hj2lGa8rRsEj50O01PyKbQW6QUzIwMx6d YFwNMMD/qAnDSvTyfGU4dN8EBlxRKKWM/ICdqwtum5/+D0OvtcLQpJ8H6XmmkDqQdJ rj+InrUGjV8PBGNkRoUJF0CLmj08pbElW704FNhoR3iNgGRjd3FhKD6Y3xDnfVXOD/ g4wQ/eazU++HUP28+tNIiHyUeljXnlwgVwZ//7Jaoqtw2vk6rK5W5VYB1qdPUSFmB0 ez3615Wgy3mjQ== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 09/10] eth: bnxt: maintain tx pkt/byte stats in SW Date: Wed, 5 Mar 2025 14:52:14 -0800 Message-ID: <20250305225215.1567043-10-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Some workloads want to be able to track bandwidth utilization on the scale of 10s of msecs. Updating all HW stats at this rate is both hard and wasteful of PCIe bandwidth. Maintain basic Tx pkt/byte counters in software. ethtool -S will still show the HW stats, but qstats and rtnl stats will show SW statistics. We need to take care of TSO and VF representors, record relevant state in tx_buf to avoid touching potentially cold skb. Use existing holes in the struct (no size change). Note that according to TX_BD_HSIZE max header size is 255, so u8 should be enough. It's not obvious whether VF representor traffic should be counted, on one hand it doesn't belong to the local interface. On the other it does go thru normal queuing so Qdisc will show it. I opted to _not_ count it. Signed-off-by: Jakub Kicinski --- v3: - count padding and vlans v2: https://lore.kernel.org/20250228012534.3460918-9-kuba@kernel.org --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 13 +++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 78 +++++++++++++++-------- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 376141a41ecf..37d7f08a73c3 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -771,6 +771,7 @@ struct nqe_cn { SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info))) #define BNXT_MIN_PKT_SIZE 52 +#define BNXT_MIN_ETH_SIZE 60 #define BNXT_DEFAULT_RX_RING_SIZE 511 #define BNXT_DEFAULT_TX_RING_SIZE 511 @@ -877,11 +878,15 @@ struct bnxt_sw_tx_bd { struct sk_buff *skb; struct xdp_frame *xdpf; }; + struct page *page; DEFINE_DMA_UNMAP_ADDR(mapping); DEFINE_DMA_UNMAP_LEN(len); - struct page *page; + u16 extra_segs; + u8 extra_bytes; + u8 hdr_size; u8 is_ts_pkt; u8 is_push; + u8 is_vfr; u8 action; unsigned short nr_frags; union { @@ -1128,6 +1133,10 @@ struct bnxt_rx_sw_stats { struct bnxt_tx_sw_stats { u64 tx_resets; + /* non-ethtool stats follow */ + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; }; struct bnxt_cmn_sw_stats { @@ -1153,6 +1162,8 @@ struct bnxt_total_ring_drv_stats { /* non-ethtool stats follow */ u64 rx_total_packets; u64 rx_total_bytes; + u64 tx_total_packets; + u64 tx_total_bytes; }; struct bnxt_stats_mem { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index bdc052b247ba..893102c0d24e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -514,6 +514,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) vlan_tag_flags = 0; cfa_action = bnxt_xmit_get_cfa_action(skb); + tx_buf->is_vfr = !!cfa_action; if (skb_vlan_tag_present(skb)) { vlan_tag_flags = TX_BD_CFA_META_KEY_VLAN | skb_vlan_tag_get(skb); @@ -522,6 +523,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) */ if (skb->vlan_proto == htons(ETH_P_8021Q)) vlan_tag_flags |= 1 << TX_BD_CFA_META_TPID_SHIFT; + tx_buf->extra_bytes += VLAN_HLEN; } if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && ptp && @@ -610,6 +612,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) DB_RING_IDX(&txr->tx_db, prod)); WRITE_ONCE(txr->tx_prod, prod); + if (skb->len < BNXT_MIN_ETH_SIZE) + tx_buf->extra_bytes += BNXT_MIN_ETH_SIZE - skb->len; tx_buf->is_push = 1; netdev_tx_sent_queue(txq, skb->len); wmb(); /* Sync is_push and byte queue before pushing data */ @@ -634,6 +638,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) goto tx_kick_pending; length = BNXT_MIN_PKT_SIZE; } + if (skb->len < BNXT_MIN_ETH_SIZE) + tx_buf->extra_bytes += BNXT_MIN_ETH_SIZE - skb->len; mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE); @@ -675,6 +681,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) length = skb_shinfo(skb)->gso_size; txbd1->tx_bd_mss = cpu_to_le32(length); length += hdr_len; + + tx_buf->hdr_size = hdr_len; + tx_buf->extra_segs = skb_shinfo(skb)->gso_segs - 1; } else if (skb->ip_summed == CHECKSUM_PARTIAL) { txbd1->tx_bd_hsize_lflags |= cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); @@ -784,6 +793,10 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) if (txr->kick_pending) bnxt_txr_db_kick(bp, txr, txr->tx_prod); txr->tx_buf_ring[txr->tx_prod].skb = NULL; + txr->tx_buf_ring[txr->tx_prod].extra_segs = 0; + txr->tx_buf_ring[txr->tx_prod].extra_bytes = 0; + txr->tx_buf_ring[txr->tx_prod].hdr_size = 0; + txr->tx_buf_ring[txr->tx_prod].is_vfr = 0; dev_core_stats_tx_dropped_inc(dev); return NETDEV_TX_OK; } @@ -793,11 +806,12 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, int budget) { struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index); + struct bnxt_sw_stats *sw_stats = txr->bnapi->cp_ring.sw_stats; struct pci_dev *pdev = bp->pdev; + int adj_bytes = 0, tx_bytes = 0; + int adj_pkts = 0, tx_pkts = 0; u16 hw_cons = txr->tx_hw_cons; - unsigned int tx_bytes = 0; u16 cons = txr->tx_cons; - int tx_pkts = 0; bool rc = false; while (RING_TX(bp, cons) != hw_cons) { @@ -823,8 +837,20 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, cons = NEXT_TX(cons); tx_pkts++; tx_bytes += skb->len; + if (!tx_buf->is_vfr) { + adj_pkts += tx_buf->extra_segs; + adj_bytes += tx_buf->extra_bytes + + tx_buf->extra_segs * tx_buf->hdr_size; + } else { + adj_pkts--; + adj_bytes -= skb->len; + } tx_buf->skb = NULL; + tx_buf->extra_segs = 0; + tx_buf->extra_bytes = 0; + tx_buf->hdr_size = 0; tx_buf->is_ts_pkt = 0; + tx_buf->is_vfr = 0; if (tx_buf->is_push) { tx_buf->is_push = 0; @@ -860,6 +886,11 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, WRITE_ONCE(txr->tx_cons, cons); + u64_stats_update_begin(&sw_stats->tx.syncp); + sw_stats->tx.tx_packets += tx_pkts + adj_pkts; + sw_stats->tx.tx_bytes += tx_bytes + adj_bytes; + u64_stats_update_end(&sw_stats->tx.syncp); + __netif_txq_completed_wake(txq, tx_pkts, tx_bytes, bnxt_tx_avail(bp, txr), bp->tx_wake_thresh, READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING); @@ -5128,6 +5159,7 @@ static int bnxt_alloc_stats(struct bnxt *bp) return -ENOMEM; u64_stats_init(&cpr->sw_stats->rx.syncp); + u64_stats_init(&cpr->sw_stats->tx.syncp); cpr->stats.len = size; rc = bnxt_alloc_stats_mem(bp, &cpr->stats, !i); @@ -13106,14 +13138,16 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static void bnxt_drv_stat_snapshot(const struct bnxt_sw_stats *sw_stats, struct bnxt_sw_stats *snapshot) { - unsigned int seq_rx; + unsigned int seq_rx, seq_tx; do { seq_rx = u64_stats_fetch_begin(&sw_stats->rx.syncp); + seq_tx = u64_stats_fetch_begin(&sw_stats->tx.syncp); memcpy(snapshot, sw_stats, sizeof(*snapshot)); - } while (u64_stats_fetch_retry(&sw_stats->rx.syncp, seq_rx)); + } while (u64_stats_fetch_retry(&sw_stats->rx.syncp, seq_rx) || + u64_stats_fetch_retry(&sw_stats->tx.syncp, seq_tx)); } static void bnxt_get_ring_stats(struct bnxt *bp, @@ -13132,13 +13166,8 @@ static void bnxt_get_ring_stats(struct bnxt *bp, stats->rx_packets += sw_stats.rx.rx_packets; stats->rx_bytes += sw_stats.rx.rx_bytes; - stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_ucast_pkts); - stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_mcast_pkts); - stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_bcast_pkts); - - stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_ucast_bytes); - stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_mcast_bytes); - stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_bcast_bytes); + stats->tx_packets += sw_stats.tx.tx_packets; + stats->tx_bytes += sw_stats.tx.tx_bytes; stats->rx_missed_errors += BNXT_GET_RING_STATS64(sw, rx_discard_pkts); @@ -13230,6 +13259,8 @@ static void bnxt_get_one_ring_drv_stats(struct bnxt *bp, stats->rx_total_bytes += sw_stats.rx.rx_bytes; stats->rx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, rx_discard_pkts); + stats->tx_total_packets += sw_stats.tx.tx_packets; + stats->tx_total_bytes += sw_stats.tx.tx_bytes; stats->tx_total_resets += sw_stats.tx.tx_resets; stats->tx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, tx_discard_pkts); @@ -15637,21 +15668,16 @@ static void bnxt_get_queue_stats_tx(struct net_device *dev, int i, struct netdev_queue_stats_tx *stats) { struct bnxt *bp = netdev_priv(dev); - struct bnxt_napi *bnapi; - u64 *sw; + struct bnxt_sw_stats *sw_stats; + unsigned int seq; - bnapi = bp->tx_ring[bp->tx_ring_map[i]].bnapi; - sw = bnapi->cp_ring.stats.sw_stats; + sw_stats = bp->tx_ring[bp->tx_ring_map[i]].bnapi->cp_ring.sw_stats; - stats->packets = 0; - stats->packets += BNXT_GET_RING_STATS64(sw, tx_ucast_pkts); - stats->packets += BNXT_GET_RING_STATS64(sw, tx_mcast_pkts); - stats->packets += BNXT_GET_RING_STATS64(sw, tx_bcast_pkts); - - stats->bytes = 0; - stats->bytes += BNXT_GET_RING_STATS64(sw, tx_ucast_bytes); - stats->bytes += BNXT_GET_RING_STATS64(sw, tx_mcast_bytes); - stats->bytes += BNXT_GET_RING_STATS64(sw, tx_bcast_bytes); + do { + seq = u64_stats_fetch_begin(&sw_stats->tx.syncp); + stats->packets = sw_stats->tx.tx_packets; + stats->bytes = sw_stats->tx.tx_bytes; + } while (u64_stats_fetch_retry(&sw_stats->tx.syncp, seq)); } static void bnxt_get_base_stats(struct net_device *dev, @@ -15664,8 +15690,8 @@ static void bnxt_get_base_stats(struct net_device *dev, rx->bytes = bp->ring_drv_stats_prev.rx_total_bytes; rx->alloc_fail = bp->ring_drv_stats_prev.rx_total_oom_discards; - tx->packets = bp->net_stats_prev.tx_packets; - tx->bytes = bp->net_stats_prev.tx_bytes; + tx->packets = bp->ring_drv_stats_prev.tx_total_packets; + tx->bytes = bp->ring_drv_stats_prev.tx_total_bytes; } static const struct netdev_stat_ops bnxt_stat_ops = { From patchwork Wed Mar 5 22:52:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 14003589 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD9EE2673A7 for ; Wed, 5 Mar 2025 22:52:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; cv=none; b=ELdw2Rz+yFGhSwKHhyQjEsy/D2dVd3e/1UP8RNNSC974ZO/cChuFqx9Dz7+cWqvvAsRnTfsnBP1VZ4FBADOK0FlgeAq1l2u/LUt/LY8GE/yV8VVr5ieL6TX0rwvtCABTaeiCieZML6MKYuf0+Vlfu7qvDOpQeQpa4DI88VYpQlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741215156; c=relaxed/simple; bh=CVJuugwiB0UxcgtqChtwDiY+7V4zzsH4jQHsT8AoCpo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oD/LAxUl1pWoe6WOOwapMMUntMGNLbC1NOO9r79RxFo/oPPaOW8enIypBfsXpe1dNmwXVFQShs1ZC8U/32OVJ25TYNCSKEQ30P5A6LqbNxH9FhyHxX9eJhynbRwwYPSryZkqYS9AJJeJB2uXwdo3tvoyCGMe4+nsHYCxseYz7L0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XN96gt3e; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XN96gt3e" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4A315C4CEEE; Wed, 5 Mar 2025 22:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741215156; bh=CVJuugwiB0UxcgtqChtwDiY+7V4zzsH4jQHsT8AoCpo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XN96gt3eMU2P7R0ItPHFg6zSmvS5xu3k8Y+PaT6kV2IJnmzFreQPeM0LX0Ez1LSkb nxRDpCDjLwftHVtL96rx5PTTEWrJMG4tKcNpP+O/fv9W1sa+gEwAYW6Gpj7pu/OTis RygMOMCjVqbiSoCuflcua82T2xyvAzSlYwoHRj8XYSTRktpFxspY6mhg/Prt8T4fHS T2VPoLi8ggKFjY8GgaTeGP/EbUEuE9hPFkxBjajbjqm3VFqmXHHyA3Kc4A6vNeKy0E X3OCryji4j/AJ7Tph3gEZg+vn/woHoeCvK/GzULlZ0abQ6nCloe2woJmdvGBJEKm9w Ijk9CYJqnU8OQ== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, przemyslaw.kitszel@intel.com, Jakub Kicinski Subject: [PATCH net-next v3 10/10] eth: bnxt: count xdp xmit packets Date: Wed, 5 Mar 2025 14:52:15 -0800 Message-ID: <20250305225215.1567043-11-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250305225215.1567043-1-kuba@kernel.org> References: <20250305225215.1567043-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Count XDP_TX and XDP_REDIRECT packets. Since the Tx rings are separate we count the packets sent to the base stats, not per-queues stats. The XDP stats are protected by the Rx syncp since they are in NAPI context. Feels slightly less ugly than having a Tx stats in Rx struct. But neither is ideal. Signed-off-by: Jakub Kicinski --- v3: - count XDP on same members as Tx v2: https://lore.kernel.org/20250228012534.3460918-10-kuba@kernel.org - move tx_buf init sooner so that shinfo handling can access it v1: https://lore.kernel.org/20250226211003.2790916-10-kuba@kernel.org --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 9 ++++--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 16 ++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 25 +++++++++++++++---- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 37d7f08a73c3..0e9702871fd3 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -881,7 +881,10 @@ struct bnxt_sw_tx_bd { struct page *page; DEFINE_DMA_UNMAP_ADDR(mapping); DEFINE_DMA_UNMAP_LEN(len); - u16 extra_segs; + union { + u16 extra_segs; + u16 xdp_len; + }; u8 extra_bytes; u8 hdr_size; u8 is_ts_pkt; @@ -1134,8 +1137,8 @@ struct bnxt_rx_sw_stats { struct bnxt_tx_sw_stats { u64 tx_resets; /* non-ethtool stats follow */ - u64 tx_packets; - u64 tx_bytes; + u64 tx_packets; /* for XDP_TX, under rx syncp */ + u64 tx_bytes; /* for XDP_TX, under rx syncp */ struct u64_stats_sync syncp; }; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 893102c0d24e..30d2b6b25301 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -15685,6 +15685,7 @@ static void bnxt_get_base_stats(struct net_device *dev, struct netdev_queue_stats_tx *tx) { struct bnxt *bp = netdev_priv(dev); + int i; rx->packets = bp->ring_drv_stats_prev.rx_total_packets; rx->bytes = bp->ring_drv_stats_prev.rx_total_bytes; @@ -15692,6 +15693,21 @@ static void bnxt_get_base_stats(struct net_device *dev, tx->packets = bp->ring_drv_stats_prev.tx_total_packets; tx->bytes = bp->ring_drv_stats_prev.tx_total_bytes; + + for (i = 0; i < bp->tx_nr_rings_xdp; i++) { + struct bnxt_sw_stats *sw_stats = bp->bnapi[i]->cp_ring.sw_stats; + unsigned int seq; + u64 pkts, bytes; + + do { + seq = u64_stats_fetch_begin(&sw_stats->rx.syncp); + pkts = sw_stats->tx.tx_packets; + bytes = sw_stats->tx.tx_bytes; + } while (u64_stats_fetch_retry(&sw_stats->rx.syncp, seq)); + + tx->packets += pkts; + tx->bytes += bytes; + } } static const struct netdev_stat_ops bnxt_stat_ops = { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index d13c8e06d299..8ab40ae5c443 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -35,14 +35,17 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, u16 prod; int i; - if (xdp && xdp_buff_has_frags(xdp)) { - sinfo = xdp_get_shared_info_from_buff(xdp); - num_frags = sinfo->nr_frags; - } - /* fill up the first buffer */ prod = txr->tx_prod; tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)]; + tx_buf->xdp_len = len; + + if (xdp && xdp_buff_has_frags(xdp)) { + sinfo = xdp_get_shared_info_from_buff(xdp); + tx_buf->xdp_len += sinfo->xdp_frags_size; + num_frags = sinfo->nr_frags; + } + tx_buf->nr_frags = num_frags; if (xdp) tx_buf->page = virt_to_head_page(xdp->data); @@ -120,9 +123,11 @@ static void __bnxt_xmit_xdp_redirect(struct bnxt *bp, void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) { + struct bnxt_sw_stats *sw_stats = bnapi->cp_ring.sw_stats; struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0]; struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; u16 tx_hw_cons = txr->tx_hw_cons; + unsigned int pkts = 0, bytes = 0; bool rx_doorbell_needed = false; struct bnxt_sw_tx_bd *tx_buf; u16 tx_cons = txr->tx_cons; @@ -135,6 +140,10 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) while (RING_TX(bp, tx_cons) != tx_hw_cons) { tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)]; + pkts++; + bytes += tx_buf->xdp_len; + tx_buf->xdp_len = 0; + if (tx_buf->action == XDP_REDIRECT) { struct pci_dev *pdev = bp->pdev; @@ -163,6 +172,12 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) tx_cons = NEXT_TX(tx_cons); } + /* Note: Rx sync here, because Rx == NAPI context */ + u64_stats_update_begin(&sw_stats->rx.syncp); + sw_stats->tx.tx_packets += pkts; + sw_stats->tx.tx_bytes += bytes; + u64_stats_update_end(&sw_stats->rx.syncp); + bnapi->events &= ~BNXT_TX_CMP_EVENT; WRITE_ONCE(txr->tx_cons, tx_cons); if (rx_doorbell_needed) {