Commit fe47d563 authored by Vivien Didelot's avatar Vivien Didelot Committed by David S. Miller

net: dsa: factor skb freeing on xmit

As of a86d8bec ("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: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 54709795
...@@ -357,10 +357,14 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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_packets++;
dev->stats.tx_bytes += skb->len; 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); nskb = p->xmit(skb, dev);
if (!nskb) if (!nskb) {
kfree_skb(skb);
return NETDEV_TX_OK; return NETDEV_TX_OK;
}
/* SKB for netpoll still need to be mangled with the protocol-specific /* SKB for netpoll still need to be mangled with the protocol-specific
* tag to be successfully transmitted * tag to be successfully transmitted
......
...@@ -65,7 +65,7 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -65,7 +65,7 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev
u8 *brcm_tag; u8 *brcm_tag;
if (skb_cow_head(skb, BRCM_TAG_LEN) < 0) if (skb_cow_head(skb, BRCM_TAG_LEN) < 0)
goto out_free; return NULL;
skb_push(skb, BRCM_TAG_LEN); 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 ...@@ -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; brcm_tag[3] = (1 << p->dp->index) & BRCM_IG_DSTMAP1_MASK;
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -28,7 +28,7 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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->protocol == htons(ETH_P_8021Q)) {
if (skb_cow_head(skb, 0) < 0) if (skb_cow_head(skb, 0) < 0)
goto out_free; return NULL;
/* /*
* Construct tagged FROM_CPU DSA tag from 802.1q tag. * 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) ...@@ -46,7 +46,7 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
} }
} else { } else {
if (skb_cow_head(skb, DSA_HLEN) < 0) if (skb_cow_head(skb, DSA_HLEN) < 0)
goto out_free; return NULL;
skb_push(skb, DSA_HLEN); skb_push(skb, DSA_HLEN);
memmove(skb->data, skb->data + DSA_HLEN, 2 * ETH_ALEN); 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) ...@@ -62,10 +62,6 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
} }
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -30,7 +30,7 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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->protocol == htons(ETH_P_8021Q)) {
if (skb_cow_head(skb, DSA_HLEN) < 0) if (skb_cow_head(skb, DSA_HLEN) < 0)
goto out_free; return NULL;
skb_push(skb, DSA_HLEN); skb_push(skb, DSA_HLEN);
memmove(skb->data, skb->data + DSA_HLEN, 2 * ETH_ALEN); 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) ...@@ -55,7 +55,7 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
} }
} else { } else {
if (skb_cow_head(skb, EDSA_HLEN) < 0) if (skb_cow_head(skb, EDSA_HLEN) < 0)
goto out_free; return NULL;
skb_push(skb, EDSA_HLEN); skb_push(skb, EDSA_HLEN);
memmove(skb->data, skb->data + EDSA_HLEN, 2 * ETH_ALEN); 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) ...@@ -75,10 +75,6 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
} }
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -46,10 +46,8 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -46,10 +46,8 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev)
} else { } else {
nskb = alloc_skb(NET_IP_ALIGN + skb->len + nskb = alloc_skb(NET_IP_ALIGN + skb->len +
padlen + KSZ_INGRESS_TAG_LEN, GFP_ATOMIC); padlen + KSZ_INGRESS_TAG_LEN, GFP_ATOMIC);
if (!nskb) { if (!nskb)
kfree_skb(skb);
return NULL; return NULL;
}
skb_reserve(nskb, NET_IP_ALIGN); skb_reserve(nskb, NET_IP_ALIGN);
skb_reset_mac_header(nskb); skb_reset_mac_header(nskb);
......
...@@ -52,7 +52,7 @@ static struct sk_buff *lan9303_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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) { if (skb_cow_head(skb, LAN9303_TAG_LEN) < 0) {
dev_dbg(&dev->dev, dev_dbg(&dev->dev,
"Cannot make room for the special tag. Dropping packet\n"); "Cannot make room for the special tag. Dropping packet\n");
goto out_free; return NULL;
} }
/* provide 'LAN9303_TAG_LEN' bytes additional space */ /* 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) ...@@ -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)); lan9303_tag[1] = htons(p->dp->index | BIT(4));
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -27,7 +27,7 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb, ...@@ -27,7 +27,7 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
u8 *mtk_tag; u8 *mtk_tag;
if (skb_cow_head(skb, MTK_HDR_LEN) < 0) if (skb_cow_head(skb, MTK_HDR_LEN) < 0)
goto out_free; return NULL;
skb_push(skb, MTK_HDR_LEN); skb_push(skb, MTK_HDR_LEN);
...@@ -41,10 +41,6 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb, ...@@ -41,10 +41,6 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
mtk_tag[3] = 0; mtk_tag[3] = 0;
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -45,7 +45,7 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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; dev->stats.tx_bytes += skb->len;
if (skb_cow_head(skb, 0) < 0) if (skb_cow_head(skb, 0) < 0)
goto out_free; return NULL;
skb_push(skb, QCA_HDR_LEN); 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) ...@@ -60,10 +60,6 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev)
*phdr = htons(hdr); *phdr = htons(hdr);
return skb; return skb;
out_free:
kfree_skb(skb);
return NULL;
} }
static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev, static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
......
...@@ -32,10 +32,8 @@ static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -32,10 +32,8 @@ static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev)
padlen = 60 - skb->len; padlen = 60 - skb->len;
nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC); nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC);
if (nskb == NULL) { if (!nskb)
kfree_skb(skb);
return NULL; return NULL;
}
skb_reserve(nskb, NET_IP_ALIGN); skb_reserve(nskb, NET_IP_ALIGN);
skb_reset_mac_header(nskb); skb_reset_mac_header(nskb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment