On Mon, 2014-03-24 at 23:04 -0700, Eric W. Biederman wrote: > From: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> > > Replace dev_kfree_skb with dev_consume_skb_any in uml_net_start_xmit > as it can be called in hard irq and other contexts. > > dev_consume_skb_any is used as uml_net_start_xmit typically > consumes (not drops) packets. Well, this is not exactly true. This driver certainly can drop packets. Here is an untested/not even compiled patch. diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index 39f186252e02..8d1df7ed759e 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c @@ -212,6 +212,7 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) struct uml_net_private *lp = netdev_priv(dev); unsigned long flags; int len; + enum skb_free_reason reason = SKB_REASON_CONSUMED; netif_stop_queue(dev); @@ -228,19 +229,18 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) /* this is normally done in the interrupt when tx finishes */ netif_wake_queue(dev); - } - else if (len == 0) { - netif_start_queue(dev); - dev->stats.tx_dropped++; - } - else { + } else { + reason = SKB_REASON_DROPPED; netif_start_queue(dev); - printk(KERN_ERR "uml_net_start_xmit: failed(%d)\n", len); + if (len == 0) + dev->stats.tx_dropped++; + else + pr_err("uml_net_start_xmit: failed(%d)\n", len); } spin_unlock_irqrestore(&lp->lock, flags); - dev_kfree_skb(skb); + __dev_kfree_skb_any(skb, reason); return NETDEV_TX_OK; } -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html