* Fixes for the virtio-net-failover test

* Silence warnings in the boot-serial-test
 * Make qtests more flexible wrt missing machines and devices
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmHC7dIRHHRodXRoQHJl
 ZGhhdC5jb20ACgkQLtnXdP5wLbXZWg//agNUxXht1GD8q5GjiLbV9QiVlXUVAFKd
 m+ZaUrs7RWdX31uX+J/Hm3WhJxp442yMQ1CahTSp8rC65hS7+awtFMoeBO2QLw+h
 1XUbIHMf1sFFXwjZlJVHZwRDvcbapBNPA8oVNWnv/TK0EKgQYanKtewKviZShYdn
 kizoFQZ9YFXOAfiMIYg6+zDym1ymCfyYomlRuv1/mitnKS+okhMD+mI1psajZXnX
 hdGGDt/LZ/P8rYeyeCmc9ojb1pzTHAZkXkjQhkW/yVgeormJMr6rABiP5k5iWiD9
 XB+qR5ybkfuTj+NeWusOGDcIYqrDe9En/t7bouOdy4QrA3EobP4+H8DGGo0U70Oc
 hHfZP3vR8RmSMuoizeSBz12QDDWZFZCHEnxzE6N2kj2s/GA8xo761PrH478MxsQB
 TmSJDDn4Zty3685fnoZD5OeCDB/ra5wEwGY9BOh5bdvfjsTG6hCkAqIe0kdUsmQn
 vS0v753LB4ARQf478LEDMLU2njXpgOHD/xYsvtksGC/V8wU6qMEWURIaY0NbEKCN
 PQOHfux8BE9Nw1oSHHGDkNpIGY6ZoDRDD+hRNvCV5WM1L7PzbPv0iQ7Afv8Dsa3p
 gzKDjxg+B2BTNusmyOfuUX24KYvOhAVnZTy54zaZ1VLgn9Fbc8lJLFgzVavf9HjF
 //fxFob4X7c=
 =2vqt
 -----END PGP SIGNATURE-----

Merge tag 'pull-request-2021-12-22' of https://gitlab.com/thuth/qemu into staging

* Fixes for the virtio-net-failover test
* Silence warnings in the boot-serial-test
* Make qtests more flexible wrt missing machines and devices

# gpg: Signature made Wed 22 Dec 2021 01:20:18 AM PST
# gpg:                using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg:                issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [unknown]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [unknown]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3  EAB9 2ED9 D774 FE70 2DB5

* tag 'pull-request-2021-12-22' of https://gitlab.com/thuth/qemu:
  tests/qtest/virtio-net-failover: Use g_file_open_tmp() to create temporary file
  tests/qtest/boot-order-test: Check whether machines are available
  tests/qtest/cdrom-test: Check whether devices are available before using them
  tests/qtest: Improve endianness-test to work with missing machines and devices
  tests/qtest: Add a function that checks whether a device is available
  MAINTAINERS: Update COLO Proxy section
  tests/qtest: Make the filter tests independent from a specific NIC
  tests/qtest/boot-serial-test: Silence the warning about deprecated sga device
  failover: Silence warning messages during qtest

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-12-22 07:23:05 -08:00
commit 8d29feca83
14 changed files with 158 additions and 72 deletions

View File

@ -2987,6 +2987,7 @@ F: docs/colo-proxy.txt
F: net/colo*
F: net/filter-rewriter.c
F: net/filter-mirror.c
F: tests/qtest/test-filter*
Record/replay
M: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>

View File

@ -44,6 +44,7 @@
#include "hw/pci/pci.h"
#include "net_rx_pkt.h"
#include "hw/virtio/vhost.h"
#include "sysemu/qtest.h"
#define VIRTIO_NET_VM_VERSION 11
@ -926,7 +927,11 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features)
qatomic_set(&n->failover_primary_hidden, false);
failover_add_primary(n, &err);
if (err) {
warn_report_err(err);
if (!qtest_enabled()) {
warn_report_err(err);
} else {
error_free(err);
}
}
}
}

View File

