Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64d09888 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin
Browse files

virtio/tools: add delayed interupt mode

parent e4ae004b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+22 −4
Original line number Diff line number Diff line
@@ -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,7 +184,11 @@ 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)) {
		if (delayed) {
			if (virtqueue_enable_cb_delayed(vq->vq))
				wait_for_interrupt(dev);
		} else {
			if (virtqueue_enable_cb(vq->vq))
				wait_for_interrupt(dev);
		}
	}
@@ -215,6 +220,14 @@ const struct option longopts[] = {
		.name = "no-indirect",
		.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;
}