diff options
| author | Eric Dumazet <edumazet@google.com> | 2015-02-18 08:47:55 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-02-20 15:52:21 -0500 |
| commit | 997d5c3f4427f38562cbe207ce05bb25fdcb993b (patch) | |
| tree | f4ebf7541e6ef91e3deb54434c0c3c523af5bbd3 | |
| parent | 846cd66788b11105a62785078360c8854aa98310 (diff) | |
sock: sock_dequeue_err_skb() needs hard irq safety
Non NAPI drivers can call skb_tstamp_tx() and then sock_queue_err_skb()
from hard IRQ context.
Therefore, sock_dequeue_err_skb() needs to block hard irq or
corruptions or hangs can happen.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Fixes: 364a9e93243d1 ("sock: deduplicate errqueue dequeue")
Fixes: cb820f8e4b7f7 ("net: Provide a generic socket error queue delivery method for Tx time stamps.")
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/core/skbuff.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 88c613eab142..f80507823531 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3621,13 +3621,14 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) | |||
| 3621 | { | 3621 | { |
| 3622 | struct sk_buff_head *q = &sk->sk_error_queue; | 3622 | struct sk_buff_head *q = &sk->sk_error_queue; |
| 3623 | struct sk_buff *skb, *skb_next; | 3623 | struct sk_buff *skb, *skb_next; |
| 3624 | unsigned long flags; | ||
| 3624 | int err = 0; | 3625 | int err = 0; |
| 3625 | 3626 | ||
| 3626 | spin_lock_bh(&q->lock); | 3627 | spin_lock_irqsave(&q->lock, flags); |
| 3627 | skb = __skb_dequeue(q); | 3628 | skb = __skb_dequeue(q); |
| 3628 | if (skb && (skb_next = skb_peek(q))) | 3629 | if (skb && (skb_next = skb_peek(q))) |
| 3629 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; | 3630 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; |
| 3630 | spin_unlock_bh(&q->lock); | 3631 | spin_unlock_irqrestore(&q->lock, flags); |
| 3631 | 3632 | ||
| 3632 | sk->sk_err = err; | 3633 | sk->sk_err = err; |
| 3633 | if (err) | 3634 | if (err) |
