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>
This commit is contained in:
parent
ed0483fa06
commit
89cee917de
|
@ -845,7 +845,9 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
prepare_to_wait(sk_sleep(&q->sk), &wait, TASK_INTERRUPTIBLE);
|
if (!noblock)
|
||||||
|
prepare_to_wait(sk_sleep(&q->sk), &wait,
|
||||||
|
TASK_INTERRUPTIBLE);
|
||||||
|
|
||||||
/* Read frames from the queue */
|
/* Read frames from the queue */
|
||||||
skb = skb_dequeue(&q->sk.sk_receive_queue);
|
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,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
finish_wait(sk_sleep(&q->sk), &wait);
|
if (!noblock)
|
||||||
|
finish_wait(sk_sleep(&q->sk), &wait);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue