iPXE - Open Source Boot Firmware

[virtio-net] Fix kick/wait logic
authorEduardo Habkost <ehabkost@redhat.com>
Wed, 8 Oct 2008 20:02:33 +0000 (17:02 -0300)
committerEduardo Habkost <ehabkost@redhat.com>
Wed, 8 Oct 2008 20:02:33 +0000 (17:02 -0300)
commit8742a7939f22e2d9359755453abf362b012b5ad3
tree7c6a16e093c7917cb34e66cad13462a7504ee067
parent4094d8dcacf09130cde7e941632c8deea3734190
[virtio-net] Fix kick/wait logic

The virtnet_transmit() logic for waiting the packet to be transmitted is
reversed: we can't wait the packet to be transmitted if we didn't kick()
the ring yet. The vring_more_used() while loop logic is reversed also,
that explains why the code works today.

The current code risks trying to free a buffer from the used ring
when none was available, that will happen most times because KVM
doesn't handle the packet immediately on kick(). Luckily it was working
because it was unlikely to have a buffer still queued for transmit when
virtnet_transmit() was called.

Also, adds a BUG_ON() to vring_get_buf(), to catch cases where we try
to free a buffer from the used ring when there was none available.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
src/drivers/net/virtio-net.c