From: Jason Wang Date: Mon, 17 Jan 2011 08:11:17 +0000 (+0800) Subject: vhost: lock receive queue, not the socket X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=783e3988544b94ff3918666b9f36866ac547fba1;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git vhost: lock receive queue, not the socket vhost takes a sock lock to try and prevent the skb from being pulled from the receive queue after skb_peek. However this is not the right lock to use for that, sk_receive_queue.lock is. Fix that up. Signed-off-by: Michael S. Tsirkin --- diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 0329c411bbf1..57203014c457 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -213,12 +213,13 @@ static int peek_head_len(struct sock *sk) { struct sk_buff *head; int len = 0; + unsigned long flags; - lock_sock(sk); + spin_lock_irqsave(&sk->sk_receive_queue.lock, flags); head = skb_peek(&sk->sk_receive_queue); - if (head) + if (likely(head)) len = head->len; - release_sock(sk); + spin_unlock_irqrestore(&sk->sk_receive_queue.lock, flags); return len; }