diff mbox series

[PULL,v2,02/44] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator

Message ID 20211020101844.988480-3-mst@redhat.com (mailing list archive)
State New, archived
Headers show
Series [PULL,v2,01/44] tests: acpi: dump table with failed checksum | expand

Commit Message

Michael S. Tsirkin Oct. 20, 2021, 10:19 a.m. UTC
From: Igor Mammedov <imammedo@redhat.com>

Currently it is not possible to create tests that have KVM as a hard
requirement on a host that doesn't support KVM for tested target
binary (modulo going through the trouble of compiling out
the offending test case).

Following scenario makes test fail when it's run on non x86 host:
  qemu-system-x86_64 -enable-kvm -M q35,kernel-irqchip=on -smp 1,maxcpus=288

This patch introduces qtest_has_accel() to let users check if accel is
available in advance and avoid executing non run-able test-cases.

It implements detection of TCG and KVM only, the rest could be
added later on, when we actually start testing them in qtest.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <20210902113551.461632-3-imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 tests/qtest/libqos/libqtest.h |  8 ++++++++
 tests/qtest/libqtest.c        | 27 +++++++++++++++++++++++++++
 meson.build                   |  6 ++++++
 3 files changed, 41 insertions(+)

Comments

Jason Andryuk Oct. 22, 2021, 1:04 p.m. UTC | #1
On Wed, Oct 20, 2021 at 6:23 AM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> From: Igor Mammedov <imammedo@redhat.com>
>
> Currently it is not possible to create tests that have KVM as a hard
> requirement on a host that doesn't support KVM for tested target
> binary (modulo going through the trouble of compiling out
> the offending test case).
>
> Following scenario makes test fail when it's run on non x86 host:
>   qemu-system-x86_64 -enable-kvm -M q35,kernel-irqchip=on -smp 1,maxcpus=288
>
> This patch introduces qtest_has_accel() to let users check if accel is
> available in advance and avoid executing non run-able test-cases.
>
> It implements detection of TCG and KVM only, the rest could be
> added later on, when we actually start testing them in qtest.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Message-Id: <20210902113551.461632-3-imammedo@redhat.com>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>  tests/qtest/libqos/libqtest.h |  8 ++++++++
>  tests/qtest/libqtest.c        | 27 +++++++++++++++++++++++++++
>  meson.build                   |  6 ++++++
>  3 files changed, 41 insertions(+)
>
> diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> index a68dcd79d4..59e9271195 100644
> --- a/tests/qtest/libqos/libqtest.h
> +++ b/tests/qtest/libqos/libqtest.h
> @@ -588,6 +588,14 @@ bool qtest_big_endian(QTestState *s);
>   */
>  const char *qtest_get_arch(void);
>
> +/**
> + * qtest_has_accel:
> + * @accel_name: Accelerator name to check for.
> + *
> + * Returns: true if the accelerator is built in.
> + */
> +bool qtest_has_accel(const char *accel_name);
> +
>  /**
>   * qtest_add_func:
>   * @str: Test case path.
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 73f6b977a6..25aeea385b 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -922,6 +922,33 @@ const char *qtest_get_arch(void)
>      return end + 1;
>  }
>
> +bool qtest_has_accel(const char *accel_name)
> +{
> +    if (g_str_equal(accel_name, "tcg")) {
> +#if defined(CONFIG_TCG)
> +        return true;
> +#else
> +        return false;
> +#endif
> +    } else if (g_str_equal(accel_name, "kvm")) {
> +        int i;
> +        const char *arch = qtest_get_arch();
> +        const char *targets[] = { CONFIG_KVM_TARGETS };
> +
> +        for (i = 0; i < ARRAY_SIZE(targets); i++) {

A xen osstest build fails with:
../qemu-xen-dir-remote/tests/qtest/libqtest.c: In function 'qtest_has_accel':
../qemu-xen-dir-remote/tests/qtest/libqtest.c:938:23: error:
comparison of unsigned expression < 0 is always false
[-Werror=type-limits]
         for (i = 0; i < ARRAY_SIZE(targets); i++) {
                       ^

Super long osstest log
here:http://logs.test-lab.xenproject.org/osstest/logs/165703/build-i386-xsm/6.ts-xen-build.log

It was configured like:
$source/configure --enable-xen --target-list=i386-softmmu \
--enable-debug \
--enable-trace-backend=log \
--prefix=/usr/local \
--libdir=/usr/local/lib/xen/lib \
--includedir=/usr/local/lib/xen/include \
--extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \
-DXC_WANT_COMPAT_GNTTAB_API=1 \
-DXC_WANT_COMPAT_MAP_FOREIGN_API=1 \
-DXC_WANT_COMPAT_DEVICEMODEL_API=1 \
" \
--extra-ldflags="-Wl,-rpath,/usr/local/lib/xen/lib" \
--bindir=/usr/local/lib/xen/bin \
--datadir=/usr/local/share/qemu-xen \
--localstatedir=/var \
--docdir=/usr/local/lib/xen/share/doc \
--mandir=/usr/local/lib/xen/share/man \
--libexecdir=/usr/local/lib/xen/libexec \
--firmwarepath=/usr/local/lib/xen/share/qemu-firmware \
--disable-kvm \
--disable-docs \
--disable-guest-agent \
--python=python3 \
--cpu=i386 ;

--cpu=i386 may be important?  osstest is building in a 32bit debian
environment.  My 64bit fedora workstation fails to configure with
--cpu=i386, and it builds successfully without it.

Maybe add #if defined(CONFIG_KVM) around the code like CONFIG_TCG above?

Regards,
Jason
Igor Mammedov Oct. 26, 2021, 1:41 p.m. UTC | #2
On Fri, 22 Oct 2021 09:04:43 -0400
Jason Andryuk <jandryuk@gmail.com> wrote:

> On Wed, Oct 20, 2021 at 6:23 AM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > From: Igor Mammedov <imammedo@redhat.com>
> >
> > Currently it is not possible to create tests that have KVM as a hard
> > requirement on a host that doesn't support KVM for tested target
> > binary (modulo going through the trouble of compiling out
> > the offending test case).
> >
> > Following scenario makes test fail when it's run on non x86 host:
> >   qemu-system-x86_64 -enable-kvm -M q35,kernel-irqchip=on -smp 1,maxcpus=288
> >
> > This patch introduces qtest_has_accel() to let users check if accel is
> > available in advance and avoid executing non run-able test-cases.
> >
> > It implements detection of TCG and KVM only, the rest could be
> > added later on, when we actually start testing them in qtest.
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > Message-Id: <20210902113551.461632-3-imammedo@redhat.com>
> > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  tests/qtest/libqos/libqtest.h |  8 ++++++++
> >  tests/qtest/libqtest.c        | 27 +++++++++++++++++++++++++++
> >  meson.build                   |  6 ++++++
> >  3 files changed, 41 insertions(+)
> >
> > diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> > index a68dcd79d4..59e9271195 100644
> > --- a/tests/qtest/libqos/libqtest.h
> > +++ b/tests/qtest/libqos/libqtest.h
> > @@ -588,6 +588,14 @@ bool qtest_big_endian(QTestState *s);
> >   */
> >  const char *qtest_get_arch(void);
> >
> > +/**
> > + * qtest_has_accel:
> > + * @accel_name: Accelerator name to check for.
> > + *
> > + * Returns: true if the accelerator is built in.
> > + */
> > +bool qtest_has_accel(const char *accel_name);
> > +
> >  /**
> >   * qtest_add_func:
> >   * @str: Test case path.
> > diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> > index 73f6b977a6..25aeea385b 100644
> > --- a/tests/qtest/libqtest.c
> > +++ b/tests/qtest/libqtest.c
> > @@ -922,6 +922,33 @@ const char *qtest_get_arch(void)
> >      return end + 1;
> >  }
> >
> > +bool qtest_has_accel(const char *accel_name)
> > +{
> > +    if (g_str_equal(accel_name, "tcg")) {
> > +#if defined(CONFIG_TCG)
> > +        return true;
> > +#else
> > +        return false;
> > +#endif
> > +    } else if (g_str_equal(accel_name, "kvm")) {
> > +        int i;
> > +        const char *arch = qtest_get_arch();
> > +        const char *targets[] = { CONFIG_KVM_TARGETS };
> > +
> > +        for (i = 0; i < ARRAY_SIZE(targets); i++) {  
> 
> A xen osstest build fails with:
> ../qemu-xen-dir-remote/tests/qtest/libqtest.c: In function 'qtest_has_accel':
> ../qemu-xen-dir-remote/tests/qtest/libqtest.c:938:23: error:
> comparison of unsigned expression < 0 is always false
> [-Werror=type-limits]
>          for (i = 0; i < ARRAY_SIZE(targets); i++) {
>                        ^
> 
> Super long osstest log
> here:http://logs.test-lab.xenproject.org/osstest/logs/165703/build-i386-xsm/6.ts-xen-build.log
> 
> It was configured like:
> $source/configure --enable-xen --target-list=i386-softmmu \
> --enable-debug \
> --enable-trace-backend=log \
> --prefix=/usr/local \
> --libdir=/usr/local/lib/xen/lib \
> --includedir=/usr/local/lib/xen/include \
> --extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \
> -DXC_WANT_COMPAT_GNTTAB_API=1 \
> -DXC_WANT_COMPAT_MAP_FOREIGN_API=1 \
> -DXC_WANT_COMPAT_DEVICEMODEL_API=1 \
> " \
> --extra-ldflags="-Wl,-rpath,/usr/local/lib/xen/lib" \
> --bindir=/usr/local/lib/xen/bin \
> --datadir=/usr/local/share/qemu-xen \
> --localstatedir=/var \
> --docdir=/usr/local/lib/xen/share/doc \
> --mandir=/usr/local/lib/xen/share/man \
> --libexecdir=/usr/local/lib/xen/libexec \
> --firmwarepath=/usr/local/lib/xen/share/qemu-firmware \
> --disable-kvm \
> --disable-docs \
> --disable-guest-agent \
> --python=python3 \
> --cpu=i386 ;
> 
> --cpu=i386 may be important?  osstest is building in a 32bit debian
> environment.  My 64bit fedora workstation fails to configure with
> --cpu=i386, and it builds successfully without it.
> 
> Maybe add #if defined(CONFIG_KVM) around the code like CONFIG_TCG above?

Thanks for reporting, I'll post fix in a moment.

> Regards,
> Jason
>
diff mbox series

Patch

diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index a68dcd79d4..59e9271195 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -588,6 +588,14 @@  bool qtest_big_endian(QTestState *s);
  */
 const char *qtest_get_arch(void);
 
