diff options
author | David S. Miller <davem@davemloft.net> | 2014-01-02 19:50:52 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-15 15:28:50 -0800 |
commit | 50ba56ca77a62c3bc36ba9bde7bffecc63c30477 (patch) | |
tree | 65145b4dfd5494de20319b98ba87aaa2a23e3c5c | |
parent | e7c28ed53545ee8972baf31c89a4e801be228e99 (diff) | |
download | linux-stable-50ba56ca77a62c3bc36ba9bde7bffecc63c30477.tar.gz linux-stable-50ba56ca77a62c3bc36ba9bde7bffecc63c30477.tar.bz2 linux-stable-50ba56ca77a62c3bc36ba9bde7bffecc63c30477.zip |
netpoll: Fix missing TXQ unlock and and OOPS.
[ Upstream commit aca5f58f9ba803ec8c2e6bcf890db17589e8dfcc ]
The VLAN tag handling code in netpoll_send_skb_on_dev() has two problems.
1) It exits without unlocking the TXQ.
2) It then tries to queue a NULL skb to npinfo->txq.
Reported-by: Ahmed Tamrawi <atamrawi@iastate.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | net/core/netpoll.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index b04f73847eda..27f33f25cda8 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -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) |