qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH-v2 3/3] vhost: Skip uninitialized VQs in vhost_virtq


From: Nicholas A. Bellinger
Subject: [Qemu-devel] [PATCH-v2 3/3] vhost: Skip uninitialized VQs in vhost_virtqueue_[start, stop]
Date: Mon, 1 Apr 2013 23:58:24 +0000

From: Nicholas Bellinger <address@hidden>

This patch adds virtio_queue_valid() checks in vhost_virtqueue_start()
and vhost_virtqueue_stop() to avoid uninitialized VQs during vhost-scsi-pci
seabios operation, where we currently expect only the request VQ to have
been initialized before virtio-scsi LLD guest hand-off.

Also, go ahead and skip the same uninitialized VQs during sanity checks
within vhost_verify_ring_mappings() by checking vq->ring_[phys,size]
directly.

Cc: Michael S. Tsirkin <address@hidden>
Cc: Asias He <address@hidden>
Cc: Paolo Bonzini <address@hidden>
Signed-off-by: Nicholas Bellinger <address@hidden>
---
 hw/vhost.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/hw/vhost.c b/hw/vhost.c
index 4d6aee3..832cc89 100644
--- a/hw/vhost.c
+++ b/hw/vhost.c
@@ -314,6 +314,9 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
         hwaddr l;
         void *p;
 
+        if (!vq->ring_phys || !vq->ring_size) {
+            continue;
+        }
         if (!ranges_overlap(start_addr, size, vq->ring_phys, vq->ring_size)) {
             continue;
         }
@@ -645,6 +648,10 @@ static int vhost_virtqueue_start(struct vhost_dev *dev,
 
     assert(idx >= dev->vq_index && idx < dev->vq_index + dev->nvqs);
 
+    if (!virtio_queue_valid(vdev, idx)) {
+        return 0;
+    }
+
     vq->num = state.num = virtio_queue_get_num(vdev, idx);
     r = ioctl(dev->control, VHOST_SET_VRING_NUM, &state);
     if (r) {
@@ -732,6 +739,11 @@ static void vhost_virtqueue_stop(struct vhost_dev *dev,
     };
     int r;
     assert(idx >= dev->vq_index && idx < dev->vq_index + dev->nvqs);
+
+    if (!virtio_queue_valid(vdev, idx)) {
+        return;
+    }
+
     r = ioctl(dev->control, VHOST_GET_VRING_BASE, &state);
     if (r < 0) {
         fprintf(stderr, "vhost VQ %d ring restore failed: %d\n", idx, r);
-- 
1.7.2.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]