Message ID | 20210604155312.15902-4-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | arm tcg/kvm refactor and split with kvm only support | expand |
On 04/06/2021 17.51, Alex Bennée wrote: > From: Philippe Mathieu-Daudé <philmd@redhat.com> > > Introduce the qtest_has_accel() method which allows a runtime > query on whether a QEMU instance has an accelerator built-in. > > Reviewed-by: Eric Blake <eblake@redhat.com> > Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Message-Id: <20210505125806.1263441-4-philmd@redhat.com> > --- > tests/qtest/libqos/libqtest.h | 8 ++++++++ > tests/qtest/libqtest.c | 29 +++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h > index a68dcd79d4..d80c618c18 100644 > --- a/tests/qtest/libqos/libqtest.h > +++ b/tests/qtest/libqos/libqtest.h > @@ -763,6 +763,14 @@ void qmp_expect_error_and_unref(QDict *rsp, const char *class); > */ > bool qtest_probe_child(QTestState *s); > > +/** > + * 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_set_expected_status: > * @s: QTestState instance to operate on. > diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c > index 825b13a44c..6bda6e1f33 100644 > --- a/tests/qtest/libqtest.c > +++ b/tests/qtest/libqtest.c > @@ -393,6 +393,35 @@ QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd) > return qts; > } > > +bool qtest_has_accel(const char *accel_name) > +{ > + bool has_accel = false; > + QDict *response; > + QList *accels; > + QListEntry *accel; > + QTestState *qts; > + > + qts = qtest_initf("-accel qtest -machine none"); > + response = qtest_qmp(qts, "{'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 *name = qdict_get_str(accel_dict, "name"); > + > + if (g_str_equal(name, accel_name)) { > + has_accel = true; > + break; > + } > + } > + qobject_unref(response); > + > + qtest_quit(qts); > + > + return has_accel; > +} This spawns a new instance of QEMU each time the function is called - which could slow down testing quite a bit if a test calls this function quite often. Would it be feasible to cache this information, so that you only have to run a new instance of QEMU once? Thomas
On 6/7/21 3:16 PM, Thomas Huth wrote: > On 04/06/2021 17.51, Alex Bennée wrote: >> From: Philippe Mathieu-Daudé <philmd@redhat.com> >> >> Introduce the qtest_has_accel() method which allows a runtime >> query on whether a QEMU instance has an accelerator built-in. >> >> Reviewed-by: Eric Blake <eblake@redhat.com> >> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> >> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> >> Message-Id: <20210505125806.1263441-4-philmd@redhat.com> >> --- >> tests/qtest/libqos/libqtest.h | 8 ++++++++ >> tests/qtest/libqtest.c | 29 +++++++++++++++++++++++++++++ >> 2 files changed, 37 insertions(+) >> +bool qtest_has_accel(const char *accel_name) >> +{ >> + bool has_accel = false; >> + QDict *response; >> + QList *accels; >> + QListEntry *accel; >> + QTestState *qts; >> + >> + qts = qtest_initf("-accel qtest -machine none"); >> + response = qtest_qmp(qts, "{'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 *name = qdict_get_str(accel_dict, "name"); >> + >> + if (g_str_equal(name, accel_name)) { >> + has_accel = true; >> + break; >> + } >> + } >> + qobject_unref(response); >> + >> + qtest_quit(qts); >> + >> + return has_accel; >> +} > > This spawns a new instance of QEMU each time the function is called - > which could slow down testing quite a bit if a test calls this function > quite often. Would it be feasible to cache this information, so that you > only have to run a new instance of QEMU once? Good idea!
diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h index a68dcd79d4..d80c618c18 100644 --- a/tests/qtest/libqos/libqtest.h +++ b/tests/qtest/libqos/libqtest.h @@ -763,6 +763,14 @@ void qmp_expect_error_and_unref(QDict *rsp, const char *class); */ bool qtest_probe_child(QTestState *s); +/** + * 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_set_expected_status: * @s: QTestState instance to operate on. diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c index 825b13a44c..6bda6e1f33 100644 --- a/tests/qtest/libqtest.c +++ b/tests/qtest/libqtest.c @@ -393,6 +393,35 @@ QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd) return qts; } +bool qtest_has_accel(const char *accel_name) +{ + bool has_accel = false; + QDict *response; + QList *accels; + QListEntry *accel; + QTestState *qts; + + qts = qtest_initf("-accel qtest -machine none"); + response = qtest_qmp(qts, "{'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 *name = qdict_get_str(accel_dict, "name"); + + if (g_str_equal(name, accel_name)) { + has_accel = true; + break; + } + } + qobject_unref(response); + + qtest_quit(qts); + + return has_accel; +} + + void qtest_quit(QTestState *s) { qtest_remove_abrt_handler(s);