From nobody Fri Dec 19 22:01:23 2025 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EEC47204C1A; Thu, 15 May 2025 14:52:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320735; cv=none; b=nE1pk9JTqRJ5L9HM0AFDPy1t/3Feo7D8NrlZVBV0pqkqE4KvCvKv3FjB3x21inOAqkr2kKOgcQmxFnUBIDX6Ymo6APzPl+n5oG2dDN1PQkIx1jBPFM4RFJcruY0ryc+NA+akNYmZ3F6sW0ZzOKTnI4GFNlVdIq9nxF9S6TdvQnM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320735; c=relaxed/simple; bh=VsHRR3f84fBAb9FF4LJjBVrW97zEYdMLijRt4SiB8Zk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=vBK+Oz3ZzjEUzxgROLTGrTh/EmdjDjAj7OkHTCo7pDbepWYmQ1mLfQXaPnqfvy0WPnbBs3cwgMNpDAjNNUP6RiRyiDoDs7cG+Zh2IeHeyNNIQveys/QMMEPYCVqQLKY69sEis7InKpjgl51CleeivEaDk0NpOeBWXSTpGTaDRQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FwVKbilp; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FwVKbilp" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-ad1d1f57a01so176846266b.2; Thu, 15 May 2025 07:52:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747320731; x=1747925531; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ir6NeGaambJZyW6CNbVNvvdCuP5BbNB3GX37dg5eAbY=; b=FwVKbilpO0eN3PaYKoO9tKBWVTLwPX1U424vOfKsKU75UVpzi82poDCvNtbfK1HRHg sxsQNih8AJkxH1Nomy3/cY2w0LPX8qc9ekaceitZl+KLjumyLcAnruvlQPGPFNK+uVxG pcIt40d0lVAN/0zT6cs0+umyq7cO6ucImMC5iNAG7cekDa93382q94taceUhkQmflSAk jZ2bV4bw11E2qlDXOtR4LYEH4Lk/lehJuPXSCkBP9YS3F80wKO6vqp3BTNohouo4gmOK oTHk/xLUqvCXQlyUnIHeoScSCYpjpd3YSPzNaI4KGmfjPd/bDsgjodLrHUpZbHfOpAfC 6YQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747320731; x=1747925531; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ir6NeGaambJZyW6CNbVNvvdCuP5BbNB3GX37dg5eAbY=; b=ikEchLgd0fjjoyMsrCs3p0VrO7uo5lwZePvJTQ0dN3SPa6FaMHcBuu0411r15KrMLP /QM/QRkTPBtXXmQHdXGR5tKvPOYzjyBjp+5jwB2roIhBozwl+TpZZN668yNAIlF86S6l 2ZHuDz+JMXfeT01PPsjSqRt8uyzkVdokyiKNNOzrA518xesX7vrpFW/RzlW9NV0O20ll dlriPgi1a4Y4iHN2JUGFtGemUhYfI0rDtSCS0bxsYs16/QdD/CHErXsBLNXFjEPobNfd KbPtNxTzETqIks2zfr8zbY9L0CIQTbMcfpNYyy7OjD8YokH1NrqIXOFxygg8wzddnC0P zZxg== X-Forwarded-Encrypted: i=1; AJvYcCVWK7SWrNj0zLZ+s4HObW4HugiIt//24Qf7EdPAU54tORBQej/u1LwjHJpQG+g7EqpVOPs/BlKJjuCxuYA=@vger.kernel.org, AJvYcCXYL3ZBrPVFcTxVXTJLg3aiiti6KBipNvhb90QRsyZ7VfDxJqg2ZUSlr3U6B00gQqx8bZkR+RJ9@vger.kernel.org X-Gm-Message-State: AOJu0Yxny+u7Oo7Vu8Lw0WTHATzmETYcae3X70+n2u/sBe0WO9QLfMMn FqkRzW1kaHurutt4AEWpjbKpyNV9owsz6oAiMEuapms0TtPvbefe X-Gm-Gg: ASbGncttyDOuqUouTJAnjv1R6kJznFCE9nf2W01sMDtdA6l0D7kn6X+t7cxDr0wkMGj 6HJswYQ1WZOpuC8klzYXNGOW1bHIRelWkO3RYQ3e2LuP7LGkBMQwSQ1jpMbFoCZgYjIu8r9sp4D 2eYMKK/LqUV7FeyOgMKmdFyps1O52E85d5mDF7ik26O6ihIzS0Gz8EXCt61VVfh2CkD5wKvggEq 4gkcn7HDZ/PBjr9nfqp3PxuLtUxVcvLvWMPrHyiuY1gI0uboKL21+vcbCD+ehrEaRDyuj+k+yIZ DkKDI3hDxNXYbrgBffTBHTvpqNTLrf43bjtcvoNWfb5p9a4PkAoT1x4TsEMe96fXoZFZZhCn X-Google-Smtp-Source: AGHT+IEAo/xb+kVAQ7c72Z+DIzqx+/o3GaODPGrliANuRdYc/z9OQ1jc2hx8WO6BidviT/dp83vfXg== X-Received: by 2002:a17:907:9688:b0:ad2:5525:f289 with SMTP id a640c23a62f3a-ad4f7292ccdmr799451166b.40.1747320730872; Thu, 15 May 2025 07:52:10 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ad52d275d9fsm871366b.74.2025.05.15.07.52.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 07:52:10 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH v2 1/3] net: bcmgenet: switch to use 64bit statistics Date: Thu, 15 May 2025 15:51:40 +0100 Message-Id: <20250515145142.1415-2-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250515145142.1415-1-zakkemble@gmail.com> References: <20250515145142.1415-1-zakkemble@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update the driver to use ndo_get_stats64, rtnl_link_stats64 and u64_stats_t counters for statistics. Signed-off-by: Zak Kemble --- .../net/ethernet/broadcom/genet/bcmgenet.c | 251 ++++++++++++------ .../net/ethernet/broadcom/genet/bcmgenet.h | 32 ++- 2 files changed, 195 insertions(+), 88 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index 73d78dcb7..64133a98a 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -969,12 +969,13 @@ static int bcmgenet_set_pauseparam(struct net_device = *dev, =20 /* standard ethtool support functions. */ enum bcmgenet_stat_type { - BCMGENET_STAT_NETDEV =3D -1, + BCMGENET_STAT_RTNL =3D -1, BCMGENET_STAT_MIB_RX, BCMGENET_STAT_MIB_TX, BCMGENET_STAT_RUNT, BCMGENET_STAT_MISC, BCMGENET_STAT_SOFT, + BCMGENET_STAT_SOFT64, }; =20 struct bcmgenet_stats { @@ -984,13 +985,15 @@ struct bcmgenet_stats { enum bcmgenet_stat_type type; /* reg offset from UMAC base for misc counters */ u16 reg_offset; + /* sync for u64 stats counters */ + int syncp_offset; }; =20 -#define STAT_NETDEV(m) { \ +#define STAT_RTNL(m) { \ .stat_string =3D __stringify(m), \ - .stat_sizeof =3D sizeof(((struct net_device_stats *)0)->m), \ - .stat_offset =3D offsetof(struct net_device_stats, m), \ - .type =3D BCMGENET_STAT_NETDEV, \ + .stat_sizeof =3D sizeof(((struct rtnl_link_stats64 *)0)->m), \ + .stat_offset =3D offsetof(struct rtnl_link_stats64, m), \ + .type =3D BCMGENET_STAT_RTNL, \ } =20 #define STAT_GENET_MIB(str, m, _type) { \ @@ -1000,6 +1003,14 @@ struct bcmgenet_stats { .type =3D _type, \ } =20 +#define STAT_GENET_SOFT_MIB64(str, s, m) { \ + .stat_string =3D str, \ + .stat_sizeof =3D sizeof(((struct bcmgenet_priv *)0)->s.m), \ + .stat_offset =3D offsetof(struct bcmgenet_priv, s.m), \ + .type =3D BCMGENET_STAT_SOFT64, \ + .syncp_offset =3D offsetof(struct bcmgenet_priv, s.syncp), \ +} + #define STAT_GENET_MIB_RX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB= _RX) #define STAT_GENET_MIB_TX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB= _TX) #define STAT_GENET_RUNT(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_RUNT) @@ -1014,18 +1025,18 @@ struct bcmgenet_stats { } =20 #define STAT_GENET_Q(num) \ - STAT_GENET_SOFT_MIB("txq" __stringify(num) "_packets", \ - tx_rings[num].packets), \ - STAT_GENET_SOFT_MIB("txq" __stringify(num) "_bytes", \ - tx_rings[num].bytes), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_bytes", \ - rx_rings[num].bytes), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_packets", \ - rx_rings[num].packets), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_errors", \ - rx_rings[num].errors), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_dropped", \ - rx_rings[num].dropped) + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_packets", \ + tx_rings[num].stats64, packets), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_bytes", \ + tx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_bytes", \ + rx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_packets", \ + rx_rings[num].stats64, packets), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_errors", \ + rx_rings[num].stats64, errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_dropped", \ + rx_rings[num].stats64, dropped) =20 /* There is a 0xC gap between the end of RX and beginning of TX stats and = then * between the end of TX stats and the beginning of the RX RUNT @@ -1037,15 +1048,15 @@ struct bcmgenet_stats { */ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] =3D { /* general stats */ - STAT_NETDEV(rx_packets), - STAT_NETDEV(tx_packets), - STAT_NETDEV(rx_bytes), - STAT_NETDEV(tx_bytes), - STAT_NETDEV(rx_errors), - STAT_NETDEV(tx_errors), - STAT_NETDEV(rx_dropped), - STAT_NETDEV(tx_dropped), - STAT_NETDEV(multicast), + STAT_RTNL(rx_packets), + STAT_RTNL(tx_packets), + STAT_RTNL(rx_bytes), + STAT_RTNL(tx_bytes), + STAT_RTNL(rx_errors), + STAT_RTNL(tx_errors), + STAT_RTNL(rx_dropped), + STAT_RTNL(tx_dropped), + STAT_RTNL(multicast), /* UniMAC RSV counters */ STAT_GENET_MIB_RX("rx_64_octets", mib.rx.pkt_cnt.cnt_64), STAT_GENET_MIB_RX("rx_65_127_oct", mib.rx.pkt_cnt.cnt_127), @@ -1133,6 +1144,20 @@ static const struct bcmgenet_stats bcmgenet_gstrings= _stats[] =3D { =20 #define BCMGENET_STATS_LEN ARRAY_SIZE(bcmgenet_gstrings_stats) =20 +#define BCMGENET_STATS64_ADD(stats, m, v) \ + do { \ + u64_stats_update_begin(&stats->syncp); \ + u64_stats_add(&stats->m, v); \ + u64_stats_update_end(&stats->syncp); \ + } while (0) + +#define BCMGENET_STATS64_INC(stats, m) \ + do { \ + u64_stats_update_begin(&stats->syncp); \ + u64_stats_inc(&stats->m); \ + u64_stats_update_end(&stats->syncp); \ + } while (0) + static void bcmgenet_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { @@ -1216,8 +1241,9 @@ static void bcmgenet_update_mib_counters(struct bcmge= net_priv *priv) =20 s =3D &bcmgenet_gstrings_stats[i]; switch (s->type) { - case BCMGENET_STAT_NETDEV: + case BCMGENET_STAT_RTNL: case BCMGENET_STAT_SOFT: + case BCMGENET_STAT_SOFT64: continue; case BCMGENET_STAT_RUNT: offset +=3D BCMGENET_STAT_OFFSET; @@ -1255,28 +1281,40 @@ static void bcmgenet_get_ethtool_stats(struct net_d= evice *dev, u64 *data) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct u64_stats_sync *syncp; + struct rtnl_link_stats64 stats64; + unsigned int start; int i; =20 if (netif_running(dev)) bcmgenet_update_mib_counters(priv); =20 - dev->netdev_ops->ndo_get_stats(dev); + dev_get_stats(dev, &stats64); =20 for (i =3D 0; i < BCMGENET_STATS_LEN; i++) { const struct bcmgenet_stats *s; char *p; =20 s =3D &bcmgenet_gstrings_stats[i]; - if (s->type =3D=3D BCMGENET_STAT_NETDEV) - p =3D (char *)&dev->stats; - else - p =3D (char *)priv; - p +=3D s->stat_offset; - if (sizeof(unsigned long) !=3D sizeof(u32) && - s->stat_sizeof =3D=3D sizeof(unsigned long)) - data[i] =3D *(unsigned long *)p; - else - data[i] =3D *(u32 *)p; + p =3D (char *)priv; + + if (s->type =3D=3D BCMGENET_STAT_SOFT64) { + syncp =3D (struct u64_stats_sync *)(p + s->syncp_offset); + do { + start =3D u64_stats_fetch_begin(syncp); + data[i] =3D u64_stats_read((u64_stats_t *)(p + s->stat_offset)); + } while (u64_stats_fetch_retry(syncp, start)); + } else { + if (s->type =3D=3D BCMGENET_STAT_RTNL) + p =3D (char *)&stats64; + + p +=3D s->stat_offset; + if (sizeof(unsigned long) !=3D sizeof(u32) && + s->stat_sizeof =3D=3D sizeof(unsigned long)) + data[i] =3D *(unsigned long *)p; + else + data[i] =3D *(u32 *)p; + } } } =20 @@ -1857,6 +1895,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_= device *dev, struct bcmgenet_tx_ring *ring) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &ring->stats64; unsigned int txbds_processed =3D 0; unsigned int bytes_compl =3D 0; unsigned int pkts_compl =3D 0; @@ -1896,8 +1935,10 @@ static unsigned int __bcmgenet_tx_reclaim(struct net= _device *dev, ring->free_bds +=3D txbds_processed; ring->c_index =3D c_index; =20 - ring->packets +=3D pkts_compl; - ring->bytes +=3D bytes_compl; + u64_stats_update_begin(&stats->syncp); + u64_stats_add(&stats->packets, pkts_compl); + u64_stats_add(&stats->bytes, bytes_compl); + u64_stats_update_end(&stats->syncp); =20 netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->index), pkts_compl, bytes_compl); @@ -1983,9 +2024,11 @@ static void bcmgenet_tx_reclaim_all(struct net_devic= e *dev) * the transmit checksum offsets in the descriptors */ static struct sk_buff *bcmgenet_add_tsb(struct net_device *dev, - struct sk_buff *skb) + struct sk_buff *skb, + struct bcmgenet_tx_ring *ring) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &ring->stats64; struct status_64 *status =3D NULL; struct sk_buff *new_skb; u16 offset; @@ -2001,7 +2044,7 @@ static struct sk_buff *bcmgenet_add_tsb(struct net_de= vice *dev, if (!new_skb) { dev_kfree_skb_any(skb); priv->mib.tx_realloc_tsb_failed++; - dev->stats.tx_dropped++; + BCMGENET_STATS64_INC(stats, dropped); return NULL; } dev_consume_skb_any(skb); @@ -2089,7 +2132,7 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb,= struct net_device *dev) GENET_CB(skb)->bytes_sent =3D skb->len; =20 /* add the Transmit Status Block */ - skb =3D bcmgenet_add_tsb(dev, skb); + skb =3D bcmgenet_add_tsb(dev, skb, ring); if (!skb) { ret =3D NETDEV_TX_OK; goto out; @@ -2233,6 +2276,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, { struct bcmgenet_priv *priv =3D ring->priv; struct net_device *dev =3D priv->dev; + struct bcmgenet_rx_stats64 *stats =3D &ring->stats64; struct enet_cb *cb; struct sk_buff *skb; u32 dma_length_status; @@ -2253,7 +2297,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, DMA_P_INDEX_DISCARD_CNT_MASK; if (discards > ring->old_discards) { discards =3D discards - ring->old_discards; - ring->errors +=3D discards; + BCMGENET_STATS64_ADD(stats, errors, discards); ring->old_discards +=3D discards; =20 /* Clear HW register when we reach 75% of maximum 0xFFFF */ @@ -2279,7 +2323,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, skb =3D bcmgenet_rx_refill(priv, cb); =20 if (unlikely(!skb)) { - ring->dropped++; + BCMGENET_STATS64_INC(stats, dropped); goto next; } =20 @@ -2306,8 +2350,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, =20 if (unlikely(len > RX_BUF_LENGTH)) { netif_err(priv, rx_status, dev, "oversized packet\n"); - dev->stats.rx_length_errors++; - dev->stats.rx_errors++; + BCMGENET_STATS64_INC(stats, length_errors); dev_kfree_skb_any(skb); goto next; } @@ -2315,7 +2358,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) { netif_err(priv, rx_status, dev, "dropping fragmented packet!\n"); - ring->errors++; + BCMGENET_STATS64_INC(stats, fragmented_errors); dev_kfree_skb_any(skb); goto next; } @@ -2328,15 +2371,22 @@ static unsigned int bcmgenet_desc_rx(struct bcmgene= t_rx_ring *ring, DMA_RX_RXER))) { netif_err(priv, rx_status, dev, "dma_flag=3D0x%x\n", (unsigned int)dma_flag); + u64_stats_update_begin(&stats->syncp); if (dma_flag & DMA_RX_CRC_ERROR) - dev->stats.rx_crc_errors++; + u64_stats_inc(&stats->crc_errors); if (dma_flag & DMA_RX_OV) - dev->stats.rx_over_errors++; + u64_stats_inc(&stats->over_errors); if (dma_flag & DMA_RX_NO) - dev->stats.rx_frame_errors++; + u64_stats_inc(&stats->frame_errors); if (dma_flag & DMA_RX_LG) - dev->stats.rx_length_errors++; - dev->stats.rx_errors++; + u64_stats_inc(&stats->length_errors); + if ((dma_flag & (DMA_RX_CRC_ERROR | + DMA_RX_OV | + DMA_RX_NO | + DMA_RX_LG | + DMA_RX_RXER)) =3D=3D DMA_RX_RXER) + u64_stats_inc(&stats->errors); + u64_stats_update_end(&stats->syncp); dev_kfree_skb_any(skb); goto next; } /* error packet */ @@ -2356,10 +2406,13 @@ static unsigned int bcmgenet_desc_rx(struct bcmgene= t_rx_ring *ring, =20 /*Finish setting up the received SKB and send it to the kernel*/ skb->protocol =3D eth_type_trans(skb, priv->dev); - ring->packets++; - ring->bytes +=3D len; + + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->packets); + u64_stats_add(&stats->bytes, len); if (dma_flag & DMA_RX_MULT) - dev->stats.multicast++; + u64_stats_inc(&stats->multicast); + u64_stats_update_end(&stats->syncp); =20 /* Notify kernel */ napi_gro_receive(&ring->napi, skb); @@ -3402,6 +3455,7 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx= _ring *ring) static void bcmgenet_timeout(struct net_device *dev, unsigned int txqueue) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &priv->tx_rings[txqueue].stats64; u32 int1_enable =3D 0; unsigned int q; =20 @@ -3420,7 +3474,7 @@ static void bcmgenet_timeout(struct net_device *dev, = unsigned int txqueue) =20 netif_trans_update(dev); =20 - dev->stats.tx_errors++; + BCMGENET_STATS64_INC(stats, errors); =20 netif_tx_wake_all_queues(dev); } @@ -3509,39 +3563,72 @@ static int bcmgenet_set_mac_addr(struct net_device = *dev, void *p) return 0; } =20 -static struct net_device_stats *bcmgenet_get_stats(struct net_device *dev) +static void bcmgenet_get_stats64(struct net_device *dev, + struct rtnl_link_stats64 *stats) { struct bcmgenet_priv *priv =3D netdev_priv(dev); - unsigned long tx_bytes =3D 0, tx_packets =3D 0; - unsigned long rx_bytes =3D 0, rx_packets =3D 0; - unsigned long rx_errors =3D 0, rx_dropped =3D 0; - struct bcmgenet_tx_ring *tx_ring; - struct bcmgenet_rx_ring *rx_ring; + u64 tx_bytes =3D 0, tx_packets =3D 0; + u64 tx_errors =3D 0, tx_dropped =3D 0; + u64 rx_bytes =3D 0, rx_packets =3D 0; + u64 rx_errors =3D 0, rx_dropped =3D 0; + u64 rx_length_errors =3D 0; + u64 rx_over_errors =3D 0, rx_crc_errors =3D 0; + u64 rx_frame_errors =3D 0, rx_fragmented_errors =3D 0; + u64 multicast =3D 0; + struct bcmgenet_tx_stats64 *tx_stats; + struct bcmgenet_rx_stats64 *rx_stats; unsigned int q; + unsigned int start; =20 for (q =3D 0; q <=3D priv->hw_params->tx_queues; q++) { - tx_ring =3D &priv->tx_rings[q]; - tx_bytes +=3D tx_ring->bytes; - tx_packets +=3D tx_ring->packets; + tx_stats =3D &priv->tx_rings[q].stats64; + do { + =09 + start =3D u64_stats_fetch_begin(&tx_stats->syncp); + tx_bytes =3D u64_stats_read(&tx_stats->bytes); + tx_packets =3D u64_stats_read(&tx_stats->packets); + tx_errors =3D u64_stats_read(&tx_stats->errors); + tx_dropped =3D u64_stats_read(&tx_stats->dropped); + } while (u64_stats_fetch_retry(&tx_stats->syncp, start)); + + stats->tx_bytes +=3D tx_bytes; + stats->tx_packets +=3D tx_packets; + stats->tx_errors +=3D tx_errors; + stats->tx_dropped +=3D tx_dropped; } =20 for (q =3D 0; q <=3D priv->hw_params->rx_queues; q++) { - rx_ring =3D &priv->rx_rings[q]; - - rx_bytes +=3D rx_ring->bytes; - rx_packets +=3D rx_ring->packets; - rx_errors +=3D rx_ring->errors; - rx_dropped +=3D rx_ring->dropped; + rx_stats =3D &priv->rx_rings[q].stats64; + do { + start =3D u64_stats_fetch_begin(&rx_stats->syncp); + rx_bytes =3D u64_stats_read(&rx_stats->bytes); + rx_packets =3D u64_stats_read(&rx_stats->packets); + rx_errors =3D u64_stats_read(&rx_stats->errors); + rx_dropped =3D u64_stats_read(&rx_stats->dropped); + rx_length_errors =3D u64_stats_read(&rx_stats->length_errors); + rx_over_errors =3D u64_stats_read(&rx_stats->over_errors); + rx_crc_errors =3D u64_stats_read(&rx_stats->crc_errors); + rx_frame_errors =3D u64_stats_read(&rx_stats->frame_errors); + rx_fragmented_errors =3D u64_stats_read(&rx_stats->fragmented_errors); + multicast =3D u64_stats_read(&rx_stats->multicast); + } while (u64_stats_fetch_retry(&rx_stats->syncp, start)); + + rx_errors +=3D rx_length_errors; + rx_errors +=3D rx_crc_errors; + rx_errors +=3D rx_frame_errors; + rx_errors +=3D rx_fragmented_errors; + + stats->rx_bytes +=3D rx_bytes; + stats->rx_packets +=3D rx_packets; + stats->rx_errors +=3D rx_errors; + stats->rx_dropped +=3D rx_dropped; + stats->rx_missed_errors +=3D rx_errors; + stats->rx_length_errors +=3D rx_length_errors; + stats->rx_over_errors +=3D rx_over_errors; + stats->rx_crc_errors +=3D rx_crc_errors; + stats->rx_frame_errors +=3D rx_frame_errors; + stats->multicast +=3D multicast; } - - dev->stats.tx_bytes =3D tx_bytes; - dev->stats.tx_packets =3D tx_packets; - dev->stats.rx_bytes =3D rx_bytes; - dev->stats.rx_packets =3D rx_packets; - dev->stats.rx_errors =3D rx_errors; - dev->stats.rx_missed_errors =3D rx_errors; - dev->stats.rx_dropped =3D rx_dropped; - return &dev->stats; } =20 static int bcmgenet_change_carrier(struct net_device *dev, bool new_carrie= r) @@ -3569,7 +3656,7 @@ static const struct net_device_ops bcmgenet_netdev_op= s =3D { .ndo_set_mac_address =3D bcmgenet_set_mac_addr, .ndo_eth_ioctl =3D phy_do_ioctl_running, .ndo_set_features =3D bcmgenet_set_features, - .ndo_get_stats =3D bcmgenet_get_stats, + .ndo_get_stats64 =3D bcmgenet_get_stats64, .ndo_change_carrier =3D bcmgenet_change_carrier, }; =20 diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/e= thernet/broadcom/genet/bcmgenet.h index 10c631bbe..5ec397977 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -155,6 +155,30 @@ struct bcmgenet_mib_counters { u32 tx_realloc_tsb_failed; }; =20 +struct bcmgenet_tx_stats64 { + struct u64_stats_sync syncp; + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + u64_stats_t dropped; +}; + +struct bcmgenet_rx_stats64 { + struct u64_stats_sync syncp; + u64_stats_t bytes; + u64_stats_t packets; + u64_stats_t errors; + u64_stats_t dropped; + u64_stats_t multicast; + u64_stats_t broadcast; + u64_stats_t missed; + u64_stats_t length_errors; + u64_stats_t over_errors; + u64_stats_t crc_errors; + u64_stats_t frame_errors; + u64_stats_t fragmented_errors; +}; + #define UMAC_MIB_START 0x400 =20 #define UMAC_MDIO_CMD 0x614 @@ -515,8 +539,7 @@ struct bcmgenet_skb_cb { struct bcmgenet_tx_ring { spinlock_t lock; /* ring lock */ struct napi_struct napi; /* NAPI per tx queue */ - unsigned long packets; - unsigned long bytes; + struct bcmgenet_tx_stats64 stats64; unsigned int index; /* ring index */ struct enet_cb *cbs; /* tx ring buffer control block*/ unsigned int size; /* size of each tx ring */ @@ -540,10 +563,7 @@ struct bcmgenet_net_dim { =20 struct bcmgenet_rx_ring { struct napi_struct napi; /* Rx NAPI struct */ - unsigned long bytes; - unsigned long packets; - unsigned long errors; - unsigned long dropped; + struct bcmgenet_rx_stats64 stats64; unsigned int index; /* Rx ring index */ struct enet_cb *cbs; /* Rx ring buffer control block */ unsigned int size; /* Rx ring size */ --=20 2.39.5 From nobody Fri Dec 19 22:01:23 2025 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 341021FFC50; Thu, 15 May 2025 14:52:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320742; cv=none; b=utFixT2aPQ2GytGijHDuPxtbj4dqh/Vix03ixHlFPEn+N4KU1poaopUw3KeczJYf7f8Oxn+LjxcGIP8Ncaa+zuXs9l2EOrfumMbCNxBxngNlQOpBPmKj5vtrY9x3nk/Zg+YNaSOa8S0mMjZRFxOmPj8fz0ShCJyT3T8JiYQV7zs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320742; c=relaxed/simple; bh=7ffEw+ptMS7peJNS6GPFMcGsjW2HNANDVfhEBIaS0HA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Sra87tULCpxICIfj6ksu3uqx6GZhPRgTYEhXVfLwhx5nTLYAi6xBAfhXopuknid2Kra2q003W45CeaAdNhCAszTMMDsErVQeou4QlHNF/PcRZyJ3Y/ADkzF3S9mglx6tNbhtgTlkZ8umvym2/YI/5TAiV1Ufygyq/F3bnrmpI98= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SZsoUZcd; arc=none smtp.client-ip=209.85.218.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SZsoUZcd" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-ad2490d7838so199968666b.0; Thu, 15 May 2025 07:52:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747320737; x=1747925537; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rvffsbynJDZv+lCO17Qh9aP9Vq1i5+xxef3WNN/Cri8=; b=SZsoUZcdL1WWzmWtoqFsKw74Vuc/RdgHWxS0ImLzGGj/Ls5sCF7fd3V6ajxy7hbzcX wK1XbvcTHVmNX3UOFkx1lXezoIebQxfVkBMT7EQZ/EfvXZ/EO01wtgcBB7zwq77tOw9B Snvmt9jNtVfqrfVLvALIeYNZP62oqzNdd6HKUHcu54Dln+m94F10ctBpJbfZqF0xqm90 EuWqXSYW9/mvOiFzBbXq3C5HirWL04ozfO8gtiw2Kgh6/iACQSBQ0oOfNwX/qd39xF8u fonN6Fa3JhZgoHC/js55IfHptixkYHHtgGbl21ookHKaKgNIO4bLNbX5QshSYpSA5aOC PrNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747320737; x=1747925537; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rvffsbynJDZv+lCO17Qh9aP9Vq1i5+xxef3WNN/Cri8=; b=Sg0M2gNCDZPjvYIVWO1pqzQb+BChUsdfuVz9TgJg7TG65FWwhUD7MdskV0NaVyLwoo JzA0csOn1yBBT+C2jEHA1GTQUYZilkJ3fc2twosVJuf/qIJn13VaVL9TwYR13xlpXwoS HxMN/Ay+Hl8184mE/QnpAMzn0bzf8mj31ZhRpDkxdaoHd6l0sj0Gbesep2qFCBCY6KHj yS6CZSudOdjAhoepf8l8vAT7j0dRTWLBmRMdkiiYOKnrh7jXvRierMM0faZ+x1BqawJN 8kTyiR/o7BfsGcB/ofrqD2ISDjS59AUZ6deAW+L8LqivJLuzGYKB4yjWN2BJh8bpDAlm kzkA== X-Forwarded-Encrypted: i=1; AJvYcCVRCI/DHRpDRug+oOnzvXqg45XKFEWu0OSgAPiQkXdqG5pCveualJDAuWEs15Vn20gikmjGhhdXWmNYBg4=@vger.kernel.org, AJvYcCXhbWNcAReQ3tLTqD94I9XYm6LDVY068ktCe8fUnO394Yi26Jvnml3I8T9Zy+nR8jpu4+hgW210@vger.kernel.org X-Gm-Message-State: AOJu0YykhHaEk0QI3mM3sXFYE75YcM7wlRGiRXcBbc4m6CIxjYdFrCbk F6ZpSJVJdc5+L+2p9hn2BvOF1rsydd7QtubK/VoUAXB0AxZXLz7G X-Gm-Gg: ASbGncvJc1oLDdKzQNE9CoYTWNtUAGUiL1o4Rs5Ufu5ZtdlO+N2FOD7c3+yU5rvbwKm L5/461WreIkw5Qw9ujHZMhY2GbFb/ZF1S58GERqKXi5mX9I+PztARVEZox+z+iySHh8xu7UXvzu E4z6ZZTD2p5C5dzS+Laa536ClBw4R99IO0H8XNYGFFONYecXpGUZXr6qkfdSKDycAqWQPbKNsDP 0QeNqCWgSnON+CUz1agw/oYTRjG59EpHbZZZm+PuBq0X8XfZdrRXJTAHnj6FIjgRu175hc0PbCQ 6CQ0FjjegnMeTkp6t1V26giAEic09zPZ7BwUTbyf1GsR1QYH+Lc6YCKWPJn0lA== X-Google-Smtp-Source: AGHT+IEV9m289XRZjq5k94PrSxEo72xgluP61Apz2/IW6lpcrKev99kJm3l/NxC95pkz0+OmvTIbJA== X-Received: by 2002:a17:907:5c1:b0:ad5:2d05:ba12 with SMTP id a640c23a62f3a-ad52d05ecafmr3050666b.46.1747320737071; Thu, 15 May 2025 07:52:17 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ad52d275d9fsm871366b.74.2025.05.15.07.52.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 07:52:16 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH v2 2/3] net: bcmgenet: count hw discarded packets in missed stat Date: Thu, 15 May 2025 15:51:41 +0100 Message-Id: <20250515145142.1415-3-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250515145142.1415-1-zakkemble@gmail.com> References: <20250515145142.1415-1-zakkemble@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hardware discarded packets are now counted in their own missed stat instead of being lumped in with general errors. Signed-off-by: Zak Kemble --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index 64133a98a..d0c6b5d4c 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2297,7 +2297,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, DMA_P_INDEX_DISCARD_CNT_MASK; if (discards > ring->old_discards) { discards =3D discards - ring->old_discards; - BCMGENET_STATS64_ADD(stats, errors, discards); + BCMGENET_STATS64_ADD(stats, missed, discards); ring->old_discards +=3D discards; =20 /* Clear HW register when we reach 75% of maximum 0xFFFF */ @@ -3571,7 +3571,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, u64 tx_errors =3D 0, tx_dropped =3D 0; u64 rx_bytes =3D 0, rx_packets =3D 0; u64 rx_errors =3D 0, rx_dropped =3D 0; - u64 rx_length_errors =3D 0; + u64 rx_missed =3D 0, rx_length_errors =3D 0; u64 rx_over_errors =3D 0, rx_crc_errors =3D 0; u64 rx_frame_errors =3D 0, rx_fragmented_errors =3D 0; u64 multicast =3D 0; @@ -3605,6 +3605,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, rx_packets =3D u64_stats_read(&rx_stats->packets); rx_errors =3D u64_stats_read(&rx_stats->errors); rx_dropped =3D u64_stats_read(&rx_stats->dropped); + rx_missed =3D u64_stats_read(&rx_stats->missed); rx_length_errors =3D u64_stats_read(&rx_stats->length_errors); rx_over_errors =3D u64_stats_read(&rx_stats->over_errors); rx_crc_errors =3D u64_stats_read(&rx_stats->crc_errors); @@ -3622,7 +3623,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, stats->rx_packets +=3D rx_packets; stats->rx_errors +=3D rx_errors; stats->rx_dropped +=3D rx_dropped; - stats->rx_missed_errors +=3D rx_errors; + stats->rx_missed_errors +=3D rx_missed; stats->rx_length_errors +=3D rx_length_errors; stats->rx_over_errors +=3D rx_over_errors; stats->rx_crc_errors +=3D rx_crc_errors; --=20 2.39.5 From nobody Fri Dec 19 22:01:23 2025 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16F2C1F8F09; Thu, 15 May 2025 14:52:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320746; cv=none; b=i3gFXocJfeMOnilMnRKSIduxkQJDIjlIcXwUfOVcYrIQHk2MYswV4rKzfOjp8Y9xCMGIC/F/Zq/cAM0dH3ybd5E99rYKsY8Np+MLye3iUpxSdwewQ7Rb/6GCRjmW0dFcXq6xeNBtStA6eC+OmmicjikSmBErPskpXioys9DAiS4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747320746; c=relaxed/simple; bh=mr5eN8kDDujcymHMecpSJ6P6WIBjSLa0r0ZCXb+95X0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=s6Xe1MmMR4yw/FscSe0HLUSqWDGnAIZ2rOC4MgP0cQjD5IYUPFT4k0ldW9t/NoRQJS8m9wPx3ihevTtTfmxKNuPErhVgao6lUd71Bvo+g7AfI0GsFxzhMB50U7jqiH7xuZ9Sx9q7PCcBw2AWxfSDRhcL3Rf86rmlN9k5Xhhe4RM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=drY2wyQ9; arc=none smtp.client-ip=209.85.218.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="drY2wyQ9" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-ad238c68b35so193928066b.1; Thu, 15 May 2025 07:52:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747320743; x=1747925543; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qqWQ4T2nQ1xuhm/I08cl/zAkrwJKQvzmwnNYg7uixA0=; b=drY2wyQ9Wqkv7jDNxAsRsFsVqcB0FWm2vm2h6MSj2BD0Ut0IF8WyBiyTgxh/831nMZ u8Tp5+1I80rwo+Xl1CIvF2Dw1ELLO4LKFLGenB2NHyL4gXm3zd9WOyCja4f39edelzXI 3/XHVWrkfDYJZRXDMw4RXaneXJzmatSeFFBp/tN33TZio/4fSEL8UUR8Nb6G2l6LBHsK BvUbkm7giqJtfkx0XyBJ5cxxnW5Y81ORSCMcdR/9OQHuaP5nXZvegkKxJOCzYeL4ilgf wvjRJLRcEvaWSCnu2CxGU9O5aCSeyq5AiaYghQXxYSpsaYjdG2rtn3QIisZG2nExw8gJ d2wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747320743; x=1747925543; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qqWQ4T2nQ1xuhm/I08cl/zAkrwJKQvzmwnNYg7uixA0=; b=aEsfCTFyq7HDXRoyx2YMnGbSlPEu3Il3ONUnoXbEA6hK/cAvWU2uLqeYcG9Wq6FU/C MC2Cfjdn2+2B99WsDFrZHcoOW0vU+h377e6QG3V6QKwBjhSIA4rIeDhbbXQnn00ToQg+ +kR6/eqIXcSE7SW0Cykz9Y9/fxabqiOPmbHq6MtifNZtsFTakzg7mUk87c96aBTdYCQp Cv6vtr50O+TwEw/h7IkUdWZ4EAyRJUCakmJniKLdBL7OZPgZjUb3ylqVPbPQQGy7oOon 7T2n1QV776dfRvUfFLbjsdmc9PMDwnz/clvSD436oDhMoTwDHwup2GHPo7cmnYJGWwa1 Ov+w== X-Forwarded-Encrypted: i=1; AJvYcCVBr6e90N4gXmmT0Szq0rNB2eoUn5/fu8DCJhGHnGroKSQpX+Vhe019LcY+gOyYXwgbDxeZgL15BLGQwec=@vger.kernel.org, AJvYcCX9xFt7ip5DluG49Ffvf6KoRBGmDItkT/nl74/O2ta0DRrc6UfZJIfqgaH0s2VhCIf+PhV0aZSY@vger.kernel.org X-Gm-Message-State: AOJu0Yz6GgLVQANNF8IfZgkRJ8mo8yTF/G8tk4qtuGLGupQg3mJE8oEw pbck3diloFF4FnLU88pgdhuqPcywjUFbhePeF6xSj0+debCw8odr X-Gm-Gg: ASbGncuPO+qGMlgRDFBk7ZihHyyKqvbyaZm0z/G7UZ0FAX/kazPW0rOmfe2beBLkuP8 f/AJYF0l1VRAtqNoqsMpY3gXtdRPey1DUPJ8CMxvofhCMikp13SFyKeRRa010FrpajXKQP349s1 eNehlYI/mhn8aJ2/mkKpG4d/NKt9OZA270QH5gl4VvyByeYskPvtbzK7s9Fjg5ECN/yjJR7374d 05EFRHRsDSnfA0D7J3OPapUdIqbFqzlrCfbTfGLu6EZ+fHliXXod1rVM7/utu1cqp0NBr0lhUie bx2rqCnwIkdU6ddIGzUOfHOBn0oLmRNW1FTz8cR+Ptmk1knTn0uzBl0YazF+CQ== X-Google-Smtp-Source: AGHT+IEfE3FRqZ+5JKYy1hLeEyiCcglI8CUTeWPDh897m7vydljAH740Y/LC1+zq3IhEF93yuoKWXA== X-Received: by 2002:a17:907:c409:b0:ace:5461:81dd with SMTP id a640c23a62f3a-ad515d7a850mr247977366b.3.1747320743060; Thu, 15 May 2025 07:52:23 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ad52d275d9fsm871366b.74.2025.05.15.07.52.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 07:52:22 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH v2 3/3] net: bcmgenet: expose more stats in ethtool Date: Thu, 15 May 2025 15:51:42 +0100 Message-Id: <20250515145142.1415-4-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250515145142.1415-1-zakkemble@gmail.com> References: <20250515145142.1415-1-zakkemble@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Expose more per-queue and overall stats in ethtool Signed-off-by: Zak Kemble --- .../net/ethernet/broadcom/genet/bcmgenet.c | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index d0c6b5d4c..5f227bf2a 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1029,6 +1029,10 @@ struct bcmgenet_stats { tx_rings[num].stats64, packets), \ STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_bytes", \ tx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_errors", \ + tx_rings[num].stats64, errors), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_dropped", \ + tx_rings[num].stats64, dropped), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_bytes", \ rx_rings[num].stats64, bytes), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_packets", \ @@ -1036,7 +1040,23 @@ struct bcmgenet_stats { STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_errors", \ rx_rings[num].stats64, errors), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_dropped", \ - rx_rings[num].stats64, dropped) + rx_rings[num].stats64, dropped), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_multicast", \ + rx_rings[num].stats64, multicast), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_missed", \ + rx_rings[num].stats64, missed), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_length_errors", \ + rx_rings[num].stats64, length_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_over_errors", \ + rx_rings[num].stats64, over_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_crc_errors", \ + rx_rings[num].stats64, crc_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_frame_errors", \ + rx_rings[num].stats64, frame_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_fragmented_errors", \ + rx_rings[num].stats64, fragmented_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_broadcast", \ + rx_rings[num].stats64, broadcast) =20 /* There is a 0xC gap between the end of RX and beginning of TX stats and = then * between the end of TX stats and the beginning of the RX RUNT @@ -1057,6 +1077,11 @@ static const struct bcmgenet_stats bcmgenet_gstrings= _stats[] =3D { STAT_RTNL(rx_dropped), STAT_RTNL(tx_dropped), STAT_RTNL(multicast), + STAT_RTNL(rx_missed_errors), + STAT_RTNL(rx_length_errors), + STAT_RTNL(rx_over_errors), + STAT_RTNL(rx_crc_errors), + STAT_RTNL(rx_frame_errors), /* UniMAC RSV counters */ STAT_GENET_MIB_RX("rx_64_octets", mib.rx.pkt_cnt.cnt_64), STAT_GENET_MIB_RX("rx_65_127_oct", mib.rx.pkt_cnt.cnt_127), @@ -2412,6 +2437,8 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, u64_stats_add(&stats->bytes, len); if (dma_flag & DMA_RX_MULT) u64_stats_inc(&stats->multicast); + else if (dma_flag & DMA_RX_BRDCAST) + u64_stats_inc(&stats->broadcast); u64_stats_update_end(&stats->syncp); =20 /* Notify kernel */ --=20 2.39.5