]> xenbits.xensource.com Git - qemu-upstream-unstable.git/commitdiff
Revert "vhost_net: start/stop guest notifiers properly"
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 4 Sep 2014 11:18:36 +0000 (12:18 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Thu, 4 Sep 2014 11:19:37 +0000 (12:19 +0100)
This reverts commit aad4dce934649b3a398396fc2a76f215bb194ea4.

I accidentally merged the wrong version of a pull request
which had a buggy version of this patch. Reverting the
buggy version means we can then cleanly merge in the correct
pull with the corrected change.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
hw/net/vhost_net.c
hw/virtio/vhost.c

index ba5d544642ebd8acf71287853dbd8497d4200594..9bbf2ee4ce07d44063ed66f432574f498914ae43 100644 (file)
@@ -188,19 +188,16 @@ bool vhost_net_query(VHostNetState *net, VirtIODevice *dev)
     return vhost_dev_query(&net->dev, dev);
 }
 
-static void vhost_net_set_vq_index(struct vhost_net *net, int vq_index)
-{
-    net->dev.vq_index = vq_index;
-}
-
 static int vhost_net_start_one(struct vhost_net *net,
-                               VirtIODevice *dev)
+                               VirtIODevice *dev,
+                               int vq_index)
 {
     struct vhost_vring_file file = { };
     int r;
 
     net->dev.nvqs = 2;
     net->dev.vqs = net->vqs;
+    net->dev.vq_index = vq_index;
 
     r = vhost_dev_enable_notifiers(&net->dev, dev);
     if (r < 0) {
@@ -304,7 +301,11 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
     }
 
     for (i = 0; i < total_queues; i++) {
-        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
+        r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev, i * 2);
+
+        if (r < 0) {
+            goto err;
+        }
     }
 
     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
@@ -313,14 +314,6 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
         goto err;
     }
 
-    for (i = 0; i < total_queues; i++) {
-        r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev);
-
-        if (r < 0) {
-            goto err;
-        }
-    }
-
     return 0;
 
 err:
@@ -338,16 +331,16 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
     int i, r;
 
-    for (i = 0; i < total_queues; i++) {
-        vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
-    }
-
     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
     if (r < 0) {
         fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r);
         fflush(stderr);
     }
     assert(r >= 0);
+
+    for (i = 0; i < total_queues; i++) {
+        vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
+    }
 }
 
 void vhost_net_cleanup(struct vhost_net *net)
index 5d7c40ac04d06f48e604d4d8c6ce9d054f847104..e55fe1cc7eb05eae0ce0b01fdd9e25eed946ea05 100644 (file)
@@ -976,6 +976,7 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev)
 bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n)
 {
     struct vhost_virtqueue *vq = hdev->vqs + n - hdev->vq_index;
+    assert(hdev->started);
     assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs);
     return event_notifier_test_and_clear(&vq->masked_notifier);
 }
@@ -987,6 +988,7 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
     struct VirtQueue *vvq = virtio_get_queue(vdev, n);
     int r, index = n - hdev->vq_index;
 
+    assert(hdev->started);
     assert(n >= hdev->vq_index && n < hdev->vq_index + hdev->nvqs);
 
     struct vhost_vring_file file = {