diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-05-02 22:50:43 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-05-02 07:50:43 -0400 |
commit | 5ef827526fc01820a7a80827802e9fad3f34f937 (patch) | |
tree | c41345c6de6ad5b4b4d7071aa46a9e27a773247c | |
parent | 886c35fbcf6fb2eee15687efc2d64d99b6ad9a4a (diff) |
virtio: ignore corrupted virtqueues rather than spinning.
A corrupt virtqueue (caused by the other end screwing up) can have
strange results such as a driver spinning: just bail when we try to
get a buffer from a known-broken queue.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | drivers/virtio/virtio_ring.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index c2fa5c630813..937a49d6772c 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -184,6 +184,11 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len) | |||
184 | 184 | ||
185 | START_USE(vq); | 185 | START_USE(vq); |
186 | 186 | ||
187 | if (unlikely(vq->broken)) { | ||
188 | END_USE(vq); | ||
189 | return NULL; | ||
190 | } | ||
191 | |||
187 | if (!more_used(vq)) { | 192 | if (!more_used(vq)) { |
188 | pr_debug("No more buffers in queue\n"); | 193 | pr_debug("No more buffers in queue\n"); |
189 | END_USE(vq); | 194 | END_USE(vq); |