]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: move frame_len to CAN skb extensions
authorOliver Hartkopp <socketcan@hartkopp.net>
Sun, 1 Feb 2026 14:33:19 +0000 (15:33 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 5 Feb 2026 10:58:40 +0000 (11:58 +0100)
The can_skb_priv::frame_len variable is used to cache a previous
calculated CAN frame length to be passed to BQL queueing disciplines.

Move the can_skb_priv::frame_len content to can_skb_ext::can_framelen.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://patch.msgid.link/20260201-can_skb_ext-v8-4-3635d790fe8b@hartkopp.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/can/dev/skb.c

index 470255fe7367b6ff038e45255abc3ea9eed88704..408ee49abce145f49c7837ff30809bc3e42f8ab5 100644 (file)
@@ -49,6 +49,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
                     unsigned int idx, unsigned int frame_len)
 {
        struct can_priv *priv = netdev_priv(dev);
+       struct can_skb_ext *csx;
 
        if (idx >= priv->echo_skb_max) {
                netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n",
@@ -75,7 +76,9 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
                skb->dev = dev;
 
                /* save frame_len to reuse it when transmission is completed */
-               can_skb_prv(skb)->frame_len = frame_len;
+               csx = can_skb_ext_find(skb);
+               if (csx)
+                       csx->can_framelen = frame_len;
 
                if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
                        skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
@@ -112,7 +115,7 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx,
                 * length is supported on both CAN and CANFD frames.
                 */
                struct sk_buff *skb = priv->echo_skb[idx];
-               struct can_skb_priv *can_skb_priv = can_skb_prv(skb);
+               struct can_skb_ext *csx;
 
                if (skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)
                        skb_tstamp_tx(skb, skb_hwtstamps(skb));
@@ -120,8 +123,13 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx,
                /* get the real payload length for netdev statistics */
                *len_ptr = can_skb_get_data_len(skb);
 
-               if (frame_len_ptr)
-                       *frame_len_ptr = can_skb_priv->frame_len;
+               if (frame_len_ptr) {
+                       csx = can_skb_ext_find(skb);
+                       if (csx)
+                               *frame_len_ptr = csx->can_framelen;
+                       else
+                               *frame_len_ptr = 0;
+               }
 
                priv->echo_skb[idx] = NULL;
 
@@ -181,10 +189,15 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx,
 
        if (priv->echo_skb[idx]) {
                struct sk_buff *skb = priv->echo_skb[idx];
-               struct can_skb_priv *can_skb_priv = can_skb_prv(skb);
-
-               if (frame_len_ptr)
-                       *frame_len_ptr = can_skb_priv->frame_len;
+               struct can_skb_ext *csx;
+
+               if (frame_len_ptr) {
+                       csx = can_skb_ext_find(skb);
+                       if (csx)
+                               *frame_len_ptr = csx->can_framelen;
+                       else
+                               *frame_len_ptr = 0;
+               }
 
                dev_kfree_skb_any(skb);
                priv->echo_skb[idx] = NULL;