qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH] tests/qtest: attempt to enable tests for virtio-gpio (!w


From: Dr. David Alan Gilbert
Subject: Re: [RFC PATCH] tests/qtest: attempt to enable tests for virtio-gpio (!working)
Date: Mon, 4 Apr 2022 18:59:03 +0100
User-agent: Mutt/2.1.5 (2021-12-30)

* Alex Bennée (alex.bennee@linaro.org) wrote:
> 
> (expanding the CC list for help, anyone have a better idea about how
> vhost-user qtests should work/see obvious issues with this patch?)

How exactly does it fail?

DAve

> Alex Bennée <alex.bennee@linaro.org> writes:
> 
> > We don't have a virtio-gpio implementation in QEMU and only
> > support a vhost-user backend. The QEMU side of the code is minimal so
> > it should be enough to instantiate the device and pass some vhost-user
> > messages over the control socket. To do this we hook into the existing
> > vhost-user-test code and just add the bits required for gpio.
> >
> > Based-on: 20220118203833.316741-1-eric.auger@redhat.com
> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> > Cc: Viresh Kumar <viresh.kumar@linaro.org>
> > Cc: Paolo Bonzini <pbonzini@redhat.com>
> >
> > ---
> >
> > This goes as far as to add things to the QOS tree but so far it's
> > failing to properly start QEMU with the chardev socket needed to
> > communicate between the mock vhost-user daemon and QEMU itself.
> > ---
> >  tests/qtest/libqos/virtio-gpio.h | 34 +++++++++++
> >  tests/qtest/libqos/virtio-gpio.c | 98 ++++++++++++++++++++++++++++++++
> >  tests/qtest/vhost-user-test.c    | 34 +++++++++++
> >  tests/qtest/libqos/meson.build   |  1 +
> >  4 files changed, 167 insertions(+)
> >  create mode 100644 tests/qtest/libqos/virtio-gpio.h
> >  create mode 100644 tests/qtest/libqos/virtio-gpio.c
> >
> > diff --git a/tests/qtest/libqos/virtio-gpio.h 
> > b/tests/qtest/libqos/virtio-gpio.h
> > new file mode 100644
> > index 0000000000..abe6967ae9
> > --- /dev/null
> > +++ b/tests/qtest/libqos/virtio-gpio.h
> > @@ -0,0 +1,34 @@
> > +/*
> > + * virtio-gpio structures
> > + *
> > + * Copyright (c) 2022 Linaro Ltd
> > + *
> > + * SPDX-License-Identifier: GPL-2.0-or-later
> > + */
> > +
> > +#ifndef TESTS_LIBQOS_VIRTIO_GPIO_H
> > +#define TESTS_LIBQOS_VIRTIO_GPIO_H
> > +
> > +#include "qgraph.h"
> > +#include "virtio.h"
> > +#include "virtio-pci.h"
> > +
> > +typedef struct QVhostUserGPIO QVhostUserGPIO;
> > +typedef struct QVhostUserGPIOPCI QVhostUserGPIOPCI;
> > +typedef struct QVhostUserGPIODevice QVhostUserGPIODevice;
> > +
> > +struct QVhostUserGPIO {
> > +    QVirtioDevice *vdev;
> > +};
> > +
> > +struct QVhostUserGPIOPCI {
> > +    QVirtioPCIDevice pci_vdev;
> > +    QVhostUserGPIO gpio;
> > +};
> > +
> > +struct QVhostUserGPIODevice {
> > +    QOSGraphObject obj;
> > +    QVhostUserGPIO gpio;
> > +};
> > +
> > +#endif
> > diff --git a/tests/qtest/libqos/virtio-gpio.c 
> > b/tests/qtest/libqos/virtio-gpio.c
> > new file mode 100644
> > index 0000000000..62c8074777
> > --- /dev/null
> > +++ b/tests/qtest/libqos/virtio-gpio.c
> > @@ -0,0 +1,98 @@
> > +/*
> > + * virtio-gpio nodes for testing
> > + *
> > + * Copyright (c) 2022 Linaro Ltd
> > + *
> > + * SPDX-License-Identifier: GPL-2.0-or-later
> > + */
> > +
> > +#include "qemu/osdep.h"
> > +#include "libqtest.h"
> > +#include "qemu/module.h"
> > +#include "qgraph.h"
> > +#include "virtio-gpio.h"
> > +
> > +static void *qvirtio_gpio_get_driver(QVhostUserGPIO *v_gpio,
> > +                                       const char *interface)
> > +{
> > +    if (!g_strcmp0(interface, "vhost-user-gpio")) {
> > +        return v_gpio;
> > +    }
> > +    if (!g_strcmp0(interface, "virtio")) {
> > +        return v_gpio->vdev;
> > +    }
> > +
> > +    fprintf(stderr, "%s not present in virtio-gpio-device\n", interface);
> > +    g_assert_not_reached();
> > +}
> > +
> > +static void *qvirtio_gpio_device_get_driver(void *object,
> > +                                              const char *interface)
> > +{
> > +    QVhostUserGPIODevice *v_gpio = object;
> > +    return qvirtio_gpio_get_driver(&v_gpio->gpio, interface);
> > +}
> > +
> > +static void *virtio_gpio_device_create(void *virtio_dev,
> > +                                         QGuestAllocator *t_alloc,
> > +                                         void *addr)
> > +{
> > +    QVhostUserGPIODevice *virtio_device = g_new0(QVhostUserGPIODevice, 1);
> > +    QVhostUserGPIO *interface = &virtio_device->gpio;
> > +
> > +    interface->vdev = virtio_dev;
> > +
> > +    virtio_device->obj.get_driver = qvirtio_gpio_device_get_driver;
> > +
> > +    return &virtio_device->obj;
> > +}
> > +
> > +/* virtio-gpio-pci */
> > +static void *qvirtio_gpio_pci_get_driver(void *object, const char 
> > *interface)
> > +{
> > +    QVhostUserGPIOPCI *v_gpio = object;
> > +    if (!g_strcmp0(interface, "pci-device")) {
> > +        return v_gpio->pci_vdev.pdev;
> > +    }
> > +    return qvirtio_gpio_get_driver(&v_gpio->gpio, interface);
> > +}
> > +
> > +static void *virtio_gpio_pci_create(void *pci_bus, QGuestAllocator 
> > *t_alloc,
> > +                                      void *addr)
> > +{
> > +    QVhostUserGPIOPCI *virtio_spci = g_new0(QVhostUserGPIOPCI, 1);
> > +    QVhostUserGPIO *interface = &virtio_spci->gpio;
> > +    QOSGraphObject *obj = &virtio_spci->pci_vdev.obj;
> > +
> > +    virtio_pci_init(&virtio_spci->pci_vdev, pci_bus, addr);
> > +    interface->vdev = &virtio_spci->pci_vdev.vdev;
> > +
> > +    obj->get_driver = qvirtio_gpio_pci_get_driver;
> > +
> > +    return obj;
> > +}
> > +
> > +static void virtio_gpio_register_nodes(void)
> > +{
> > +    QPCIAddress addr = {
> > +        .devfn = QPCI_DEVFN(4, 0),
> > +    };
> > +
> > +    QOSGraphEdgeOptions edge_opts = { };
> > +
> > +    /* vhost-user-gpio-device */
> > +    edge_opts.extra_device_opts = "id=gpio0,chardev=vhgpio0";
> > +    qos_node_create_driver("vhost-user-gpio-device",
> > +                            virtio_gpio_device_create);
> > +    qos_node_consumes("vhost-user-gpio-device", "virtio-bus", &edge_opts);
> > +    qos_node_produces("vhost-user-gpio-device", "vhost-user-gpio");
> > +
> > +    /* virtio-gpio-pci */
> > +    edge_opts.extra_device_opts = "id=gpio0,addr=04.0,chardev=vhgpio0";
> > +    add_qpci_address(&edge_opts, &addr);
> > +    qos_node_create_driver("vhost-user-gpio-pci", virtio_gpio_pci_create);
> > +    qos_node_consumes("vhost-user-gpio-pci", "pci-bus", &edge_opts);
> > +    qos_node_produces("vhost-user-gpio-pci", "vhost-user-gpio");
> > +}
> > +
> > +libqos_init(virtio_gpio_register_nodes);
> > diff --git a/tests/qtest/vhost-user-test.c b/tests/qtest/vhost-user-test.c
> > index ee30f54796..4f8789424b 100644
> > --- a/tests/qtest/vhost-user-test.c
> > +++ b/tests/qtest/vhost-user-test.c
> > @@ -43,6 +43,7 @@
> >                          " -numa node,memdev=mem"
> >  #define QEMU_CMD_CHR    " -chardev socket,id=%s,path=%s%s"
> >  #define QEMU_CMD_NETDEV " -netdev 
> > vhost-user,id=hs0,chardev=%s,vhostforce=on"
> > +#define QEMU_CMD_GPIO   " -device 
> > vhost-user-gpio-pci,id=gpio0,chardev=%s,vhostforce=on"
> >  
> >  #define HUGETLBFS_MAGIC       0x958458f6
> >  
> > @@ -137,6 +138,7 @@ enum {
> >  
> >  enum {
> >      VHOST_USER_NET,
> > +    VHOST_USER_GPIO,
> >  };
> >  
> >  typedef struct TestServer {
> > @@ -194,6 +196,14 @@ static void append_vhost_net_opts(TestServer *s, 
> > GString *cmd_line,
> >                             chr_opts, s->chr_name);
> >  }
> >  
> > +static void append_vhost_gpio_opts(TestServer *s, GString *cmd_line,
> > +                             const char *chr_opts)
> > +{
> > +    g_string_append_printf(cmd_line, QEMU_CMD_CHR QEMU_CMD_GPIO,
> > +                           s->chr_name, s->socket_path,
> > +                           chr_opts, s->chr_name);
> > +}
> > +
> >  static void append_mem_opts(TestServer *server, GString *cmd_line,
> >                              int size, enum test_memfd memfd)
> >  {
> > @@ -1014,3 +1024,27 @@ static void register_vhost_user_test(void)
> >                   test_multiqueue, &opts);
> >  }
> >  libqos_init(register_vhost_user_test);
> > +
> > +static struct vhost_user_ops g_vu_gpio_ops = {
> > +    .type = VHOST_USER_GPIO,
> > +
> > +    .append_opts = append_vhost_gpio_opts,
> > +
> > +    .set_features = vu_net_set_features,
> > +    .get_protocol_features = vu_net_get_protocol_features,
> > +};
> > +
> > +static void register_vhost_gpio_test(void)
> > +{
> > +    QOSGraphTestOptions opts = {
> > +        .before = vhost_user_test_setup,
> > +        .subprocess = true,
> > +        .arg = &g_vu_gpio_ops,
> > +    };
> > +
> > +    qemu_add_opts(&qemu_chardev_opts);
> > +
> > +    qos_add_test("read-guest-mem/memfile",
> > +                 "vhost-user-gpio", test_read_guest_mem, &opts);
> > +}
> > +libqos_init(register_vhost_gpio_test);
> > diff --git a/tests/qtest/libqos/meson.build b/tests/qtest/libqos/meson.build
> > index 8c8ee15553..f581330d8b 100644
> > --- a/tests/qtest/libqos/meson.build
> > +++ b/tests/qtest/libqos/meson.build
> > @@ -42,6 +42,7 @@ libqos_srcs = files('../libqtest.c',
> >          'virtio-scsi.c',
> >          'virtio-serial.c',
> >          'virtio-iommu.c',
> > +        'virtio-gpio.c',
> >          'generic-pcihost.c',
> >  
> >          # qgraph machines:
> 
> 
> -- 
> Alex Bennée
> 
-- 
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK




reply via email to

[Prev in Thread] Current Thread [Next in Thread]