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 0442b6b..1cfdb31 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 635ecb6..c038609 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 089c99c..12867a4 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 a7eed1d..67a9d26 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 dfcd2ff..b94a334 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 afd5933..247774d 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 4b4aaf1..2f32b7e 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 44f545d..4f43cf0 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 ec729c0..b4f6db0 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);