[PATCH 2/6] tests/qtest: Add qtest_probe_accel() method

Philippe Mathieu-Daudé posted 6 patches 4 years, 11 months ago
There is a newer version of this series
[PATCH 2/6] tests/qtest: Add qtest_probe_accel() method
Posted by Philippe Mathieu-Daudé 4 years, 11 months ago
Introduce the qtest_probe_accel() method which allows
to query at runtime if a QEMU instance has an accelerator
built-in.

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 tests/qtest/libqos/libqtest.h |  9 +++++++++
 tests/qtest/libqtest.c        | 24 ++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index a68dcd79d44..ebedb82ec98 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -763,6 +763,15 @@ void qmp_expect_error_and_unref(QDict *rsp, const char *class);
  */
 bool qtest_probe_child(QTestState *s);
 
+/**
+ * qtest_probe_accel:
+ * @s: QTestState instance to operate on.
+ * @name: Accelerator name to check for.
+ *
+ * Returns: true if the accelerator is built in.
+ */
+bool qtest_probe_accel(QTestState *s, const char *name);
+
 /**
  * qtest_set_expected_status:
  * @s: QTestState instance to operate on.
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 71e359efcd3..57e7e55b9cc 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -872,6 +872,30 @@ void qtest_qmp_eventwait(QTestState *s, const char *event)
     qobject_unref(response);
 }
 
+bool qtest_probe_accel(QTestState *s, const char *name)
+{
+    bool has_accel = false;
+    QDict *response;
+    QList *accels;
+    QListEntry *accel;
+
+    response = qtest_qmp(s, "{'execute': 'query-accels'}");
+    accels = qdict_get_qlist(response, "return");
+
+    QLIST_FOREACH_ENTRY(accels, accel) {
+        QDict *accel_dict = qobject_to(QDict, qlist_entry_obj(accel));
+        const char *accel_name = qdict_get_str(accel_dict, "name");
+
+        if (!strcmp(name, accel_name)) {
+            has_accel = true;
+            break;
+        }
+    }
+    qobject_unref(response);
+
+    return has_accel;
+}
+
 char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
 {
     char *cmd;
-- 
2.26.2


Re: [PATCH 2/6] tests/qtest: Add qtest_probe_accel() method
Posted by Thomas Huth 4 years, 11 months ago
On 12/03/2021 00.11, Philippe Mathieu-Daudé wrote:
> Introduce the qtest_probe_accel() method which allows
> to query at runtime if a QEMU instance has an accelerator
> built-in.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
>   tests/qtest/libqos/libqtest.h |  9 +++++++++
>   tests/qtest/libqtest.c        | 24 ++++++++++++++++++++++++
>   2 files changed, 33 insertions(+)
> 
> diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> index a68dcd79d44..ebedb82ec98 100644
> --- a/tests/qtest/libqos/libqtest.h
> +++ b/tests/qtest/libqos/libqtest.h
> @@ -763,6 +763,15 @@ void qmp_expect_error_and_unref(QDict *rsp, const char *class);
>    */
>   bool qtest_probe_child(QTestState *s);
>   
> +/**
> + * qtest_probe_accel:
> + * @s: QTestState instance to operate on.
> + * @name: Accelerator name to check for.
> + *
> + * Returns: true if the accelerator is built in.
> + */
> +bool qtest_probe_accel(QTestState *s, const char *name);

Maybe better qtest_has_accel() ? ... that makes it clear right from the 
start what the return type is about.

>   /**
>    * qtest_set_expected_status:
>    * @s: QTestState instance to operate on.
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 71e359efcd3..57e7e55b9cc 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -872,6 +872,30 @@ void qtest_qmp_eventwait(QTestState *s, const char *event)
>       qobject_unref(response);
>   }
>   
> +bool qtest_probe_accel(QTestState *s, const char *name)
> +{
> +    bool has_accel = false;
> +    QDict *response;
> +    QList *accels;
> +    QListEntry *accel;
> +
> +    response = qtest_qmp(s, "{'execute': 'query-accels'}");
> +    accels = qdict_get_qlist(response, "return");
> +
> +    QLIST_FOREACH_ENTRY(accels, accel) {
> +        QDict *accel_dict = qobject_to(QDict, qlist_entry_obj(accel));
> +        const char *accel_name = qdict_get_str(accel_dict, "name");
> +
> +        if (!strcmp(name, accel_name)) {

I'd prefer g_str_equal() ... that's easier to read.

> +            has_accel = true;
> +            break;
> +        }
> +    }
> +    qobject_unref(response);
> +
> +    return has_accel;
> +}
> +
>   char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
>   {
>       char *cmd;
> 

  Thomas


Re: [PATCH 2/6] tests/qtest: Add qtest_probe_accel() method
Posted by Andrew Jones 4 years, 11 months ago
On Fri, Mar 12, 2021 at 09:16:01AM +0100, Thomas Huth wrote:
> On 12/03/2021 00.11, Philippe Mathieu-Daudé wrote:
> > Introduce the qtest_probe_accel() method which allows
> > to query at runtime if a QEMU instance has an accelerator
> > built-in.
> > 
> > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > ---
> >   tests/qtest/libqos/libqtest.h |  9 +++++++++
> >   tests/qtest/libqtest.c        | 24 ++++++++++++++++++++++++
> >   2 files changed, 33 insertions(+)
> > 
> > diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> > index a68dcd79d44..ebedb82ec98 100644
> > --- a/tests/qtest/libqos/libqtest.h
> > +++ b/tests/qtest/libqos/libqtest.h
> > @@ -763,6 +763,15 @@ void qmp_expect_error_and_unref(QDict *rsp, const char *class);
> >    */
> >   bool qtest_probe_child(QTestState *s);
> > +/**
> > + * qtest_probe_accel:
> > + * @s: QTestState instance to operate on.
> > + * @name: Accelerator name to check for.
> > + *
> > + * Returns: true if the accelerator is built in.
> > + */
> > +bool qtest_probe_accel(QTestState *s, const char *name);
> 
> Maybe better qtest_has_accel() ? ... that makes it clear right from the
> start what the return type is about.

It looks like qtest_probe_accel() is getting used in contexts in the
following patches that would be better suited with an "enabled" API

 qtest_accel_enabled(s, accel_name)

So, I think we should create that interface. Do we also need a
qtest_has_accel()? Does it matter which ones have been compiled
in when they're not active?

(Hmm, 'active' might be a better verb yet. qtest_accel_active() ?)

Thanks,
drew