virtio/tools: add delayed interupt mode
Michael S. Tsirkin [Mon, 16 Apr 2012 14:11:12 +0000 (10:11 -0400)]
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

tools/virtio/linux/virtio.h
tools/virtio/virtio_test.c

index 7579f19..81847dd 100644 (file)
@@ -203,6 +203,7 @@ void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
 void virtqueue_disable_cb(struct virtqueue *vq);
 
 bool virtqueue_enable_cb(struct virtqueue *vq);
+bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
 
 void *virtqueue_detach_unused_buf(struct virtqueue *vq);
 struct virtqueue *vring_new_virtqueue(unsigned int num,
index 6bf95f9..e626fa5 100644 (file)
@@ -144,7 +144,8 @@ static void wait_for_interrupt(struct vdev_info *dev)
                }
 }
 
-static void run_test(struct vdev_info *dev, struct vq_info *vq, int bufs)
+static void run_test(struct vdev_info *dev, struct vq_info *vq,
+                    bool delayed, int bufs)
 {
        struct scatterlist sl;
        long started = 0, completed = 0;
@@ -183,8 +184,12 @@ static void run_test(struct vdev_info *dev, struct vq_info *vq, int bufs)
                assert(started <= bufs);
                if (completed == bufs)
                        break;
-               if (virtqueue_enable_cb(vq->vq)) {
-                       wait_for_interrupt(dev);
+               if (delayed) {
+                       if (virtqueue_enable_cb_delayed(vq->vq))
+                               wait_for_interrupt(dev);
+               } else {
+                       if (virtqueue_enable_cb(vq->vq))
+                               wait_for_interrupt(dev);
                }
        }
        test = 0;
@@ -216,6 +221,14 @@ const struct option longopts[] = {
                .val = 'i',
        },
        {
+               .name = "delayed-interrupt",
+               .val = 'D',
+       },
+       {
+               .name = "no-delayed-interrupt",
+               .val = 'd',
+       },
+       {
        }
 };
 
@@ -224,6 +237,7 @@ static void help()
        fprintf(stderr, "Usage: virtio_test [--help]"
                " [--no-indirect]"
                " [--no-event-idx]"
+               " [--delayed-interrupt]"
                "\n");
 }
 
@@ -233,6 +247,7 @@ int main(int argc, char **argv)
        unsigned long long features = (1ULL << VIRTIO_RING_F_INDIRECT_DESC) |
                (1ULL << VIRTIO_RING_F_EVENT_IDX);
        int o;
+       bool delayed = false;
 
        for (;;) {
                o = getopt_long(argc, argv, optstring, longopts, NULL);
@@ -251,6 +266,9 @@ int main(int argc, char **argv)
                case 'i':
                        features &= ~(1ULL << VIRTIO_RING_F_INDIRECT_DESC);
                        break;
+               case 'D':
+                       delayed = true;
+                       break;
                default:
                        assert(0);
                        break;
@@ -260,6 +278,6 @@ int main(int argc, char **argv)
 done:
        vdev_info_init(&dev, features);
        vq_info_add(&dev, 256);
-       run_test(&dev, &dev.vqs[0], 0x100000);
+       run_test(&dev, &dev.vqs[0], delayed, 0x100000);
        return 0;
 }