net: dsa: factor skb freeing on xmit
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>
Thu, 1 Jun 2017 20:07:15 +0000 (16:07 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 1 Jun 2017 21:34:56 +0000 (17:34 -0400)
As of a86d8becc3f0 ("net: dsa: Factor bottom tag receive functions"),
the rcv caller frees the original SKB in case or error.

Be symmetric with that and make the xmit caller do the same.

At the same time, fix the checkpatch NULL comparison check:

        CHECK: Comparison to NULL could be written "!nskb"
    #208: FILE: net/dsa/tag_trailer.c:35:
    + if (nskb == NULL)

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/slave.c
net/dsa/tag_brcm.c
net/dsa/tag_dsa.c
net/dsa/tag_edsa.c
net/dsa/tag_ksz.c
net/dsa/tag_lan9303.c
net/dsa/tag_mtk.c
net/dsa/tag_qca.c
net/dsa/tag_trailer.c

index 0442b6bf52fa1cb79254c3850a06fd5635d66bba..1cfdb31a2f442121d2cbff3243780e2d899da0ce 100644 (file)
@@ -357,10 +357,14 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
        dev->stats.tx_packets++;
        dev->stats.tx_bytes += skb->len;
 
-       /* Transmit function may have to reallocate the original SKB */
+       /* Transmit function may have to reallocate the original SKB,
+        * in which case it must have freed it. Only free it here on error.
+        */
        nskb = p->xmit(skb, dev);
-       if (!nskb)
+       if (!nskb) {
+               kfree_skb(skb);
                return NETDEV_TX_OK;
+       }
 
        /* SKB for netpoll still need to be mangled with the protocol-specific
         * tag to be successfully transmitted
index 635ecb6781e4567145e526e8c68080897ed1aaf0..c03860907f281dfc3e543fcca82a14dff15d455b 100644 (file)
@@ -65,7 +65,7 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev
        u8 *brcm_tag;
 
        if (skb_cow_head(skb, BRCM_TAG_LEN) < 0)
-               goto out_free;
+               return NULL;
 
        skb_push(skb, BRCM_TAG_LEN);
 
@@ -86,10 +86,6 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev
        brcm_tag[3] = (1 << p->dp->index) & BRCM_IG_DSTMAP1_MASK;
 
        return skb;
-
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
index 089c99c8ed51c689fe28d413d74c3f6b1f8a262d..12867a4b458f17259d8fb89781b56b92a494d09d 100644 (file)
@@ -28,7 +28,7 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
         */
        if (skb->protocol == htons(ETH_P_8021Q)) {
                if (skb_cow_head(skb, 0) < 0)
-                       goto out_free;
+                       return NULL;
 
                /*
                 * Construct tagged FROM_CPU DSA tag from 802.1q tag.
@@ -46,7 +46,7 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
                }
        } else {
                if (skb_cow_head(skb, DSA_HLEN) < 0)
-                       goto out_free;
+                       return NULL;
                skb_push(skb, DSA_HLEN);
 
                memmove(skb->data, skb->data + DSA_HLEN, 2 * ETH_ALEN);
@@ -62,10 +62,6 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        return skb;
-
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev,
index a7eed1d43d80db7315c769d419d06ef01136afff..67a9d26f9075072c906b9a15bf9747d132eeafb4 100644 (file)
@@ -30,7 +30,7 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
         */
        if (skb->protocol == htons(ETH_P_8021Q)) {
                if (skb_cow_head(skb, DSA_HLEN) < 0)
-                       goto out_free;
+                       return NULL;
                skb_push(skb, DSA_HLEN);
 
                memmove(skb->data, skb->data + DSA_HLEN, 2 * ETH_ALEN);
@@ -55,7 +55,7 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
                }
        } else {
                if (skb_cow_head(skb, EDSA_HLEN) < 0)
-                       goto out_free;
+                       return NULL;
                skb_push(skb, EDSA_HLEN);
 
                memmove(skb->data, skb->data + EDSA_HLEN, 2 * ETH_ALEN);
@@ -75,10 +75,6 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        return skb;
-
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev,
index dfcd2fff5b137cf8459fcc8a766dfa2f17ce8c2a..b94a334a1d02080a6f92fb2434e3813cc1443d9b 100644 (file)
@@ -46,10 +46,8 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev)
        } else {
                nskb = alloc_skb(NET_IP_ALIGN + skb->len +
                                 padlen + KSZ_INGRESS_TAG_LEN, GFP_ATOMIC);
-               if (!nskb) {
-                       kfree_skb(skb);
+               if (!nskb)
                        return NULL;
-               }
                skb_reserve(nskb, NET_IP_ALIGN);
 
                skb_reset_mac_header(nskb);
index afd59330b5f1710f2fb0e82a32c185c9a208f04c..247774d149f9f90e1170d3cd65d6f2fdb473b28d 100644 (file)
@@ -52,7 +52,7 @@ static struct sk_buff *lan9303_xmit(struct sk_buff *skb, struct net_device *dev)
        if (skb_cow_head(skb, LAN9303_TAG_LEN) < 0) {
                dev_dbg(&dev->dev,
                        "Cannot make room for the special tag. Dropping packet\n");
-               goto out_free;
+               return NULL;
        }
 
        /* provide 'LAN9303_TAG_LEN' bytes additional space */
@@ -66,9 +66,6 @@ static struct sk_buff *lan9303_xmit(struct sk_buff *skb, struct net_device *dev)
        lan9303_tag[1] = htons(p->dp->index | BIT(4));
 
        return skb;
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
index 4b4aaf1574aa882de469c9ab5d3a24d810e0862e..2f32b7ea3365ce87f61e6a5002fbe45a4228e85f 100644 (file)
@@ -27,7 +27,7 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
        u8 *mtk_tag;
 
        if (skb_cow_head(skb, MTK_HDR_LEN) < 0)
-               goto out_free;
+               return NULL;
 
        skb_push(skb, MTK_HDR_LEN);
 
@@ -41,10 +41,6 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
        mtk_tag[3] = 0;
 
        return skb;
-
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
index 44f545d2761aae042239af092399308ba1c188d7..4f43cf0b4eff13d4a2dd76980d447572a6459778 100644 (file)
@@ -45,7 +45,7 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev)
        dev->stats.tx_bytes += skb->len;
 
        if (skb_cow_head(skb, 0) < 0)
-               goto out_free;
+               return NULL;
 
        skb_push(skb, QCA_HDR_LEN);
 
@@ -60,10 +60,6 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev)
        *phdr = htons(hdr);
 
        return skb;
-
-out_free:
-       kfree_skb(skb);
-       return NULL;
 }
 
 static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
index ec729c0ef390c30468bf80e6a77e47eacbf8c0ae..b4f6db0944093ce15640d09e2f6b8508dbecebbc 100644 (file)
@@ -32,10 +32,8 @@ static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev)
                padlen = 60 - skb->len;
 
        nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC);
-       if (nskb == NULL) {
-               kfree_skb(skb);
+       if (!nskb)
                return NULL;
-       }
        skb_reserve(nskb, NET_IP_ALIGN);
 
        skb_reset_mac_header(nskb);