@ -60,6 +60,7 @@
#include "qemu/yank.h"
#include "sysemu/cpus.h"
#include "yank_functions.h"
#include "sysemu/qtest.h"
#define MAX_THROTTLE (128 << 20) /* Migration transfer speed throttling */
@ -3766,7 +3767,8 @@ static void qemu_savevm_wait_unplug(MigrationState *s, int old_state,
while (timeout-- && qemu_savevm_state_guest_unplug_pending()) {
qemu_sem_timedwait(&s->wait_unplug_sem, 250);
}
if (qemu_savevm_state_guest_unplug_pending()) {
if (qemu_savevm_state_guest_unplug_pending() &&
!qtest_enabled()) {
warn_report("migration: partially unplugged device on "
"failure");
}

View File

@ -34,6 +34,11 @@ static void test_a_boot_order(const char *machine,
uint64_t actual;
QTestState *qts;
if (machine && !qtest_has_machine(machine)) {
g_test_skip("Machine is not available");
return;
}
qts = qtest_initf("-nodefaults%s%s %s", machine ? " -M " : "",
machine ?: "", test_args);
actual = read_boot_order(qts);

View File

@ -157,11 +157,11 @@ static testdef_t tests[] = {
{ "ppc64", "powernv8", "", "OPAL" },
{ "ppc64", "powernv9", "", "OPAL" },
{ "ppc64", "sam460ex", "-device e1000", "8086 100e" },
{ "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" },
{ "i386", "pc", "-device sga", "SGABIOS" },
{ "i386", "q35", "-device sga", "SGABIOS" },
{ "x86_64", "isapc", "-cpu qemu32 -device sga", "SGABIOS" },
{ "x86_64", "q35", "-device sga", "SGABIOS" },
{ "i386", "isapc", "-cpu qemu32 -M graphics=off", "SeaBIOS" },
{ "i386", "pc", "-M graphics=off", "SeaBIOS" },
{ "i386", "q35", "-M graphics=off", "SeaBIOS" },
{ "x86_64", "isapc", "-cpu qemu32 -M graphics=off", "SeaBIOS" },
{ "x86_64", "q35", "-M graphics=off", "SeaBIOS" },
{ "sparc", "LX", "", "TMS390S10" },
{ "sparc", "SS-4", "", "MB86904" },
{ "sparc", "SS-600MP", "", "TMS390Z55" },

View File

@ -142,21 +142,36 @@ static void add_x86_tests(void)
qtest_add_data_func("cdrom/boot/isapc", "-M isapc "
"-drive if=ide,media=cdrom,file=", test_cdboot);
}
qtest_add_data_func("cdrom/boot/am53c974",
"-device am53c974 -device scsi-cd,drive=cd1 "
"-drive if=none,id=cd1,format=raw,file=", test_cdboot);
qtest_add_data_func("cdrom/boot/dc390",
"-device dc390 -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=", test_cdboot);
qtest_add_data_func("cdrom/boot/lsi53c895a",
"-device lsi53c895a -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=", test_cdboot);
qtest_add_data_func("cdrom/boot/megasas", "-M q35 "
"-device megasas -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=", test_cdboot);
qtest_add_data_func("cdrom/boot/megasas-gen2", "-M q35 "
"-device megasas-gen2 -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=", test_cdboot);
if (qtest_has_device("am53c974")) {
qtest_add_data_func("cdrom/boot/am53c974",
"-device am53c974 -device scsi-cd,drive=cd1 "
"-drive if=none,id=cd1,format=raw,file=",
test_cdboot);
}
if (qtest_has_device("dc390")) {
qtest_add_data_func("cdrom/boot/dc390",
"-device dc390 -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=",
test_cdboot);
}
if (qtest_has_device("lsi53c895a")) {
qtest_add_data_func("cdrom/boot/lsi53c895a",
"-device lsi53c895a -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=",
test_cdboot);
}
if (qtest_has_device("megasas")) {
qtest_add_data_func("cdrom/boot/megasas", "-M q35 "
"-device megasas -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=",
test_cdboot);
}
if (qtest_has_device("megasas-gen2")) {
qtest_add_data_func("cdrom/boot/megasas-gen2", "-M q35 "
"-device megasas-gen2 -device scsi-cd,drive=cd1 "
"-blockdev file,node-name=cd1,filename=",
test_cdboot);
}
}
static void add_s390x_tests(void)
@ -171,12 +186,15 @@ static void add_s390x_tests(void)
"-drive driver=null-co,read-zeroes=on,if=none,id=d1 "
"-device virtio-blk,drive=d2,bootindex=1 "
"-drive if=none,id=d2,media=cdrom,file=", test_cdboot);
qtest_add_data_func("cdrom/boot/without-bootindex",
"-device virtio-scsi -device virtio-serial "
"-device x-terminal3270 -device virtio-blk,drive=d1 "
"-drive driver=null-co,read-zeroes=on,if=none,id=d1 "
"-device virtio-blk,drive=d2 "
"-drive if=none,id=d2,media=cdrom,file=", test_cdboot);
if (qtest_has_device("x-terminal3270")) {
qtest_add_data_func("cdrom/boot/without-bootindex",
"-device virtio-scsi -device virtio-serial "
"-device x-terminal3270 -device virtio-blk,drive=d1 "
"-drive driver=null-co,read-zeroes=on,if=none,id=d1 "
"-device virtio-blk,drive=d2 "
"-drive if=none,id=d2,media=cdrom,file=",
test_cdboot);
}
}
int main(int argc, char **argv)

View File