+/**
+ * qtest_has_accel:
+ * @accel_name: Accelerator name to check for.
+ *
+ * Returns: true if the accelerator is built in.
+ */
+bool qtest_has_accel(const char *accel_name);
+
 /**
  * qtest_add_func:
  * @str: Test case path.
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 73f6b977a6..25aeea385b 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -922,6 +922,33 @@  const char *qtest_get_arch(void)
     return end + 1;
 }
 
+bool qtest_has_accel(const char *accel_name)
+{
+    if (g_str_equal(accel_name, "tcg")) {
+#if defined(CONFIG_TCG)
+        return true;
+#else
+        return false;
+#endif
+    } else if (g_str_equal(accel_name, "kvm")) {
+        int i;
+        const char *arch = qtest_get_arch();
+        const char *targets[] = { CONFIG_KVM_TARGETS };
+
+        for (i = 0; i < ARRAY_SIZE(targets); i++) {
+            if (!strncmp(targets[i], arch, strlen(arch))) {
+                if (!access("/dev/kvm", R_OK | W_OK)) {
+                    return true;
+                }
+            }
+        }
+    } else {
+        /* not implemented */
+        g_assert_not_reached();
+    }
+    return false;
+}
+
 bool qtest_get_irq(QTestState *s, int num)
 {
     /* dummy operation in order to make sure irq is up to date */
diff --git a/meson.build b/meson.build
index 9ed9a993e2..2c5b53cbe2 100644
--- a/meson.build
+++ b/meson.build
@@ -75,6 +75,12 @@  else
   kvm_targets = []
 endif
 
+kvm_targets_c = ''
+if not get_option('kvm').disabled() and targetos == 'linux'
+  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
+endif
+config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
+
 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
 
 if cpu in ['aarch64']