mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
[NET]: Avoid allocating skb in skb_pad
First of all it is unnecessary to allocate a new skb in skb_pad since the existing one is not shared. More importantly, our hard_start_xmit interface does not allow a new skb to be allocated since that breaks requeueing. This patch uses pskb_expand_head to expand the existing skb and linearize it if needed. Actually, someone should sift through every instance of skb_pad on a non-linear skb as they do not fit the reasons why this was originally created. Incidentally, this fixes a minor bug when the skb is cloned (tcpdump, TCP, etc.). As it is skb_pad will simply write over a cloned skb. Because of the position of the write it is unlikely to cause problems but still it's best if we don't do it. Signed-off-by: Herbert Xu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
5fa21d821f
commit
5b057c6b1a
36 changed files with 74 additions and 103 deletions
|
|
@ -1031,8 +1031,7 @@ static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||
return 1;
|
||||
}
|
||||
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL) {
|
||||
if (skb_padto(skb, ETH_ZLEN)) {
|
||||
netif_wake_queue(dev);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1070,8 +1070,7 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
skb->len, (unsigned int)skb->data));
|
||||
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -573,8 +573,7 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
if (len < ETH_ZLEN) {
|
||||
len = ETH_ZLEN;
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -607,8 +607,7 @@ static int ariadne_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* FIXME: is the 79C960 new enough to do its own padding right ? */
|
||||
if (skb->len < ETH_ZLEN)
|
||||
{
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
len = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -700,8 +700,7 @@ ether1_sendpacket (struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -518,8 +518,7 @@ ether3_sendpacket(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
length = (length + 1) & ~1;
|
||||
if (length != skb->len) {
|
||||
skb = skb_padto(skb, length);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, length))
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -804,8 +804,7 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
|
|||
++len;
|
||||
|
||||
if (len > skb->len) {
|
||||
skb = skb_padto(skb, len);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, len))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2915,8 +2915,7 @@ static int cas_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
*/
|
||||
static int ring;
|
||||
|
||||
skb = skb_padto(skb, cp->min_frame_size);
|
||||
if (!skb)
|
||||
if (skb_padto(skb, cp->min_frame_size))
|
||||
return 0;
|
||||
|
||||
/* XXX: we need some higher-level QoS hooks to steer packets to
|
||||
|
|
|
|||
|
|
@ -885,8 +885,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
len = skblen;
|
||||
|
||||
if (len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
len = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -938,11 +938,8 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (skb->len < 1)
|
||||
goto out;
|
||||
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
goto out;
|
||||
}
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
goto out;
|
||||
|
||||
netif_stop_queue(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -1154,8 +1154,7 @@ static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||
printk(KERN_DEBUG "%s: entering eepro_send_packet routine.\n", dev->name);
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -677,8 +677,7 @@ static int eexp_xmit(struct sk_buff *buf, struct net_device *dev)
|
|||
#endif
|
||||
|
||||
if (buf->len < ETH_ZLEN) {
|
||||
buf = skb_padto(buf, ETH_ZLEN);
|
||||
if (buf == NULL)
|
||||
if (skb_padto(buf, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1027,11 +1027,8 @@ static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
u32 ctrl_word;
|
||||
unsigned long flags;
|
||||
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
return 0;
|
||||
}
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
|
||||
/* Caution: the write order is important here, set the field with the
|
||||
"ownership" bit last. */
|
||||
|
|
|
|||
|
|
@ -1064,8 +1064,7 @@ static int eth16i_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
unsigned long flags;
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1487,11 +1487,8 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev)
|
|||
if (skb->len <= 0)
|
||||
return 0;
|
||||
|
||||
if (skb->len < ETH_ZLEN && lp->chip == HP100_CHIPID_SHASTA) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
return 0;
|
||||
}
|
||||
if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
|
||||
/* Get Tx ring tail pointer */
|
||||
if (lp->txrtail->next == lp->txrhead) {
|
||||
|
|
|
|||
|
|
@ -968,8 +968,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* The old LANCE chips doesn't automatically pad buffers to min. size. */
|
||||
if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) {
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
goto out;
|
||||
lp->tx_ring[entry].length = -ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1083,8 +1083,7 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
skb->len, skb->data));
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -877,8 +877,7 @@ static int i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
|
|||
length = skb->len;
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1939,8 +1939,7 @@ again:
|
|||
|
||||
/* pad frames to at least ETH_ZLEN bytes */
|
||||
if (unlikely(skb->len < ETH_ZLEN)) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL) {
|
||||
if (skb_padto(skb, ETH_ZLEN)) {
|
||||
/* The packet is gone, so we must
|
||||
* return 0 */
|
||||
mgp->stats.tx_dropped += 1;
|
||||
|
|
|
|||
|
|
@ -831,8 +831,7 @@ static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
if (length < ETH_ZLEN)
|
||||
{
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1374,8 +1374,7 @@ do_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
*/
|
||||
if (pktlen < ETH_ZLEN)
|
||||
{
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
pktlen = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2222,8 +2222,7 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
len = skb->len;
|
||||
|
||||
if (unlikely(len < ETH_ZLEN)) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (!skb)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
goto err_update_stats;
|
||||
len = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -396,8 +396,7 @@ static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||
unsigned char *buf;
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1156,8 +1156,7 @@ static int sis190_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dma_addr_t mapping;
|
||||
|
||||
if (unlikely(skb->len < ETH_ZLEN)) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (!skb) {
|
||||
if (skb_padto(skb, ETH_ZLEN)) {
|
||||
tp->stats.tx_dropped++;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1525,7 +1525,7 @@ struct sk_buff *pMessage) /* pointer to send-message */
|
|||
** This is to resolve faulty padding by the HW with 0xaa bytes.
|
||||
*/
|
||||
if (BytesSend < C_LEN_ETHERNET_MINSIZE) {
|
||||
if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) {
|
||||
if (skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) {
|
||||
spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2310,8 +2310,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
|
|||
u64 map;
|
||||
unsigned long flags;
|
||||
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (!skb)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
if (!spin_trylock_irqsave(&skge->tx_lock, flags))
|
||||
|
|
|
|||
|
|
@ -523,8 +523,7 @@ static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * de
|
|||
length = skb->len;
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL) {
|
||||
if (skb_padto(skb, ETH_ZLEN)) {
|
||||
netif_wake_queue(dev);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -231,8 +231,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
length = skb->len;
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1349,8 +1349,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
#if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE)
|
||||
if (skb->ip_summed == CHECKSUM_HW) {
|
||||
skb = skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK))
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
#endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */
|
||||
|
|
|
|||
|
|
@ -1284,11 +1284,8 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
/* Calculate the next Tx descriptor entry. */
|
||||
entry = rp->cur_tx % TX_RING_SIZE;
|
||||
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
return 0;
|
||||
}
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
|
||||
rp->tx_skbuff[entry] = skb;
|
||||
|
||||
|
|
|
|||
|
|
@ -924,8 +924,7 @@ static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
if (length < ETH_ZLEN)
|
||||
{
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3194,11 +3194,8 @@ wavelan_packet_xmit(struct sk_buff * skb,
|
|||
* and we don't have the Ethernet specific requirement of beeing
|
||||
* able to detect collisions, therefore in theory we don't really
|
||||
* need to pad. Jean II */
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
return 0;
|
||||
}
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
|
||||
wv_packet_write(dev, skb->data, skb->len);
|
||||
|
||||
|
|
|
|||
|
|
@ -862,13 +862,11 @@ static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* Fix GX chipset errata. */
|
||||
if (cacheline_end > 24 || cacheline_end == 0) {
|
||||
len = skb->len + 32 - cacheline_end + 1;
|
||||
if (len != skb->len)
|
||||
skb = skb_padto(skb, len);
|
||||
}
|
||||
if (skb == NULL) {
|
||||
yp->tx_skbuff[entry] = NULL;
|
||||
netif_wake_queue(dev);
|
||||
return 0;
|
||||
if (skb_padto(skb, len)) {
|
||||
yp->tx_skbuff[entry] = NULL;
|
||||
netif_wake_queue(dev);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
yp->tx_skbuff[entry] = skb;
|
||||
|
|
|
|||
|
|
@ -544,8 +544,7 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||
printk(KERN_DEBUG "%s: ZNet_send_packet.\n", dev->name);
|
||||
|
||||
if (length < ETH_ZLEN) {
|
||||
skb = skb_padto(skb, ETH_ZLEN);
|
||||
if (skb == NULL)
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return 0;
|
||||
length = ETH_ZLEN;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue