[PATCH v4 5/5] can: do not increase tx_bytes statistics for RTR frames
Vincent MAILHOL
mailhol.vincent at wanadoo.fr
Tue Dec 7 04:12:02 PST 2021
On Mon. 6 Dec 2021 at 23:19, Marc Kleine-Budde <mkl at pengutronix.de> wrote:
> 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 =
> += ?
Absolutely. I will check that the other assignments are also correct
and send a v5.
Yours sincerely,
Vincent Mailhol
More information about the linux-arm-kernel
mailing list