From patchwork Wed Feb 26 21:09:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993199 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 503E82586ED for ; Wed, 26 Feb 2025 21:10:18 +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=1740604219; cv=none; b=ICXR/QWQ8KNU0lGCQF3+Qq/EVqeCTB9JxAMIWwcWe5c0CE5V7Awv/6G+dyOcdi27BPk1/YuqgvKRQS/l2dorQ1bCdgHZlmwwHtVkfwGa1zSX26YbbbiyPwAggBCRpznaFdi/LfsFXl1I0plFRjMwwWGCDF5oWLxaRgAZZ0LW3QU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604219; c=relaxed/simple; bh=xlfesCAYFJuORciIZ6LM+t4QFT/GvQSC3mgpWimbL/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NY81NysGEN2lb1V6EnSP4ikFXfxR0FeGxYYKErIbRK3QuV84+3GDeRGvJoA3xW5qKh9XRJPartWy6I+XlkR9yXvxL5+Fmhi/c3q6aTe2Hn46HGHJq15UOHnu/b6S6B/m82TJ+g9EjlolC4VVWa0vgXcb7uE0fTYBWSXVZONceSk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d+bVolqZ; 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="d+bVolqZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 867CAC4CEE7; Wed, 26 Feb 2025 21:10:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604218; bh=xlfesCAYFJuORciIZ6LM+t4QFT/GvQSC3mgpWimbL/E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d+bVolqZx5kBorTC6tmzK334j46J9CimKYKEUOoxxvFH/k8juFqwgbUn+lZ0qFHk+ dzW+hI84FZV8LO4vFvM3oJfCTSWahskR0qDF98dC4OobcVL2fPWQciImaZONVyz2TG PLHrYwwj+PCv/EsCyT+EnGd50fiJe+kWbchwyTjsh0mbhsFtBQEj335rMr1SjhVKIN vFfDAI5bXjqOLzO75hTpTXklgoqbeuZk9zL5WZ0ZNRYIdCWYQkmJJRlJJQXYqbAWpS eZQGMD8A9enqw9INS1LwLjtQGfOebUMvhkBBUPPZlLAcSSiDOPku121dPlb2IZLEEI w90qUwsvWwabA== 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, Jakub Kicinski Subject: [PATCH net-next 1/9] eth: bnxt: use napi_consume_skb() Date: Wed, 26 Feb 2025 13:09:55 -0800 Message-ID: <20250226211003.2790916-2-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 Feb 26 21:09:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993200 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 A2F4125A2A4 for ; Wed, 26 Feb 2025 21:10:19 +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=1740604219; cv=none; b=Za2OCIsBzYbZS+vxScwCZEcknlDYBYUzVVdAtFc8l6bpeZes246mMo+fYCV7BwvRqsgxWmJrbeh5ImgfQZgHi8mW9K7TFXEOtetAWHIifGACeaF96BFrZ1vrxyrSBRfQnGhTjSPqG4J1W8YIZBHbxSVFsAlEYfM8qrUnDoicAdU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604219; c=relaxed/simple; bh=Vm4M2SQc2Re/GPyD7IcIEGvrg+2XSdudhWIjiH+/Tk8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q8U0PTM4qOb0lrfXgyC2ptkHjsi15iWjttYCVdcpJTLT3eV1Tz0SwXQWeo8vVdO9/MTs5vLDTAYBwsOwOwtYcgQqWh0wtsGoqRp1rAm3EWE0L5iyYn6dByyj7btwlLHhAhnu83PcGrArmwJpK9uJm5IeEK0b78RnwBcf4E/TQv0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mj6gWWTo; 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="mj6gWWTo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB7F2C4CEE9; Wed, 26 Feb 2025 21:10:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604219; bh=Vm4M2SQc2Re/GPyD7IcIEGvrg+2XSdudhWIjiH+/Tk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mj6gWWToAChZK471tiHAoMskBee9dJmVToybxh0MW3KxRo9K/2JKD3AufW3Q9JawK rwmcUyI/fUlU4JyBuDwMtHwIv7tofuSPur44hJm4O2jjd+UBkUfKW4OhQKWQjoQv8Q ZqbxaaeNupDYfsyD193x+8m+IH/i4Is3LToomcrOXNIawISfqKfhm7n9F1cLfbUnUY HDSSl1Y5HeOnVQBqhuTfM5ynPAuuSYNtvY1KyG1nSBXg58nardY/weydj4+FyGhhTQ fK+DJmFz16QK1nxlZ9k08BIVBpustlsfC6tP0E2ZK8H16+zwir/zVJooUIYxBmpja5 s1w5Qdi+H6B9w== 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, Jakub Kicinski Subject: [PATCH net-next 2/9] eth: bnxt: don't run xdp programs on fallback traffic Date: Wed, 26 Feb 2025 13:09:56 -0800 Message-ID: <20250226211003.2790916-3-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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. 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 --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index f6a26f6f85bb..53b689800e1c 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) { @@ -2171,7 +2175,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, xdp_active = true; } - if (xdp_active) { + if (xdp_active && dev == bp->dev) { if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { rc = 1; goto next_rx; @@ -2239,8 +2243,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) { From patchwork Wed Feb 26 21:09:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993201 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 F327325A321 for ; Wed, 26 Feb 2025 21:10:19 +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=1740604220; cv=none; b=bMc/ahI0tBepRbA3pGwkA8qcs4eqH0A6FYyf0wIn8+kp7LOnLQVWSi/DWpIF42UlLwART40GcxR9SwIrTfHURv+RdNyk3rqQzvOQoEblJbGNd2BfxAzr3Y8/1SlucqG3d8GfF+hOotoajB+X7Aa3rlte5770yrXrc2qLTEVV3PY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604220; c=relaxed/simple; bh=G4luJRCzXNfx/9fY/vly1vKyrwbSCswByVM2PkliHiw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S9nuDZ2IDu+kdoBPZTNZlb01B+C8ftCJY8jHi7aqeMsHDDuNETIvdzdFGKKAogiK3dZx4oX8JJF46cZkkCnPGXR/rSz4yyjIbLnrI+CDqfMmP9E9512bxawE/eJeInmsoJQshk9F8kwWN0BcnN/P5B5LiSQ0+rUXI+X8puAUoOo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lJ0TTGpm; 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="lJ0TTGpm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C682C4CEEA; Wed, 26 Feb 2025 21:10:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604219; bh=G4luJRCzXNfx/9fY/vly1vKyrwbSCswByVM2PkliHiw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lJ0TTGpmoJjxzwP5Qnm5PU/7mhW2lsyifK/nTJ+Z00jAx/txTctw3ti8S/+Fu4NW7 VwyYHuPZEr2RSM8Ps68rgtTQ/6OZKZUSoe4HzfpzP8nWhUfiKu+BfsgNI0NH/dWmCX Jx46Q3X8xd0HXxmDVM9oXAPjghEX3SmMUUxW5jgfyyUsojKlYI5P2aI46sZt28FCar CQMKecC8J/q9BX1oU6imkYjQro39TWiXAv2nmwcPMQJNmCNSHAnfdwefCkpz5cJvAU ccY1hebM75GwuV92uNvRbgkXW2rJXdeMjdUijl0XE3uC9ckrWUf1X1JjnYyZxmQaoA 9H1xF2FeV/q5A== 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, Jakub Kicinski Subject: [PATCH net-next 3/9] eth: bnxt: rename ring_err_stats -> ring_drv_stats Date: Wed, 26 Feb 2025 13:09:57 -0800 Message-ID: <20250226211003.2790916-4-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 +++++++------- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 14 +++++++------- 3 files changed, 18 insertions(+), 18 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 53b689800e1c..29515d6c6cdd 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -12940,7 +12940,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); @@ -13190,8 +13190,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; @@ -13210,13 +13210,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) @@ -15642,7 +15642,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..df726a31192b 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_ERR_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) + \ @@ -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,11 +643,11 @@ 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; + 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_ERR_STATS; i++, j++, curr++, prev++) buf[j] = *curr + *prev; @@ -753,7 +753,7 @@ static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) } } for (i = 0; i < BNXT_NUM_RING_ERR_STATS; i++) - ethtool_puts(&buf, bnxt_ring_err_stats_arr[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 Feb 26 21:09:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993202 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 30C4E25A331 for ; Wed, 26 Feb 2025 21:10:20 +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=1740604220; cv=none; b=meu6CvQfl1LGzBQ8CStJLiiQ6eN02DSbjQZFwr2pt71Fve9idO8UM2WSRGqUxZYGt19D9E7K/tBs4PJMumfW1TScZl3WuZ3Uosmc0Bd7Q35sS2eNMXKuBWTddH8zQx5AIBqTEQhqRzpa+zHXcvHfvKaEmvyKJstULAmOKe8jR4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604220; c=relaxed/simple; bh=KBmlE1UxZP2DAKyFyT3OiT4SmOQkq2/0xaWU+XxYiIo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O9xPUBdRf0AVRyh2jXmZRCJPTIhu2DZkN8nKQLp02QJ326vVsMflJjWy4PAmR8HOLq5WZ4ZGeu8hYKbOGsQdmKo7yv9dYN8O3FZLKH0Pyovv3wS468nvzKiEtLFRRjWxFonpNYicBpMNwzwDWRTiT548npithw9a6rT598lHGw4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=R1/+3Ck4; 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="R1/+3Ck4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C2979C4CED6; Wed, 26 Feb 2025 21:10:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604220; bh=KBmlE1UxZP2DAKyFyT3OiT4SmOQkq2/0xaWU+XxYiIo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R1/+3Ck4T5sq+lV7ZukruXMTaN/r9BPgsV/DQ18e87KbpE8+sL0invOE4IFL2Gno0 0thtAjYu9K4Qo4eEhET54Lti/VGuGh/zHi7mhUPp1A1oqLas3+MaKqpNM2mIYfm99x HWfZg1ZsInJscMhk4eognvm6Ygh2MjfXEV/B3o7rLYNCi+EtvcqMixJTrU6jYvFYbN coBJPgxTuwsXgTO1gTRlUJK31kQSK0cxe0msO2iAPE5up7YOcjI+fzLvzBNYqVqCQx OBtS2NYFhOBFCvyQWteNuW7SLE1YMEjKozMfVkC4jrOL/MpsOCwC1UrCrJS12Z9w4x y+ghsvKtbuHEA== 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, Jakub Kicinski Subject: [PATCH net-next 4/9] eth: bnxt: snapshot driver stats Date: Wed, 26 Feb 2025 13:09:58 -0800 Message-ID: <20250226211003.2790916-5-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 29515d6c6cdd..32a2fbc6615b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -13092,6 +13092,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) { @@ -13100,8 +13106,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); @@ -13126,8 +13135,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; } } @@ -13194,20 +13203,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 Feb 26 21:09:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993203 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 EB6CE25B67F for ; Wed, 26 Feb 2025 21:10:20 +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=1740604221; cv=none; b=Qn8U3WK5Yd+j3F//AsBfIbpA226N+mkAKXYu2KAs3fuUKHeSCyCnGqYtms0g+DCAF7b8aTLcsAUbxQynfPErj7FOPNIPykVblQktXIRCjmI3p9idv7K4/GHE3bPpqBOPX9N80CJSbtM4pdtsSTxuJ1Yq6yvy0zz3U7n32x7ZEko= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604221; c=relaxed/simple; bh=3ehmKTaJ1QBeEkMfmsIqtL7Ih26KgFWgLF0Pb6G/cLo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rdqFGBWoqHrpYvn03a/ceD8bzbVNRtOH6J5nwJn5AEjh3u4gjAcEl0ONoh0w3WYhXcZv985+XXxGmQNy2QVqOSCdjPTBPJ1MsadsatXBnAjJ+mX+UfsegZURv+FbRUivVnhxZXP0LAwD9c7798rHq/HEcQEC3fgXNN/iGCMxof8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WYbgcr5/; 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="WYbgcr5/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 328DAC4CEEC; Wed, 26 Feb 2025 21:10:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604220; bh=3ehmKTaJ1QBeEkMfmsIqtL7Ih26KgFWgLF0Pb6G/cLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WYbgcr5/SLGcd73sI/Z0FLs51tTsKygdnLuVtMk25xSLI4rDKjS5DO4hFhQ6MutxV rc3/4lkP66Qrp4TbZE2V4VeROj+1onGoJ+sKuQBZqleGwImRm0ZegGSGEcxgzSPJ7i i3m7fHqd83vasUBEZ2VHMFzhvCnIOI/TZaH6336eWYTO02NBTbj6i5fI0Sud+0HObN k2BXcaA7uHSIG5QrCWGFYklgjqOlXYlbViLNltoP/BakHvL9AtTkCFYZBCBKxXhR57 rse+yzh+BnZsSg5FWKb0nl0PKkymrnkJiZShwSB5AAWAS4oFbThj8Bo/I3HKVSbfDY r1hk0vv2KIYkw== 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, Jakub Kicinski Subject: [PATCH net-next 5/9] eth: bnxt: don't use ifdef to check for CONFIG_INET in GRO Date: Wed, 26 Feb 2025 13:09:59 -0800 Message-ID: <20250226211003.2790916-6-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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. 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 32a2fbc6615b..497bc81ecdb9 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 Feb 26 21:10:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993205 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 649D725C6F1 for ; Wed, 26 Feb 2025 21:10:20 +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=1740604221; cv=none; b=Htcv7ufnpCrB81UNv1D3wmT70IFwH7TOmauAG3hbyudp/nh5hOhuuIMAh+IgtnHlc4jZkJppGoIl06xIWcU0dzpWkUAikdvoxuUfSc9OpGcKrvVGTvUcnvRztcz3gmfyjdye55tKaKH3ESKhzH6kiiezsthIAoeoY4dBywA9HeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604221; c=relaxed/simple; bh=iYvzApH6qU60kywYPgEBLorFXiBnZ0dDRWgxRggABjY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YvBs8p8ByasRHMtFdN3QHVi2j7z5tDvLQHQtCOeLkK8OlSsq+d3ZV794nCOqVTd1BtiGAhHsDPHwDhfgRvAgBqZeUnq0gEgpLzaiDxqwpdZj8EXvi1+m7hYqULCcFDca4qpXRiKS5wjSML6seRWrgPM5TZwmDzBAXtm1wT+8fuo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oxfHq/rm; 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="oxfHq/rm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96AECC4CEEE; Wed, 26 Feb 2025 21:10:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604220; bh=iYvzApH6qU60kywYPgEBLorFXiBnZ0dDRWgxRggABjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oxfHq/rm5OQA1GMHyMI7o1V4Ypf7iz9V3Da0P2HjlQnjmqIP77k475xRdf78T4x6z 4ch5jQNnYxHf302OFkzLr+kVuU1zCUDy6OqJ9duYLg73WlaSTEl5rsRb00z7d4rMQh xt3irNKf4hLXWTBGuTHwDAhJncC4O44jALAuoUC/d7SyMQNgRXQWobadoftdDDnl13 forg0NEbsqzgbLCisTfhWevonuZ9H3fy+J/UyC3+2VzHixhW4+ndZi3SQ8ivNsz/yD ikZKAyK6nxgjIXJNW+erCX9IY+PhJPS21vvmZTGvuw3V8Z2NW4Q7p/eThBZ51dwd7r uK3KLF8VKfQCA== 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, Jakub Kicinski Subject: [PATCH net-next 6/9] eth: bnxt: consolidate the GRO-but-not-really paths in bnxt_gro_skb() Date: Wed, 26 Feb 2025 13:10:00 -0800 Message-ID: <20250226211003.2790916-7-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 branch thru which all non-GRO packets coming out of bnxt_tpa_end() should pass. bnxt_gro_skb() is a static inline with a single caller, it will be inlined so there is no concern about adding an extra call. seg count will now be extracted every time, but tpa_end is touched by bnxt_tpa_end(), the field extraction will make no practical difference. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 497bc81ecdb9..113989b9b8cb 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, @@ -1744,7 +1745,7 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, u16 segs; segs = TPA_END_TPA_SEGS(tpa_end); - if (segs == 1 || !IS_ENABLED(CONFIG_INET)) + if (!gro || segs == 1 || !IS_ENABLED(CONFIG_INET)) return skb; NAPI_GRO_CB(skb)->count = segs; @@ -1917,10 +1918,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 Feb 26 21:10:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993204 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 6A3E525C6F9 for ; Wed, 26 Feb 2025 21:10:21 +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=1740604221; cv=none; b=hbj6RpNBaMeyd//+/esYqrTVv6wCO9bQS4jE5RsfaBykAHG6k58yDLdLWDczAcVtVJHUz5Olhtj6GmuTdFF09aJUKRLIzGIMwmpbUeOWqtIls7wlWRYtsnYziLJLfZSl4wgX/wumUPH0/eDIWw9MLYqSADwpw7HL2KyzV/R8zJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604221; c=relaxed/simple; bh=wDpxHyWHFCUeEZv52KR2HpfXqTqd/JK+iqCOuwwpZlg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Hz2H4Yu5XkRcTt21F0XQiq2cM1edC8otAX0ldmKbTzQSbxoZMe21o4fzvNDBamXziyKGxy/eFXqhfyy+da5e7TKlCDuA8MuKpM22Fxh0rZTgJBndKeS9/QEeAGEiff0+fJpyLOCDE7KhGlO1SqlfOiAPE6nbbaN5zGVm3uZ0qn0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=t17X+rGy; 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="t17X+rGy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 06E16C4CEE9; Wed, 26 Feb 2025 21:10:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604221; bh=wDpxHyWHFCUeEZv52KR2HpfXqTqd/JK+iqCOuwwpZlg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t17X+rGyf7lKfoLgsqmegM2M9FGKg61xPpE1FqcusiBgsqgDgg6ihNoazB85iJl+G 11T4YjCw3612mivX+Buda+RWe3t3tGhHp7+AC97MKZDNQhDw6J/Q5jD5OX0VFc1ldJ GTztWmhitvizx5ssp+3BwLPlwRIF/1L9qInmSkoYpZOKE+Y7hXkmfOfMjhmXBO3tol 4DMKh2UGCR6ho8NadUMLjYaYMDhSA/2jTqu84BMD1hPlGBFTXSEUAvAxkL+ldLEYeW PzpQ7RDnHDYF9cIpK+pOmlwEt9mnDssmMnjVVB3p7Sylox0EIZz22nZspGMNIyAlTl ewoKf1NVGc2IQ== 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, Jakub Kicinski Subject: [PATCH net-next 7/9] eth: bnxt: maintain rx pkt/byte stats in SW Date: Wed, 26 Feb 2025 13:10:01 -0800 Message-ID: <20250226211003.2790916-8-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 ++ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 96 +++++++++++++++-------- 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 34f23ddd4d71..1607a4a28bf0 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 { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 113989b9b8cb..b74495e0e5d5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -886,6 +886,24 @@ static bool bnxt_separate_head_pool(void) return PAGE_SIZE > BNXT_RX_PAGE_SIZE; } +static 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 struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping, struct bnxt_rx_ring_info *rxr, unsigned int *offset, @@ -1735,6 +1753,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, + struct bnxt_napi *bnapi, bool gro, struct bnxt_tpa_info *tpa_info, struct rx_tpa_end_cmp *tpa_end, @@ -1742,11 +1761,15 @@ static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp, struct sk_buff *skb) { int payload_off; + int full_len; u16 segs; + full_len = skb->len - skb_mac_offset(skb); segs = TPA_END_TPA_SEGS(tpa_end); - if (!gro || segs == 1 || !IS_ENABLED(CONFIG_INET)) + if (!gro || segs == 1 || !IS_ENABLED(CONFIG_INET)) { + bnxt_rx_pkt_cnt(bp, bnapi, skb->dev, 1, full_len, 0); return skb; + } NAPI_GRO_CB(skb)->count = segs; skb_shinfo(skb)->gso_size = @@ -1757,8 +1780,11 @@ 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)) + if (likely(skb)) { tcp_gro_complete(skb); + bnxt_rx_pkt_cnt(bp, bnapi, skb->dev, + segs, full_len, payload_off); + } return skb; } @@ -1918,7 +1944,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, @@ -2045,6 +2071,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 frag_len; u32 cmpl_ts; void *data; int rc = 0; @@ -2162,16 +2189,19 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, if (bnxt_xdp_attached(bp, rxr)) { bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); if (agg_bufs) { - u32 frag_len = bnxt_rx_agg_pages_xdp(bp, cpr, &xdp, - cp_cons, agg_bufs, - false); + frag_len = bnxt_rx_agg_pages_xdp(bp, cpr, &xdp, + cp_cons, agg_bufs, + false); if (!frag_len) goto oom_next_rx; + } else { + frag_len = 0; } xdp_active = true; } if (xdp_active && dev == bp->dev) { + bnxt_rx_pkt_cnt(bp, bnapi, dev, 1, len + frag_len, 0); if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { rc = 1; goto next_rx; @@ -2274,6 +2304,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } } } + + if (!xdp_active) /* XDP packets counted before calling XDP */ + bnxt_rx_pkt_cnt(bp, bnapi, dev, + 1, skb->len - skb_mac_offset(skb), 0); bnxt_deliver_skb(bp, bnapi, skb); rc = 1; @@ -5114,6 +5148,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) @@ -13091,7 +13127,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, @@ -13107,18 +13150,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); @@ -13209,6 +13247,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; @@ -15601,23 +15641,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, @@ -15647,8 +15681,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; From patchwork Wed Feb 26 21:10:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993206 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 D040325D525 for ; Wed, 26 Feb 2025 21:10:21 +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=1740604221; cv=none; b=gv6Aq+fanvS7nbfG/cVudN2y149n7GSZJ/QeY2PXPImxLK0t50sCzUnImOGNza+588GSE+O8Im+TU+pqcgqUIJkxqme4tMunM1w3Yk2fGX1fs0rGr6Wf4PmTNFYremSmonKf4PUtdo4v+ik7nwFcjE/KrRPOYgoU88LW70rNEK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604221; c=relaxed/simple; bh=z0YnAWMem+pepc7sP4RdvCMg1F/wluhcJATm2zSRdhQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KdlfCR7KRr7OZN5hfkcwS4QySIdvKIasnkMnN80kuBEaqyJnMWy4O+LPhPJcWCOh0TFcTtbeJOECUymVfOrFfH4wzM4eJm0bj7L1eLgkl0/mACAbEMyix1OM1HGGRLBABAHvvSkKOzHNi36s73JpqnSP96FvJoWn1dhz22kLS7Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ov1YzJqM; 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="ov1YzJqM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70221C4CEEF; Wed, 26 Feb 2025 21:10:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604221; bh=z0YnAWMem+pepc7sP4RdvCMg1F/wluhcJATm2zSRdhQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ov1YzJqMV6yp1UZHC9gRtM+CrDYQkQkx445IZbwQw5F1Sb3FE8etOyA2x4MKnyZrG FAOLpwa4mY/aKY/xZph5od3skA1qLhO2yVeA0JYB2lbT9XEB7+AX/OMQRQFyhgFLLR rShjfhCwiBXfLrC5WLKfNxcmNJ0rWQTkQtVpEuEh57xMcV5YEKZsIJVdH8Szn8xnrC XzEV5deyAJnkoDSfhBnu+VhLWVuAa8I4K0y0ciPba7+R+OfUeCdVp/kyN3pVsPMDTh G70Bor6FzbkGkdVMhGA+5DyXptIaUL0cT44+AI19knJvW2edpEH4FzISs7XhfDwbiM zAB2yE+J6Ns3w== 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, Jakub Kicinski Subject: [PATCH net-next 8/9] eth: bnxt: maintain tx pkt/byte stats in SW Date: Wed, 26 Feb 2025 13:10:02 -0800 Message-ID: <20250226211003.2790916-9-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 11 +++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 70 ++++++++++++++--------- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 1607a4a28bf0..e542e39bf84c 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -877,11 +877,14 @@ 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 hdr_size; u8 is_ts_pkt; u8 is_push; + u8 is_vfr; u8 action; unsigned short nr_frags; union { @@ -1128,6 +1131,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 +1160,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 b74495e0e5d5..19f823f1079b 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); @@ -675,6 +676,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 +788,9 @@ 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].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 +800,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 +831,18 @@ 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_segs * tx_buf->hdr_size; + } else { + adj_pkts--; + adj_bytes -= skb->len; + } tx_buf->skb = NULL; + tx_buf->extra_segs = 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 +878,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); @@ -5149,6 +5172,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); @@ -13127,14 +13151,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, @@ -13153,13 +13179,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); @@ -13251,6 +13272,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); @@ -15658,21 +15681,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, @@ -15685,8 +15703,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 Feb 26 21:10:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13993207 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 473A625D54A for ; Wed, 26 Feb 2025 21:10:22 +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=1740604222; cv=none; b=MH8OPCQ+cwq1frE4BfpXpN95/BN7Y6e0lBxJWyVj3pAlg1+fZE5Le8vFTKPwEESSGBN+MW8htk8e4/b9W0WxUheroAYWXQgJgiT0T2HyKX5h2ol5dt895UxbTFL9+z2YnWqiGcCKSGK+BFoDiWp+/CHEDyKidSMCj8p9hCT7gPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740604222; c=relaxed/simple; bh=B4NtmXfwn2HYA6yKWxEH+06tIkcoujNoYN6GOXvUlEY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tv8yw4XW2OEr1wP4hWc129bIEBtEbKN2gZtKj38Y9i1vXzkV+clbrlmIA1whomASlLlEkGCivi+/B8zcI5Q1Y+Zpf4ON4z7PDOw7D1Q66GmEL1bFJmEdlGHYyUCtguqL3WElGmk0MGvJPMgc7BOvmEwnL6kwPjIVnVKXRQTrcHA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Nr0Q2MuB; 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="Nr0Q2MuB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D45FFC4CEEB; Wed, 26 Feb 2025 21:10:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740604222; bh=B4NtmXfwn2HYA6yKWxEH+06tIkcoujNoYN6GOXvUlEY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Nr0Q2MuBe+sLse7Cz6+FbibM67tfZSsMtD5nCwYEB9dQbVvLNZ37+4s2zoe+N5b14 Zr2jX2TVH0lvcH6fm5k3/dDXXGMZ9r3JGk2mMiO1jxOYMlz05Y2ru5xNniZC/yx1BJ ShYnzisjqG3q/CPAyL14g5kExymbV4Mv5oxoDxdn3tbBmrmwbrUUz4eur0VMvjLtw/ CmN42PvvKcHpyG7ffu+kzx52wmYh0hwiHGqKySGUfj8xuaosMhnE7eTA5T19rJVKFA hXhINtIlk6fkzj/bezlcKEt7bF7kIvvaiutpWKLXG/x7juRy6XlKsyTdQbRwSMa4r0 udbUngZtmidjA== 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, Jakub Kicinski Subject: [PATCH net-next 9/9] eth: bnxt: count xdp xmit packets Date: Wed, 26 Feb 2025 13:10:03 -0800 Message-ID: <20250226211003.2790916-10-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226211003.2790916-1-kuba@kernel.org> References: <20250226211003.2790916-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 --- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 +++++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 23 +++++++++++++++++-- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 15 ++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index e542e39bf84c..6db34f8b8fa6 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -880,7 +880,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 hdr_size; u8 is_ts_pkt; u8 is_push; @@ -1134,6 +1137,8 @@ struct bnxt_tx_sw_stats { /* non-ethtool stats follow */ u64 tx_packets; u64 tx_bytes; + u64 xdp_packets; /* under rx syncp */ + u64 xdp_bytes; /* 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 19f823f1079b..ca68f677368e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -13181,6 +13181,8 @@ static void bnxt_get_ring_stats(struct bnxt *bp, stats->tx_packets += sw_stats.tx.tx_packets; stats->tx_bytes += sw_stats.tx.tx_bytes; + stats->tx_packets += sw_stats.tx.xdp_packets; + stats->tx_bytes += sw_stats.tx.xdp_bytes; stats->rx_missed_errors += BNXT_GET_RING_STATS64(sw, rx_discard_pkts); @@ -13272,8 +13274,9 @@ 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_packets += + sw_stats.tx.tx_packets + sw_stats.tx.xdp_packets; + stats->tx_total_bytes += sw_stats.tx.tx_bytes + sw_stats.tx.xdp_bytes; stats->tx_total_resets += sw_stats.tx.tx_resets; stats->tx_total_ring_discards += BNXT_GET_RING_STATS64(hw_stats, tx_discard_pkts); @@ -15698,6 +15701,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; @@ -15705,6 +15709,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->cp_nr_rings; 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.xdp_packets; + bytes = sw_stats->tx.xdp_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 e6c64e4bd66c..d4cd36f227b9 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -38,6 +38,7 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, if (xdp && xdp_buff_has_frags(xdp)) { sinfo = xdp_get_shared_info_from_buff(xdp); num_frags = sinfo->nr_frags; + tx_buf->xdp_len += sinfo->xdp_frags_size; } /* fill up the first buffer */ @@ -47,6 +48,8 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, if (xdp) tx_buf->page = virt_to_head_page(xdp->data); + tx_buf->xdp_len += len; + txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; flags = (len << TX_BD_LEN_SHIFT) | ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) | @@ -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.xdp_packets += pkts; + sw_stats->tx.xdp_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) {