diff options
author | Jason Wang <jasowang@redhat.com> | 2013-06-05 19:54:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-08 02:49:08 -0400 |
commit | 89cee917deb5bf0dc9da269a38622588d06cb6be (patch) | |
tree | ff7285962e65a9444d8debcb232406b939853570 /drivers/net/macvtap.c | |
parent | ed0483fa06e0efb86a82e382a00dbad02b62807c (diff) |
macvtap: do not add self to waitqueue if doing a nonblock read
There's no need to add self to waitqueue if doing a nonblock read. This could
help to avoid the spinlock contention.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r-- | drivers/net/macvtap.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 5e485e307424..8949631c080c 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -845,7 +845,9 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb, | |||
845 | ssize_t ret = 0; | 845 | ssize_t ret = 0; |
846 | 846 | ||
847 | while (len) { | 847 | while (len) { |
848 | prepare_to_wait(sk_sleep(&q->sk), &wait, TASK_INTERRUPTIBLE); | 848 | if (!noblock) |
849 | prepare_to_wait(sk_sleep(&q->sk), &wait, | ||
850 | TASK_INTERRUPTIBLE); | ||
849 | 851 | ||
850 | /* Read frames from the queue */ | 852 | /* Read frames from the queue */ |
851 | skb = skb_dequeue(&q->sk.sk_receive_queue); | 853 | skb = skb_dequeue(&q->sk.sk_receive_queue); |
@@ -867,7 +869,8 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb, | |||
867 | break; | 869 | break; |
868 | } | 870 | } |
869 | 871 | ||
870 | finish_wait(sk_sleep(&q->sk), &wait); | 872 | if (!noblock) |
873 | finish_wait(sk_sleep(&q->sk), &wait); | ||
871 | return ret; | 874 | return ret; |
872 | } | 875 | } |
873 | 876 | ||