All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <groug@kaod.org>
To: Laurent Vivier <lvivier@redhat.com>
Cc: qemu-devel@nongnu.org, dgibson@redhat.com, thuth@redhat.com,
	qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 3/3] tests: enable virtio tests on SPAPR
Date: Sat, 1 Oct 2016 14:29:29 +0200	[thread overview]
Message-ID: <20161001142929.0994975c@bahia> (raw)
In-Reply-To: <1475245152-31411-4-git-send-email-lvivier@redhat.com>

On Fri, 30 Sep 2016 16:19:12 +0200
Laurent Vivier <lvivier@redhat.com> wrote:

> but disable MSI-X tests on SPAPR as we can't check the result
> (the memory region used on PC is not readable on SPAPR).
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  tests/Makefile.include    |  3 ++-
>  tests/libqos/virtio-pci.c | 26 ++++++++++++++++++++++++--
>  tests/virtio-9p-test.c    | 12 +++++++++++-
>  tests/virtio-blk-test.c   | 25 ++++++++++++++++++++-----
>  tests/virtio-net-test.c   | 18 ++++++++++++++++--
>  tests/virtio-rng-test.c   |  7 ++++++-
>  tests/virtio-scsi-test.c  | 12 +++++++++++-
>  7 files changed, 90 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index c46a32d..1e4a3d5 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -278,6 +278,7 @@ check-qtest-ppc64-y += tests/usb-hcd-uhci-test$(EXESUF)
>  gcov-files-ppc64-y += hw/usb/hcd-uhci.c
>  check-qtest-ppc64-y += tests/usb-hcd-xhci-test$(EXESUF)
>  gcov-files-ppc64-y += hw/usb/hcd-xhci.c
> +check-qtest-ppc64-y += $(check-qtest-virtio-y)
>  
>  check-qtest-sh4-y = tests/endianness-test$(EXESUF)
>  
> @@ -604,7 +605,7 @@ libqos-pc-obj-y += tests/libqos/ahci.o
>  libqos-omap-obj-y = $(libqos-obj-y) tests/libqos/i2c-omap.o
>  libqos-imx-obj-y = $(libqos-obj-y) tests/libqos/i2c-imx.o
>  libqos-usb-obj-y = $(libqos-spapr-obj-y) $(libqos-pc-obj-y) tests/libqos/usb.o
> -libqos-virtio-obj-y = $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o tests/libqos/virtio-mmio.o tests/libqos/malloc-generic.o
> +libqos-virtio-obj-y = $(libqos-spapr-obj-y) $(libqos-pc-obj-y) tests/libqos/virtio.o tests/libqos/virtio-pci.o tests/libqos/virtio-mmio.o tests/libqos/malloc-generic.o
>  
>  tests/device-introspect-test$(EXESUF): tests/device-introspect-test.o
>  tests/rtc-test$(EXESUF): tests/rtc-test.o
> diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> index 6e005c1..bf775fa 100644
> --- a/tests/libqos/virtio-pci.c
> +++ b/tests/libqos/virtio-pci.c
> @@ -68,16 +68,38 @@ static uint8_t qvirtio_pci_config_readb(QVirtioDevice *d, uint64_t addr)
>      return qpci_io_readb(dev->pdev, (void *)(uintptr_t)addr);
>  }
>  
> +/* PCI is always read in little-endian order
> + * but virtio ( < 1.0) is in guest order
> + * so with a big-endian guest the order has been reversed,
> + * reverse it again
> + * virtio-1.0 is always little-endian, like PCI, but as it
> + * is not implemented in libqos, we don't manage this case.
> + */
> +
>  static uint16_t qvirtio_pci_config_readw(QVirtioDevice *d, uint64_t addr)
>  {
>      QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d;
> -    return qpci_io_readw(dev->pdev, (void *)(uintptr_t)addr);
> +    uint16_t value;
> +
> +    value = qpci_io_readw(dev->pdev, (void *)(uintptr_t)addr);
> +    /* FIXME: don't swap with virtio-1.0 */
> +    if (target_big_endian()) {
> +        value = bswap16(value);
> +    }
> +    return value;
>  }
>  
>  static uint32_t qvirtio_pci_config_readl(QVirtioDevice *d, uint64_t addr)
>  {
>      QVirtioPCIDevice *dev = (QVirtioPCIDevice *)d;
> -    return qpci_io_readl(dev->pdev, (void *)(uintptr_t)addr);
> +    uint32_t value;
> +
> +    value = qpci_io_readl(dev->pdev, (void *)(uintptr_t)addr);
> +    /* FIXME: don't swap with virtio-1.0 */
> +    if (target_big_endian()) {
> +        value = bswap32(value);
> +    }
> +    return value;
>  }
>  
>  static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, uint64_t addr)
> diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c
> index 7698014..9adb58f 100644
> --- a/tests/virtio-9p-test.c
> +++ b/tests/virtio-9p-test.c
> @@ -11,6 +11,7 @@
>  #include "libqtest.h"
>  #include "qemu-common.h"
>  #include "libqos/libqos-pc.h"
> +#include "libqos/libqos-spapr.h"
>  #include "libqos/virtio.h"
>  #include "libqos/virtio-pci.h"
>  #include "standard-headers/linux/virtio_ids.h"
> @@ -22,12 +23,21 @@ static char *test_share;
>  
>  static QOSState *qvirtio_9p_start(void)
>  {
> +    const char *arch = qtest_get_arch();
>      test_share = g_strdup("/tmp/qtest.XXXXXX");
>      g_assert_nonnull(mkdtemp(test_share));
>      const char *cmd = "-fsdev local,id=fsdev0,security_model=none,path=%s "
>                        "-device virtio-9p-pci,fsdev=fsdev0,mount_tag=%s";
>  
> -    return qtest_pc_boot(cmd, test_share, mount_tag);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        return qtest_pc_boot(cmd, test_share, mount_tag);
> +    }
> +    if (strcmp(arch, "ppc64") == 0) {
> +        return qtest_spapr_boot(cmd, test_share, mount_tag);
> +    }
> +
> +    g_printerr("virtio-9p tests are only available on x86 or ppc64\n");
> +    exit(EXIT_FAILURE);
>  }
>  

