From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52025) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YXtRz-0002KV-8c for qemu-devel@nongnu.org; Tue, 17 Mar 2015 11:30:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YXtRr-0003ie-Br for qemu-devel@nongnu.org; Tue, 17 Mar 2015 11:30:35 -0400 Received: from cantor2.suse.de ([195.135.220.15]:49763 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YXtRr-0003iA-2t for qemu-devel@nongnu.org; Tue, 17 Mar 2015 11:30:27 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Tue, 17 Mar 2015 16:30:22 +0100 Message-Id: <1426606224-25380-3-git-send-email-afaerber@suse.de> In-Reply-To: <1426606224-25380-1-git-send-email-afaerber@suse.de> References: <1426606224-25380-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 2/3] tests: Add PC CPU test List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , Eduardo Habkost Test non-default -smp core and thread counts and a non-default CPU model on all PC machines except for isapc. Note that not all historic versions actually supported this particular configuration, ignored for simplicity. For machines pc-*-1.5+ test QMP cpu-add with monotonically increasing ID, and test for graceful failure otherwise. Cc: Eduardo Habkost Signed-off-by: Andreas F=C3=A4rber --- tests/Makefile | 2 + tests/pc-cpu-test.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++= ++++++ 2 files changed, 149 insertions(+) create mode 100644 tests/pc-cpu-test.c diff --git a/tests/Makefile b/tests/Makefile index 1ef95c9..55aa745 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -173,6 +173,7 @@ gcov-files-i386-y +=3D hw/usb/dev-hid.c gcov-files-i386-y +=3D hw/usb/dev-storage.c check-qtest-i386-y +=3D tests/usb-hcd-xhci-test$(EXESUF) gcov-files-i386-y +=3D hw/usb/hcd-xhci.c +check-qtest-i386-y +=3D tests/pc-cpu-test$(EXESUF) check-qtest-i386-$(CONFIG_LINUX) +=3D tests/vhost-user-test$(EXESUF) check-qtest-x86_64-y =3D $(check-qtest-i386-y) gcov-files-i386-y +=3D i386-softmmu/hw/timer/mc146818rtc.c @@ -363,6 +364,7 @@ tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-= test.o $(libqos-usb-obj-y) tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb= -obj-y) tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb= -obj-y) tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb= -obj-y) +tests/pc-cpu-test$(EXESUF): tests/pc-cpu-test.o tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu= -timer.o $(qtest-obj-y) tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket= _scm_helper.o tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libq= emustub.a diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c new file mode 100644 index 0000000..a0122d3 --- /dev/null +++ b/tests/pc-cpu-test.c @@ -0,0 +1,147 @@ +/* + * QTest testcase for PC CPUs + * + * Copyright (c) 2015 SUSE Linux GmbH + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#include +#include + +#include "qemu-common.h" +#include "libqtest.h" +#include "qemu/osdep.h" +#include "qapi/qmp/types.h" + +struct PCTestData { + const char *machine; + const char *cpu_model; + unsigned sockets; + unsigned cores; + unsigned threads; + unsigned maxcpus; +}; +typedef struct PCTestData PCTestData; + +static void test_pc_with_cpu_add(gconstpointer data) +{ + const PCTestData *s =3D data; + char *args; + QDict *response; + unsigned int i; + + args =3D g_strdup_printf("-machine %s -cpu %s " + "-smp sockets=3D%u,cores=3D%u,threads=3D%u,ma= xcpus=3D%u", + s->machine, s->cpu_model, + s->sockets, s->cores, s->threads, s->maxcpus)= ; + qtest_start(args); + + for (i =3D s->sockets * s->cores * s->threads; i < s->maxcpus; i++) = { + response =3D qmp("{ 'execute': 'cpu-add'," + " 'arguments': { 'id': %d } }", i); + g_assert(response); + g_assert(!qdict_haskey(response, "error")); + QDECREF(response); + } + + qtest_end(); + g_free(args); +} + +static void test_pc_without_cpu_add(gconstpointer data) +{ + const PCTestData *s =3D data; + char *args; + QDict *response; + + args =3D g_strdup_printf("-machine %s -cpu %s " + "-smp sockets=3D%u,cores=3D%u,threads=3D%u,ma= xcpus=3D%u", + s->machine, s->cpu_model, + s->sockets, s->cores, s->threads, s->maxcpus)= ; + qtest_start(args); + + response =3D qmp("{ 'execute': 'cpu-add'," + " 'arguments': { 'id': %d } }", + s->sockets * s->cores * s->threads); + g_assert(response); + g_assert(qdict_haskey(response, "error")); + QDECREF(response); + + qtest_end(); + g_free(args); +} + +static void add_pc_test_cases(void) +{ + const char *arch =3D qtest_get_arch(); + QDict *response, *minfo; + QList *list; + const QListEntry *p; + QObject *qobj; + QString *qstr; + const char *mname, *path; + PCTestData *data; + + qtest_start("-machine none"); + response =3D qmp("{ 'execute': 'query-machines' }"); + g_assert(response); + list =3D qdict_get_qlist(response, "return"); + g_assert(list); + + for (p =3D qlist_first(list); p; p =3D qlist_next(p)) { + minfo =3D qobject_to_qdict(qlist_entry_obj(p)); + g_assert(minfo); + qobj =3D qdict_get(minfo, "name"); + g_assert(qobj); + qstr =3D qobject_to_qstring(qobj); + g_assert(qstr); + mname =3D qstring_get_str(qstr); + if (!g_str_has_prefix(mname, "pc-")) { + continue; + } + data =3D g_malloc(sizeof(PCTestData)); + data->machine =3D mname; + data->cpu_model =3D "Haswell"; /* 1.3+ theoretically */ + data->sockets =3D 1; + data->cores =3D 3; + data->threads =3D 2; + data->maxcpus =3D data->sockets * data->cores * data->threads * = 2; + if (g_str_has_suffix(mname, "-1.4") || + (strcmp(mname, "pc-1.3") =3D=3D 0) || + (strcmp(mname, "pc-1.2") =3D=3D 0) || + (strcmp(mname, "pc-1.1") =3D=3D 0) || + (strcmp(mname, "pc-1.0") =3D=3D 0) || + (strcmp(mname, "pc-0.15") =3D=3D 0) || + (strcmp(mname, "pc-0.14") =3D=3D 0) || + (strcmp(mname, "pc-0.13") =3D=3D 0) || + (strcmp(mname, "pc-0.12") =3D=3D 0) || + (strcmp(mname, "pc-0.11") =3D=3D 0) || + (strcmp(mname, "pc-0.10") =3D=3D 0)) { + path =3D g_strdup_printf("/%s/cpu/%s/init/%ux%ux%u&maxcpus=3D= %u", + arch, mname, data->sockets, data->cor= es, + data->threads, data->maxcpus); + g_test_add_data_func(path, data, test_pc_without_cpu_add); + } else { + path =3D g_strdup_printf("/%s/cpu/%s/add/%ux%ux%u&maxcpus=3D= %u", + arch, mname, data->sockets, data->cor= es, + data->threads, data->maxcpus); + g_test_add_data_func(path, data, test_pc_with_cpu_add); + } + } + qtest_end(); +} + +int main(int argc, char **argv) +{ + const char *arch =3D qtest_get_arch(); + + g_test_init(&argc, &argv, NULL); + + if (strcmp(arch, "i386") =3D=3D 0 || strcmp(arch, "x86_64") =3D=3D 0= ) { + add_pc_test_cases(); + } + + return g_test_run(); +} --=20 2.1.4