xgmac: Call dev_kfree/consume_skb_any instead of dev_kfree_skb.
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 15 Mar 2014 23:10:54 +0000 (16:10 -0700)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 25 Mar 2014 04:18:56 +0000 (21:18 -0700)
Replace dev_kfree_skb with dev_consume_skb_any in xgmac_tx_complete
that can be called in hard irq and other contexts.

Replace dev_kfree_skb with dev_kfree_skb_any in xgmac_xmit that can
be called in hard irq and other contexts.

dev_consume_skb_any is used in xgamc_tx_complete as skbs that reach
there have been successfully transmitted, dev_kfree_skby_any is used
in xgmac_xmit as skbs that are freed there are being dropped.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
drivers/net/ethernet/calxeda/xgmac.c

index d2a183c..521dfea 100644 (file)
@@ -897,7 +897,7 @@ static void xgmac_tx_complete(struct xgmac_priv *priv)
                /* Check tx error on the last segment */
                if (desc_get_tx_ls(p)) {
                        desc_get_tx_status(priv, p);
-                       dev_kfree_skb(skb);
+                       dev_consume_skb_any(skb);
                }
 
                priv->tx_skbuff[entry] = NULL;
@@ -1105,7 +1105,7 @@ static netdev_tx_t xgmac_xmit(struct sk_buff *skb, struct net_device *dev)
        len = skb_headlen(skb);
        paddr = dma_map_single(priv->device, skb->data, len, DMA_TO_DEVICE);
        if (dma_mapping_error(priv->device, paddr)) {
-               dev_kfree_skb(skb);
+               dev_kfree_skb_any(skb);
                return NETDEV_TX_OK;
        }
        priv->tx_skbuff[entry] = skb;
@@ -1169,7 +1169,7 @@ dma_err:
        desc = first;
        dma_unmap_single(priv->device, desc_get_buf_addr(desc),
                         desc_get_buf_len(desc), DMA_TO_DEVICE);
-       dev_kfree_skb(skb);
+       dev_kfree_skb_any(skb);
        return NETDEV_TX_OK;
 }