According to your remarks and John's answer, I agree that this is ok.
A one-size-fits-all API may be interesting, but this is definitely
another work and it shouldn't prevent this patchset from being applied.

>  static void qvirtio_9p_stop(QOSState *qs)
> diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
> index 96d0125..b4494c9 100644
> --- a/tests/virtio-blk-test.c
> +++ b/tests/virtio-blk-test.c
> @@ -11,6 +11,7 @@
>  #include "qemu/osdep.h"
>  #include "libqtest.h"
>  #include "libqos/libqos-pc.h"
> +#include "libqos/libqos-spapr.h"
>  #include "libqos/virtio.h"
>  #include "libqos/virtio-pci.h"
>  #include "libqos/virtio-mmio.h"
> @@ -59,6 +60,7 @@ static char *drive_create(void)
>  static QOSState *pci_test_start(void)
>  {
>      QOSState *qs;
> +    const char *arch = qtest_get_arch();
>      char *tmp_path;
>      const char *cmd = "-drive if=none,id=drive0,file=%s,format=raw "
>                        "-drive if=none,id=drive1,file=/dev/null,format=raw "
> @@ -67,7 +69,14 @@ static QOSState *pci_test_start(void)
>  
>      tmp_path = drive_create();
>  
> -    qs = qtest_pc_boot(cmd, tmp_path, PCI_SLOT, PCI_FN);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        qs = qtest_pc_boot(cmd, tmp_path, PCI_SLOT, PCI_FN);
> +    } else if (strcmp(arch, "ppc64") == 0) {
> +        qs = qtest_spapr_boot(cmd, tmp_path, PCI_SLOT, PCI_FN);
> +    } else {
> +        g_printerr("virtio-blk tests are only available on x86 or ppc64\n");
> +        exit(EXIT_FAILURE);
> +    }
>      unlink(tmp_path);
>      g_free(tmp_path);
>      return qs;
> @@ -671,6 +680,7 @@ static void pci_hotplug(void)
>  {
>      QVirtioPCIDevice *dev;
>      QOSState *qs;
> +    const char *arch = qtest_get_arch();
>  
>      qs = pci_test_start();
>  
> @@ -684,7 +694,9 @@ static void pci_hotplug(void)
>      g_free(dev);
>  
>      /* unplug secondary disk */
> -    qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP);
> +    }
>      qtest_shutdown(qs);
>  }
>  
> @@ -735,12 +747,15 @@ int main(int argc, char **argv)
>  
>      g_test_init(&argc, &argv, NULL);
>  
> -    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0 ||
> +        strcmp(arch, "ppc") == 0 || strcmp(arch, "ppc64") == 0) {

Can this test actually run on a ppc compatible platform ?

Cheers.

--
Greg

>          qtest_add_func("/virtio/blk/pci/basic", pci_basic);
>          qtest_add_func("/virtio/blk/pci/indirect", pci_indirect);
>          qtest_add_func("/virtio/blk/pci/config", pci_config);
> -        qtest_add_func("/virtio/blk/pci/msix", pci_msix);
> -        qtest_add_func("/virtio/blk/pci/idx", pci_idx);
> +        if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +            qtest_add_func("/virtio/blk/pci/msix", pci_msix);
> +            qtest_add_func("/virtio/blk/pci/idx", pci_idx);
> +        }
>          qtest_add_func("/virtio/blk/pci/hotplug", pci_hotplug);
>      } else if (strcmp(arch, "arm") == 0) {
>          qtest_add_func("/virtio/blk/mmio/basic", mmio_basic);
> diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c
> index 13bb889..af9f99e 100644
> --- a/tests/virtio-net-test.c
> +++ b/tests/virtio-net-test.c
> @@ -13,6 +13,7 @@
>  #include "qemu/sockets.h"
>  #include "qemu/iov.h"
>  #include "libqos/libqos-pc.h"
> +#include "libqos/libqos-spapr.h"
>  #include "libqos/virtio.h"
>  #include "libqos/virtio-pci.h"
>  #include "qemu/bswap.h"
> @@ -52,10 +53,18 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot)
>  
>  static QOSState *pci_test_start(int socket)
>  {
> +    const char *arch = qtest_get_arch();
>      const char *cmd = "-netdev socket,fd=%d,id=hs0 -device "
>                        "virtio-net-pci,netdev=hs0";
>  
> -    return qtest_pc_boot(cmd, socket);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        return qtest_pc_boot(cmd, socket);
> +    }
> +    if (strcmp(arch, "ppc64") == 0) {
> +        return qtest_spapr_boot(cmd, socket);
> +    }
> +    g_printerr("virtio-net tests are only available on x86 or ppc64\n");
> +    exit(EXIT_FAILURE);
>  }
>  
>  static void driver_init(const QVirtioBus *bus, QVirtioDevice *dev)
> @@ -235,10 +244,15 @@ static void pci_basic(gconstpointer data)
>  
>  static void hotplug(void)
>  {
> +    const char *arch = qtest_get_arch();
> +
>      qtest_start("-device virtio-net-pci");
>  
>      qpci_plug_device_test("virtio-net-pci", "net1", PCI_SLOT_HP, NULL);
> -    qpci_unplug_acpi_device_test("net1", PCI_SLOT_HP);
> +
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        qpci_unplug_acpi_device_test("net1", PCI_SLOT_HP);
> +    }
>  
>      test_end();
>  }
> diff --git a/tests/virtio-rng-test.c b/tests/virtio-rng-test.c
> index e1b2640..dcecf77 100644
> --- a/tests/virtio-rng-test.c
> +++ b/tests/virtio-rng-test.c
> @@ -20,8 +20,13 @@ static void pci_nop(void)
>  
>  static void hotplug(void)
>  {
> +    const char *arch = qtest_get_arch();
> +
>      qpci_plug_device_test("virtio-rng-pci", "rng1", PCI_SLOT_HP, NULL);
> -    qpci_unplug_acpi_device_test("rng1", PCI_SLOT_HP);
> +
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        qpci_unplug_acpi_device_test("rng1", PCI_SLOT_HP);
> +    }
>  }
>  
>  int main(int argc, char **argv)
> diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c
> index 55ff064..249005b 100644
> --- a/tests/virtio-scsi-test.c
> +++ b/tests/virtio-scsi-test.c
> @@ -12,6 +12,7 @@
>  #include "libqtest.h"
>  #include "block/scsi.h"
>  #include "libqos/libqos-pc.h"
> +#include "libqos/libqos-spapr.h"
>  #include "libqos/virtio.h"
>  #include "libqos/virtio-pci.h"
>  #include "standard-headers/linux/virtio_ids.h"
> @@ -33,11 +34,20 @@ typedef struct {
>  
>  static QOSState *qvirtio_scsi_start(const char *extra_opts)
>  {
> +    const char *arch = qtest_get_arch();
>      const char *cmd = "-drive id=drv0,if=none,file=/dev/null,format=raw "
>                        "-device virtio-scsi-pci,id=vs0 "
>                        "-device scsi-hd,bus=vs0.0,drive=drv0 %s";
>  
> -    return qtest_pc_boot(cmd, extra_opts ? : "");
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        return qtest_pc_boot(cmd, extra_opts ? : "");
> +    }
> +    if (strcmp(arch, "ppc64") == 0) {
> +        return qtest_spapr_boot(cmd, extra_opts ? : "");
> +    }
> +
> +    g_printerr("virtio-scsi tests are only available on x86 or ppc64\n");
> +    exit(EXIT_FAILURE);
>  }
>  
>  static void qvirtio_scsi_stop(QOSState *qs)

  reply	other threads:[~2016-10-01 12:29 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-30 14:19 [Qemu-devel] [PATCH v2 0/3] tests: enable virtio tests on SPAPR Laurent Vivier
2016-09-30 14:19 ` [Qemu-devel] [PATCH v2 1/3] tests: use qtest_pc_boot()/qtest_shutdown() in virtio tests Laurent Vivier
2016-10-01 10:57   ` Greg Kurz
2016-09-30 14:19 ` [Qemu-devel] [PATCH v2 2/3] qtest: evaluate endianness of the target in qtest_init() Laurent Vivier
2016-09-30 14:19 ` [Qemu-devel] [PATCH v2 3/3] tests: enable virtio tests on SPAPR Laurent Vivier
2016-10-01 12:29   ` Greg Kurz [this message]
2016-10-01 16:23     ` Thomas Huth
2016-10-01 18:23       ` Mark Cave-Ayland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161001142929.0994975c@bahia \
    --to=groug@kaod.org \
    --cc=dgibson@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.