@ -281,7 +281,10 @@ int main(int argc, char **argv)
for (i = 0; test_cases[i].arch; i++) {
gchar *path;
if (strcmp(test_cases[i].arch, arch) != 0) {
if (!g_str_equal(test_cases[i].arch, arch) ||
!qtest_has_machine(test_cases[i].machine) ||
(test_cases[i].superio && !qtest_has_device(test_cases[i].superio))) {
continue;
}
path = g_strdup_printf("endianness/%s",

View File

@ -718,6 +718,14 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
*/
bool qtest_has_machine(const char *machine);
/**
* qtest_has_device:
* @device: The device to look for
*
* Returns: true if the device is available in the target binary.
*/
bool qtest_has_device(const char *device);
/**
* qtest_qmp_device_add_qdict:
* @qts: QTestState instance to operate on

View File

@ -1418,6 +1418,50 @@ bool qtest_has_machine(const char *machine)
return false;
}
bool qtest_has_device(const char *device)
{
static QList *list;
const QListEntry *p;
QObject *qobj;
QString *qstr;
QDict *devinfo;
int idx;
if (!list) {
QDict *resp;
QDict *args;
QTestState *qts = qtest_init("-machine none");
args = qdict_new();
qdict_put_bool(args, "abstract", false);
qdict_put_str(args, "implements", "device");
resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }",
args);
g_assert(qdict_haskey(resp, "return"));
list = qdict_get_qlist(resp, "return");
qobject_ref(list);
qobject_unref(resp);
qtest_quit(qts);
}
for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
devinfo = qobject_to(QDict, qlist_entry_obj(p));
g_assert(devinfo);
qobj = qdict_get(devinfo, "name");
g_assert(qobj);
qstr = qobject_to(QString, qobj);
g_assert(qstr);
if (g_str_equal(qstring_get_str(qstr), device)) {
return true;
}
}
return false;
}
/*
* Generic hot-plugging test via the device_add QMP commands.
*/

View File

@ -47,7 +47,6 @@ qtests_i386 = \
(have_tools ? ['ahci-test'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
(config_all_devices.has_key('CONFIG_RTL8139_PCI') ? ['test-filter-redirector'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_IPMI_KCS') ? ['ipmi-kcs-test'] : []) + \
(config_host.has_key('CONFIG_LINUX') and \
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
@ -90,7 +89,9 @@ qtests_i386 = \
'vmgenid-test',
'migration-test',
'test-x86-cpuid-compat',
'numa-test']
'numa-test',
'test-filter-redirector'
]
if dbus_display
qtests_i386 += ['dbus-display-test']
@ -113,31 +114,49 @@ endif
qtests_x86_64 = qtests_i386
qtests_alpha = [ 'boot-serial-test' ] + \
qtests_alpha = ['boot-serial-test'] + \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_avr = [ 'boot-serial-test' ]
qtests_hppa = [ 'boot-serial-test' ] + \
qtests_hppa = ['boot-serial-test'] + \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_m68k = [ 'boot-serial-test' ]
qtests_microblaze = [ 'boot-serial-test' ]
qtests_m68k = ['boot-serial-test'] + \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : [])
qtests_microblaze = ['boot-serial-test'] + \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : [])
qtests_microblazeel = qtests_microblaze
qtests_mips = \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_mips64 = \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_mips64el = \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_ppc = \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \
['boot-order-test', 'prom-env-test', 'boot-serial-test'] \
@ -147,19 +166,22 @@ qtests_ppc64 = \
(config_all_devices.has_key('CONFIG_PSERIES') ? ['device-plug-test'] : []) + \
(config_all_devices.has_key('CONFIG_POWERNV') ? ['pnv-xscom-test'] : []) + \
(config_all_devices.has_key('CONFIG_PSERIES') ? ['rtas-test'] : []) + \
(slirp.found() ? ['pxe-test', 'test-netfilter'] : []) + \
(slirp.found() ? ['pxe-test'] : []) + \
(config_all_devices.has_key('CONFIG_USB_UHCI') ? ['usb-hcd-uhci-test'] : []) + \
(config_all_devices.has_key('CONFIG_USB_XHCI_NEC') ? ['usb-hcd-xhci-test'] : []) + \
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
qtests_pci + ['migration-test', 'numa-test', 'cpu-plug-test', 'drive_del-test']
qtests_sh4 = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
qtests_sh4eb = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test']
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \
['test-filter-mirror', 'test-filter-redirector'] + \
(slirp.found() ? ['test-netfilter'] : [])
qtests_sparc64 = \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(slirp.found() ? ['test-netfilter'] : []) + \
['test-filter-mirror', 'test-filter-redirector'] + \
['prom-env-test', 'boot-serial-test']
qtests_npcm7xx = \

View File

@ -28,13 +28,8 @@ static void test_mirror(void)
char *recv_buf;
uint32_t size = sizeof(send_buf);
size = htonl(size);
const char *devstr = "e1000";
QTestState *qts;
if (g_str_equal(qtest_get_arch(), "s390x")) {
devstr = "virtio-net-ccw";
}
ret = socketpair(PF_UNIX, SOCK_STREAM, 0, send_sock);
g_assert_cmpint(ret, !=, -1);
@ -42,11 +37,10 @@ static void test_mirror(void)
g_assert_cmpint(ret, !=, -1);
qts = qtest_initf(
"-netdev socket,id=qtest-bn0,fd=%d "
"-device %s,netdev=qtest-bn0,id=qtest-e0 "
"-nic socket,id=qtest-bn0,fd=%d "
"-chardev socket,id=mirror0,fd=%d "
"-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 "
, send_sock[1], devstr, recv_sock[1]);
, send_sock[1], recv_sock[1]);
struct iovec iov[] = {
{

View File

@ -62,16 +62,6 @@
/* TODO actually test the results and get rid of this */
#define qmp_discard_response(qs, ...) qobject_unref(qtest_qmp(qs, __VA_ARGS__))
static const char *get_devstr(void)
{
if (g_str_equal(qtest_get_arch(), "s390x")) {
return "virtio-net-ccw";
}
return "rtl8139";
}
static void test_redirector_tx(void)
{
int backend_sock[2], recv_sock;
@ -93,8 +83,7 @@ static void test_redirector_tx(void)
g_assert_cmpint(ret, !=, -1);
qts = qtest_initf(
"-netdev socket,id=qtest-bn0,fd=%d "
"-device %s,netdev=qtest-bn0,id=qtest-e0 "
"-nic socket,id=qtest-bn0,fd=%d "
"-chardev socket,id=redirector0,path=%s,server=on,wait=off "
"-chardev socket,id=redirector1,path=%s,server=on,wait=off "
"-chardev socket,id=redirector2,path=%s "
@ -103,7 +92,7 @@ static void test_redirector_tx(void)
"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,"
"queue=tx,indev=redirector2 "
"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,"
"queue=tx,outdev=redirector1 ", backend_sock[1], get_devstr(),
"queue=tx,outdev=redirector1 ", backend_sock[1],
sock_path0, sock_path1, sock_path0);
recv_sock = unix_connect(sock_path1, NULL);
@ -163,8 +152,7 @@ static void test_redirector_rx(void)
g_assert_cmpint(ret, !=, -1);
qts = qtest_initf(
"-netdev socket,id=qtest-bn0,fd=%d "
"-device %s,netdev=qtest-bn0,id=qtest-e0 "
"-nic socket,id=qtest-bn0,fd=%d "
"-chardev socket,id=redirector0,path=%s,server=on,wait=off "
"-chardev socket,id=redirector1,path=%s,server=on,wait=off "
"-chardev socket,id=redirector2,path=%s "
@ -173,7 +161,7 @@ static void test_redirector_rx(void)
"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,"
"queue=rx,outdev=redirector2 "
"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,"
"queue=rx,indev=redirector1 ", backend_sock[1], get_devstr(),
"queue=rx,indev=redirector1 ", backend_sock[1],
sock_path0, sock_path1, sock_path0);
struct iovec iov[] = {

View File

@ -178,11 +178,6 @@ int main(int argc, char **argv)
{
int ret;
char *args;
const char *devstr = "e1000";
if (g_str_equal(qtest_get_arch(), "s390x")) {
devstr = "virtio-net-ccw";
}
g_test_init(&argc, &argv, NULL);
qtest_add_func("/netfilter/addremove_one", add_one_netfilter);
@ -192,8 +187,7 @@ int main(int argc, char **argv)
qtest_add_func("/netfilter/remove_netdev_multi",
remove_netdev_with_multi_netfilter);
args = g_strdup_printf("-netdev user,id=qtest-bn0 "
"-device %s,netdev=qtest-bn0", devstr);
args = g_strdup_printf("-nic user,id=qtest-bn0");
qtest_start(args);
ret = g_test_run();

View File

@ -1306,13 +1306,15 @@ static void test_multi_in(gconstpointer opaque)
int main(int argc, char **argv)
{
const gchar *tmpdir = g_get_tmp_dir();
gchar *tmpfile = g_strdup_printf("%s/failover_test_migrate-%u-%u",
tmpdir, getpid(), g_test_rand_int());
gchar *tmpfile;
int ret;
g_test_init(&argc, &argv, NULL);
ret = g_file_open_tmp("failover_test_migrate-XXXXXX", &tmpfile, NULL);
g_assert_true(ret >= 0);
close(ret);
qtest_add_func("failover-virtio-net/params/error/id", test_error_id);
qtest_add_func("failover-virtio-net/params/error/pcie", test_error_pcie);
qtest_add_func("failover-virtio-net/params/on", test_on);