[PATCH v4 5/5] can: do not increase tx_bytes statistics for RTR frames

Marc Kleine-Budde mkl at pengutronix.de
Mon Dec 6 06:19:40 PST 2021


On 03.12.2021 22:18:08, Vincent Mailhol wrote:
> The actual payload length of the CAN Remote Transmission Request (RTR)
> frames is always 0, i.e. nothing is transmitted on the wire. However,
> those RTR frames still use the DLC to indicate the length of the
> requested frame.
> 
> As such, net_device_stats:tx_bytes should not be increased when
> sending RTR frames.
> 
> The function can_get_echo_skb() already returns the correct length,
> even for RTR frames (c.f. [1]). However, for historical reasons, the
> drivers do not use can_get_echo_skb()'s return value and instead, most
> of them store a temporary length (or dlc) in some local structure or
> array. Using the return value of can_get_echo_skb() solves the
> issue. After doing this, such length/dlc fields become unused and so
> this patch does the adequate cleaning when needed.
> 
> This patch fixes all the CAN drivers.
> 
> Finally, can_get_echo_skb() is decorated with the __must_check
> attribute in order to force future drivers to correctly use its return
> value (else the compiler would emit a warning).
> 
> [1] commit ed3320cec279 ("can: dev: __can_get_echo_skb():
> fix real payload length return value for RTR frames")
> 
> CC: Nicolas Ferre <nicolas.ferre at microchip.com>
> CC: Alexandre Belloni <alexandre.belloni at bootlin.com>
> CC: Ludovic Desroches <ludovic.desroches at microchip.com>
> CC: Maxime Ripard <mripard at kernel.org>
> CC: Chen-Yu Tsai <wens at csie.org>
> CC: Jernej Skrabec <jernej.skrabec at gmail.com>
> CC: Yasushi SHOJI <yashi at spacecubics.com>
> CC: Oliver Hartkopp <socketcan at hartkopp.net>
> CC: Stephane Grosjean <s.grosjean at peak-system.com>
> Tested-by: Jimmy Assarsson <extja at kvaser.com>
> Signed-off-by: Vincent Mailhol <mailhol.vincent at wanadoo.fr>
> ---
>  drivers/net/can/at91_can.c                    |  8 ++--
>  drivers/net/can/c_can/c_can.h                 |  1 -
>  drivers/net/can/c_can/c_can_main.c            |  7 +---
>  drivers/net/can/cc770/cc770.c                 |  8 +---
>  drivers/net/can/janz-ican3.c                  |  3 +-
>  drivers/net/can/mscan/mscan.c                 |  4 +-
>  drivers/net/can/pch_can.c                     |  9 ++--
>  drivers/net/can/peak_canfd/peak_canfd.c       |  3 +-
>  drivers/net/can/rcar/rcar_can.c               | 11 +++--
>  drivers/net/can/rcar/rcar_canfd.c             |  6 +--
>  drivers/net/can/sja1000/sja1000.c             |  4 +-
>  drivers/net/can/slcan.c                       |  3 +-
>  drivers/net/can/softing/softing_main.c        |  8 ++--
>  drivers/net/can/spi/hi311x.c                  | 24 +++++------
>  drivers/net/can/spi/mcp251x.c                 | 25 +++++------
>  drivers/net/can/sun4i_can.c                   |  5 +--
>  drivers/net/can/usb/ems_usb.c                 |  7 +---
>  drivers/net/can/usb/esd_usb2.c                |  6 +--
>  drivers/net/can/usb/gs_usb.c                  |  7 ++--
>  drivers/net/can/usb/kvaser_usb/kvaser_usb.h   |  5 +--
>  .../net/can/usb/kvaser_usb/kvaser_usb_core.c  |  2 +-
>  .../net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 42 +++++++++----------
>  .../net/can/usb/kvaser_usb/kvaser_usb_leaf.c  | 13 +++---
>  drivers/net/can/usb/mcba_usb.c                | 12 ++----
>  drivers/net/can/usb/peak_usb/pcan_usb_core.c  | 20 ++++-----
>  drivers/net/can/usb/peak_usb/pcan_usb_core.h  |  1 -
>  drivers/net/can/usb/ucan.c                    | 10 ++---
>  drivers/net/can/usb/usb_8dev.c                |  6 +--
>  drivers/net/can/vcan.c                        |  7 ++--
>  drivers/net/can/vxcan.c                       |  2 +-
>  include/linux/can/skb.h                       |  5 ++-
>  31 files changed, 114 insertions(+), 160 deletions(-)
> 
> diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
> index 97f1d08b4133..b37d9b4f508e 100644
> --- a/drivers/net/can/at91_can.c
> +++ b/drivers/net/can/at91_can.c
> @@ -448,7 +448,6 @@ static void at91_chip_stop(struct net_device *dev, enum can_state state)
>  static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  {
>  	struct at91_priv *priv = netdev_priv(dev);
> -	struct net_device_stats *stats = &dev->stats;
>  	struct can_frame *cf = (struct can_frame *)skb->data;
>  	unsigned int mb, prio;
>  	u32 reg_mid, reg_mcr;
> @@ -480,8 +479,6 @@ static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  	/* This triggers transmission */
>  	at91_write(priv, AT91_MCR(mb), reg_mcr);
>  
> -	stats->tx_bytes += cf->len;
> -
>  	/* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */
>  	can_put_echo_skb(skb, dev, mb - get_mb_tx_first(priv), 0);
>  
> @@ -852,7 +849,10 @@ static void at91_irq_tx(struct net_device *dev, u32 reg_sr)
>  		if (likely(reg_msr & AT91_MSR_MRDY &&
>  			   ~reg_msr & AT91_MSR_MABT)) {
>  			/* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */
> -			can_get_echo_skb(dev, mb - get_mb_tx_first(priv), NULL);
> +			dev->stats.tx_bytes =
                                            += ?

Marc

-- 
Pengutronix e.K.                 | Marc Kleine-Budde           |
Embedded Linux                   | https://www.pengutronix.de  |
Vertretung West/Dortmund         | Phone: +49-231-2826-924     |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-5555 |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20211206/998f06b0/attachment.sig>


More information about the linux-arm-kernel mailing list