virtio/tools: add delayed interupt mode
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e4ae004b84
commit
64d098886e
2 changed files with 23 additions and 4 deletions
|
@ -203,6 +203,7 @@ void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
|
||||||
void virtqueue_disable_cb(struct virtqueue *vq);
|
void virtqueue_disable_cb(struct virtqueue *vq);
|
||||||
|
|
||||||
bool virtqueue_enable_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);
|
void *virtqueue_detach_unused_buf(struct virtqueue *vq);
|
||||||
struct virtqueue *vring_new_virtqueue(unsigned int num,
|
struct virtqueue *vring_new_virtqueue(unsigned int num,
|
||||||
|
|
|
@ -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;
|
struct scatterlist sl;
|
||||||
long started = 0, completed = 0;
|
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);
|
assert(started <= bufs);
|
||||||
if (completed == bufs)
|
if (completed == bufs)
|
||||||
break;
|
break;
|
||||||
if (virtqueue_enable_cb(vq->vq)) {
|
if (delayed) {
|
||||||
wait_for_interrupt(dev);
|
if (virtqueue_enable_cb_delayed(vq->vq))
|
||||||
|
wait_for_interrupt(dev);
|
||||||
|
} else {
|
||||||
|
if (virtqueue_enable_cb(vq->vq))
|
||||||
|
wait_for_interrupt(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
test = 0;
|
test = 0;
|
||||||
|
@ -215,6 +220,14 @@ const struct option longopts[] = {
|
||||||
.name = "no-indirect",
|
.name = "no-indirect",
|
||||||
.val = 'i',
|
.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]"
|
fprintf(stderr, "Usage: virtio_test [--help]"
|
||||||
" [--no-indirect]"
|
" [--no-indirect]"
|
||||||
" [--no-event-idx]"
|
" [--no-event-idx]"
|
||||||
|
" [--delayed-interrupt]"
|
||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,6 +247,7 @@ int main(int argc, char **argv)
|
||||||
unsigned long long features = (1ULL << VIRTIO_RING_F_INDIRECT_DESC) |
|
unsigned long long features = (1ULL << VIRTIO_RING_F_INDIRECT_DESC) |
|
||||||
(1ULL << VIRTIO_RING_F_EVENT_IDX);
|
(1ULL << VIRTIO_RING_F_EVENT_IDX);
|
||||||
int o;
|
int o;
|
||||||
|
bool delayed = false;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
o = getopt_long(argc, argv, optstring, longopts, NULL);
|
o = getopt_long(argc, argv, optstring, longopts, NULL);
|
||||||
|
@ -251,6 +266,9 @@ int main(int argc, char **argv)
|
||||||
case 'i':
|
case 'i':
|
||||||
features &= ~(1ULL << VIRTIO_RING_F_INDIRECT_DESC);
|
features &= ~(1ULL << VIRTIO_RING_F_INDIRECT_DESC);
|
||||||
break;
|
break;
|
||||||
|
case 'D':
|
||||||
|
delayed = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
|
@ -260,6 +278,6 @@ int main(int argc, char **argv)
|
||||||
done:
|
done:
|
||||||
vdev_info_init(&dev, features);
|
vdev_info_init(&dev, features);
|
||||||
vq_info_add(&dev, 256);
|
vq_info_add(&dev, 256);
|
||||||
run_test(&dev, &dev.vqs[0], 0x100000);
|
run_test(&dev, &dev.vqs[0], delayed, 0x100000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue