aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeinz Graalfs <graalfs@linux.vnet.ibm.com>2013-10-28 19:10:47 -0400
committerRusty Russell <rusty@rustcorp.com.au>2013-10-28 20:58:19 -0400
commit047b9b94951dba2e93c65a582ae2bce25c960b86 (patch)
tree0164b14f46fb84a8508445611edbbcadc377096e
parent40e4dc530118dbb79e270d5554ac8415588378d2 (diff)
virtio_net: verify if queue is broken after virtqueue_get_buf()
If a virtqueue_get_buf() call returns a NULL pointer a possibly endless while loop should be avoided by checking for a broken virtqueue. Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--drivers/net/virtio_net.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index ff208d2787d3..057ea133cd2b 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -825,7 +825,8 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
825 /* Spin for a response, the kick causes an ioport write, trapping 825 /* Spin for a response, the kick causes an ioport write, trapping
826 * into the hypervisor, so the request should be handled immediately. 826 * into the hypervisor, so the request should be handled immediately.
827 */ 827 */
828 while (!virtqueue_get_buf(vi->cvq, &tmp)) 828 while (!virtqueue_get_buf(vi->cvq, &tmp) &&
829 !virtqueue_is_broken(vi->cvq))
829 cpu_relax(); 830 cpu_relax();
830 831
831 return status == VIRTIO_NET_OK; 832 return status == VIRTIO_NET_OK;