virtio-net: Fix kick/wait logic
authorEduardo Habkost <ehabkost@redhat.com>
Wed, 8 Oct 2008 20:02:33 +0000 (17:02 -0300)
committerStefan Hajnoczi <stefanha@gmail.com>
Thu, 16 Oct 2008 19:32:56 +0000 (20:32 +0100)
commit744b98d2735286531d87a1c47d46005fb30d5477
treea09686f9fc4d075ca745d007d8f6d4c4f90b8c5d
parentc99b16c9749c26ff86864d636179b9b08f7dd33f
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.

Patch for Etherboot. gPXE has the same problem on the code, but I hadn't
a chance to test gPXE using virtio-net yet.

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