diff options
Diffstat (limited to 'net/core/netpoll.c')
| -rw-r--r-- | net/core/netpoll.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 8f971990677c..19fe9c717ced 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -375,7 +375,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,  	if (skb_queue_len(&npinfo->txq) == 0 && !netpoll_owner_active(dev)) {  		struct netdev_queue *txq; -		txq = netdev_pick_tx(dev, skb); +		txq = netdev_pick_tx(dev, skb, NULL);  		/* try until next clock tick */  		for (tries = jiffies_to_usecs(1)/USEC_PER_POLL; @@ -386,8 +386,14 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,  					    !vlan_hw_offload_capable(netif_skb_features(skb),  								     skb->vlan_proto)) {  						skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb)); -						if (unlikely(!skb)) -							break; +						if (unlikely(!skb)) { +							/* This is actually a packet drop, but we +							 * don't want the code at the end of this +							 * function to try and re-queue a NULL skb. +							 */ +							status = NETDEV_TX_OK; +							goto unlock_txq; +						}  						skb->vlan_tci = 0;  					} @@ -395,6 +401,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,  					if (status == NETDEV_TX_OK)  						txq_trans_update(txq);  				} +			unlock_txq:  				__netif_tx_unlock(txq);  				if (status == NETDEV_TX_OK)  | 
