2023-06-02 09:56:07

by Wei Fang

[permalink] [raw]
Subject: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes

From: Wei Fang <[email protected]>

The rx_bytes of struct net_device_stats should count the length of
ethernet frames excluding the FCS. However, there are two problems
with the rx_bytes statistics of the current enetc driver. one is
that the length of VLAN header is not counted if the VLAN extraction
feature is enabled. The other is that the length of L2 header is not
counted, because eth_type_trans() is invoked before updating rx_bytes
which will subtract the length of L2 header from skb->len.
BTW, the rx_bytes statistics of XDP path also have similar problem,
I will fix it in another patch.

Fixes: a800abd3ecb9 ("net: enetc: move skb creation into enetc_build_skb")
Signed-off-by: Wei Fang <[email protected]>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 3c4fa26f0f9b..d6c0f3f46c2a 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1229,7 +1229,13 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
if (!skb)
break;

- rx_byte_cnt += skb->len;
+ /* When set, the outer VLAN header is extracted and reported
+ * in the receive buffer descriptor. So rx_byte_cnt should
+ * add the length of the extracted VLAN header.
+ */
+ if (bd_status & ENETC_RXBD_FLAG_VLAN)
+ rx_byte_cnt += VLAN_HLEN;
+ rx_byte_cnt += skb->len + ETH_HLEN;
rx_frm_cnt++;

napi_gro_receive(napi, skb);
--
2.25.1



2023-06-02 10:52:18

by Vladimir Oltean

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes

Hi Wei,

On Fri, Jun 02, 2023 at 05:46:58PM +0800, [email protected] wrote:
> From: Wei Fang <[email protected]>
>
> The rx_bytes of struct net_device_stats should count the length of
> ethernet frames excluding the FCS. However, there are two problems
> with the rx_bytes statistics of the current enetc driver. one is
> that the length of VLAN header is not counted if the VLAN extraction
> feature is enabled. The other is that the length of L2 header is not
> counted, because eth_type_trans() is invoked before updating rx_bytes
> which will subtract the length of L2 header from skb->len.

Thanks for noticing the issue and for sending a patch.

> BTW, the rx_bytes statistics of XDP path also have similar problem,
> I will fix it in another patch.
>
> Fixes: a800abd3ecb9 ("net: enetc: move skb creation into enetc_build_skb")
> Signed-off-by: Wei Fang <[email protected]>
> ---
> drivers/net/ethernet/freescale/enetc/enetc.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
> index 3c4fa26f0f9b..d6c0f3f46c2a 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc.c
> @@ -1229,7 +1229,13 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
> if (!skb)
> break;
>
> - rx_byte_cnt += skb->len;
> + /* When set, the outer VLAN header is extracted and reported
> + * in the receive buffer descriptor. So rx_byte_cnt should
> + * add the length of the extracted VLAN header.
> + */
> + if (bd_status & ENETC_RXBD_FLAG_VLAN)
> + rx_byte_cnt += VLAN_HLEN;
> + rx_byte_cnt += skb->len + ETH_HLEN;

Hmm, to avoid the conditional, have you considered adding an "int *rx_byte_cnt"
argument to enetc_build_skb()? It can be updated with "(*rx_byte_cnt) += size"
from all places where we already have "(*cleaned_cnt)++".

> rx_frm_cnt++;
>
> napi_gro_receive(napi, skb);
> --
> 2.25.1
>

2023-06-02 10:57:26

by Vladimir Oltean

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes

On Fri, Jun 02, 2023 at 01:27:10PM +0300, Vladimir Oltean wrote:
> Hmm, to avoid the conditional, have you considered adding an "int *rx_byte_cnt"
> argument to enetc_build_skb()? It can be updated with "(*rx_byte_cnt) += size"
> from all places where we already have "(*cleaned_cnt)++".

Ah, don't mind me. We can't avoid the conditional, since the VLAN header
is offloaded as you said. It's not in the buffer.

2023-06-02 11:03:58

by Vladimir Oltean

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes

On Fri, Jun 02, 2023 at 05:46:58PM +0800, [email protected] wrote:
> From: Wei Fang <[email protected]>
>
> The rx_bytes of struct net_device_stats should count the length of
> ethernet frames excluding the FCS. However, there are two problems
> with the rx_bytes statistics of the current enetc driver. one is
> that the length of VLAN header is not counted if the VLAN extraction
> feature is enabled. The other is that the length of L2 header is not
> counted, because eth_type_trans() is invoked before updating rx_bytes
> which will subtract the length of L2 header from skb->len.
> BTW, the rx_bytes statistics of XDP path also have similar problem,
> I will fix it in another patch.
>
> Fixes: a800abd3ecb9 ("net: enetc: move skb creation into enetc_build_skb")
> Signed-off-by: Wei Fang <[email protected]>
> ---

Reviewed-by: Vladimir Oltean <[email protected]>

By the way, you mangled Jakub's email ([email protected]) - I've fixed it up.

2023-06-02 11:23:50

by Wei Fang

[permalink] [raw]
Subject: RE: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes


> -----Original Message-----
> From: Vladimir Oltean <[email protected]>
> Sent: 2023??6??2?? 18:32
> To: Wei Fang <[email protected]>
> Cc: Claudiu Manoil <[email protected]>; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]
> Subject: Re: [PATCH net 1/2] net: enetc: correct the statistics of rx bytes
>
> On Fri, Jun 02, 2023 at 05:46:58PM +0800, [email protected] wrote:
> > From: Wei Fang <[email protected]>
> >
> > The rx_bytes of struct net_device_stats should count the length of
> > ethernet frames excluding the FCS. However, there are two problems
> > with the rx_bytes statistics of the current enetc driver. one is that
> > the length of VLAN header is not counted if the VLAN extraction
> > feature is enabled. The other is that the length of L2 header is not
> > counted, because eth_type_trans() is invoked before updating rx_bytes
> > which will subtract the length of L2 header from skb->len.
> > BTW, the rx_bytes statistics of XDP path also have similar problem, I
> > will fix it in another patch.
> >
> > Fixes: a800abd3ecb9 ("net: enetc: move skb creation into
> > enetc_build_skb")
> > Signed-off-by: Wei Fang <[email protected]>
> > ---
>
> Reviewed-by: Vladimir Oltean <[email protected]>
>
> By the way, you mangled Jakub's email ([email protected]) - I've fixed it up.

Yes, I realized this after sending the email. Thank you so much!