When a guest kernel initialises a virtio device using an MMIO transport,
it attempts to set the size of the virtual queue. For devices that expect
a PCI transport, this is not the case and, as such, our console, 9p and
rng virtio devices do not set a pointer for this function and subsequently
SEGV.

This patch adds a dummy implementation of the function to avoid the fatal
signal.

Signed-off-by: Will Deacon <will.dea...@arm.com>
---
 tools/kvm/virtio/9p.c      |    7 +++++++
 tools/kvm/virtio/console.c |    7 +++++++
 tools/kvm/virtio/rng.c     |    7 +++++++
 3 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/tools/kvm/virtio/9p.c b/tools/kvm/virtio/9p.c
index 835a8c4..a372c22 100644
--- a/tools/kvm/virtio/9p.c
+++ b/tools/kvm/virtio/9p.c
@@ -1300,6 +1300,12 @@ static int get_size_vq(struct kvm *kvm, void *dev, u32 
vq)
        return VIRTQUEUE_NUM;
 }
 
+static int set_size_vq(struct kvm *kvm, void *dev, u32 vq, int size)
+{
+       /* FIXME: dynamic */
+       return size;
+}
+
 struct virtio_ops p9_dev_virtio_ops = (struct virtio_ops) {
        .get_config             = get_config,
        .get_host_features      = get_host_features,
@@ -1308,6 +1314,7 @@ struct virtio_ops p9_dev_virtio_ops = (struct virtio_ops) 
{
        .notify_vq              = notify_vq,
        .get_pfn_vq             = get_pfn_vq,
        .get_size_vq            = get_size_vq,
+       .set_size_vq            = set_size_vq,
 };
 
 int virtio_9p_rootdir_parser(const struct option *opt, const char *arg, int 
unset)
diff --git a/tools/kvm/virtio/console.c b/tools/kvm/virtio/console.c
index 1df6cb0..ea5d974 100644
--- a/tools/kvm/virtio/console.c
+++ b/tools/kvm/virtio/console.c
@@ -172,6 +172,12 @@ static int get_size_vq(struct kvm *kvm, void *dev, u32 vq)
        return VIRTIO_CONSOLE_QUEUE_SIZE;
 }
 
+static int set_size_vq(struct kvm *kvm, void *dev, u32 vq, int size)
+{
+       /* FIXME: dynamic */
+       return size;
+}
+
 static struct virtio_ops con_dev_virtio_ops = (struct virtio_ops) {
        .get_config             = get_config,
        .get_host_features      = get_host_features,
@@ -180,6 +186,7 @@ static struct virtio_ops con_dev_virtio_ops = (struct 
virtio_ops) {
        .notify_vq              = notify_vq,
        .get_pfn_vq             = get_pfn_vq,
        .get_size_vq            = get_size_vq,
+       .set_size_vq            = set_size_vq,
 };
 
 int virtio_console__init(struct kvm *kvm)
diff --git a/tools/kvm/virtio/rng.c b/tools/kvm/virtio/rng.c
index b2616d8..e1e4fc0 100644
--- a/tools/kvm/virtio/rng.c
+++ b/tools/kvm/virtio/rng.c
@@ -132,6 +132,12 @@ static int get_size_vq(struct kvm *kvm, void *dev, u32 vq)
        return VIRTIO_RNG_QUEUE_SIZE;
 }
 
+static int set_size_vq(struct kvm *kvm, void *dev, u32 vq, int size)
+{
+       /* FIXME: dynamic */
+       return size;
+}
+
 static struct virtio_ops rng_dev_virtio_ops = (struct virtio_ops) {
        .get_config             = get_config,
        .get_host_features      = get_host_features,
@@ -140,6 +146,7 @@ static struct virtio_ops rng_dev_virtio_ops = (struct 
virtio_ops) {
        .notify_vq              = notify_vq,
        .get_pfn_vq             = get_pfn_vq,
        .get_size_vq            = get_size_vq,
+       .set_size_vq            = set_size_vq,
 };
 
 int virtio_rng__init(struct kvm *kvm)
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to