virtio-net: fix network stall under load
Fix a race condition where qemu finds that there are not enough virtio ring buffers available and the guest make more buffers available before qemu can enable notifications. Signed-off-by: Tom Lendacky <toml@us.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
2c0d4b36e7
commit
06b1297017
@ -379,7 +379,15 @@ static int virtio_net_has_buffers(VirtIONet *n, int bufsize)
|
|||||||
(n->mergeable_rx_bufs &&
|
(n->mergeable_rx_bufs &&
|
||||||
!virtqueue_avail_bytes(n->rx_vq, bufsize, 0))) {
|
!virtqueue_avail_bytes(n->rx_vq, bufsize, 0))) {
|
||||||
virtio_queue_set_notification(n->rx_vq, 1);
|
virtio_queue_set_notification(n->rx_vq, 1);
|
||||||
return 0;
|
|
||||||
|
/* To avoid a race condition where the guest has made some buffers
|
||||||
|
* available after the above check but before notification was
|
||||||
|
* enabled, check for available buffers again.
|
||||||
|
*/
|
||||||
|
if (virtio_queue_empty(n->rx_vq) ||
|
||||||
|
(n->mergeable_rx_bufs &&
|
||||||
|
!virtqueue_avail_bytes(n->rx_vq, bufsize, 0)))
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_queue_set_notification(n->rx_vq, 0);
|
virtio_queue_set_notification(n->rx_vq, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user