libqos: Use explicit QTestState for remaining libqos operations
Drop one more client of global_qtest by teaching all remaining libqos stragglers to pass in an explicit QTestState. Change the setting of global_qtest from being implicit in libqos' call to qtest_start() to instead be explicit in all clients that are still relying on global_qtest. Note that qmp_execute() can be greatly simplified in the process, and that we also get rid of interpolation of a JSON string into a temporary variable when qtest_qmp() can do it more reliably. Signed-off-by: Eric Blake <eblake@redhat.com> Acked-by: Greg Kurz <groug@kaod.org> Reviewed-by: John Snow <jsnow@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
10747e55d5
commit
3d95fb9770
@ -158,6 +158,7 @@ static AHCIQState *ahci_vboot(const char *cli, va_list ap)
|
||||
|
||||
s = g_new0(AHCIQState, 1);
|
||||
s->parent = qtest_pc_vboot(cli, ap);
|
||||
global_qtest = s->parent->qts;
|
||||
alloc_set_flags(s->parent->alloc, ALLOC_LEAK_ASSERT);
|
||||
|
||||
/* Verify that we have an AHCI device present. */
|
||||
|
@ -131,6 +131,7 @@ static void setup_vm_cmd(IVState *s, const char *cmd, bool msix)
|
||||
g_printerr("ivshmem-test tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
global_qtest = s->qs->qts;
|
||||
s->dev = get_device(s->qs->pcibus);
|
||||
|
||||
s->reg_bar = qpci_iomap(s->dev, 0, &barsize);
|
||||
|
@ -25,7 +25,7 @@ QOSState *qtest_pc_boot(const char *cmdline_fmt, ...)
|
||||
qs = qtest_vboot(&qos_ops, cmdline_fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
qtest_irq_intercept_in(global_qtest, "ioapic");
|
||||
qtest_irq_intercept_in(qs->qts, "ioapic");
|
||||
|
||||
return qs;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap)
|
||||
QOSState *qs = g_new0(QOSState, 1);
|
||||
|
||||
cmdline = g_strdup_vprintf(cmdline_fmt, ap);
|
||||
qs->qts = qtest_start(cmdline);
|
||||
qs->qts = qtest_init(cmdline);
|
||||
qs->ops = ops;
|
||||
if (ops) {
|
||||
qs->alloc = ops->init_allocator(qs->qts, ALLOC_NO_FLAGS);
|
||||
@ -81,29 +81,21 @@ void set_context(QOSState *s)
|
||||
global_qtest = s->qts;
|
||||
}
|
||||
|
||||
static QDict *qmp_execute(const char *command)
|
||||
static QDict *qmp_execute(QTestState *qts, const char *command)
|
||||
{
|
||||
char *fmt;
|
||||
QDict *rsp;
|
||||
|
||||
fmt = g_strdup_printf("{ 'execute': '%s' }", command);
|
||||
rsp = qmp(fmt);
|
||||
g_free(fmt);
|
||||
|
||||
return rsp;
|
||||
return qtest_qmp(qts, "{ 'execute': %s }", command);
|
||||
}
|
||||
|
||||
void migrate(QOSState *from, QOSState *to, const char *uri)
|
||||
{
|
||||
const char *st;
|
||||
char *s;
|
||||
QDict *rsp, *sub;
|
||||
bool running;
|
||||
|
||||
set_context(from);
|
||||
|
||||
/* Is the machine currently running? */
|
||||
rsp = qmp_execute("query-status");
|
||||
rsp = qmp_execute(from->qts, "query-status");
|
||||
g_assert(qdict_haskey(rsp, "return"));
|
||||
sub = qdict_get_qdict(rsp, "return");
|
||||
g_assert(qdict_haskey(sub, "running"));
|
||||
@ -111,30 +103,28 @@ void migrate(QOSState *from, QOSState *to, const char *uri)
|
||||
QDECREF(rsp);
|
||||
|
||||
/* Issue the migrate command. */
|
||||
s = g_strdup_printf("{ 'execute': 'migrate',"
|
||||
"'arguments': { 'uri': '%s' } }",
|
||||
uri);
|
||||
rsp = qmp(s);
|
||||
g_free(s);
|
||||
rsp = qtest_qmp(from->qts,
|
||||
"{ 'execute': 'migrate', 'arguments': { 'uri': %s }}",
|
||||
uri);
|
||||
g_assert(qdict_haskey(rsp, "return"));
|
||||
QDECREF(rsp);
|
||||
|
||||
/* Wait for STOP event, but only if we were running: */
|
||||
if (running) {
|
||||
qmp_eventwait("STOP");
|
||||
qtest_qmp_eventwait(from->qts, "STOP");
|
||||
}
|
||||
|
||||
/* If we were running, we can wait for an event. */
|
||||
if (running) {
|
||||
migrate_allocator(from->alloc, to->alloc);
|
||||
set_context(to);
|
||||
qmp_eventwait("RESUME");
|
||||
qtest_qmp_eventwait(to->qts, "RESUME");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Otherwise, we need to wait: poll until migration is completed. */
|
||||
while (1) {
|
||||
rsp = qmp_execute("query-migrate");
|
||||
rsp = qmp_execute(from->qts, "query-migrate");
|
||||
g_assert(qdict_haskey(rsp, "return"));
|
||||
sub = qdict_get_qdict(rsp, "return");
|
||||
g_assert(qdict_haskey(sub, "status"));
|
||||
|
@ -15,13 +15,16 @@
|
||||
|
||||
static QOSState *qmegasas_start(const char *extra_opts)
|
||||
{
|
||||
QOSState *qs;
|
||||
const char *arch = qtest_get_arch();
|
||||
const char *cmd = "-drive id=hd0,if=none,file=null-co://,format=raw "
|
||||
"-device megasas,id=scsi0,addr=04.0 "
|
||||
"-device scsi-hd,bus=scsi0.0,drive=hd0 %s";
|
||||
|
||||
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||
return qtest_pc_boot(cmd, extra_opts ? : "");
|
||||
qs = qtest_pc_boot(cmd, extra_opts ? : "");
|
||||
global_qtest = qs->qts;
|
||||
return qs;
|
||||
}
|
||||
|
||||
g_printerr("virtio-scsi tests are only available on x86 or ppc64\n");
|
||||
|
@ -14,6 +14,7 @@ static void test_rtas_get_time_of_day(void)
|
||||
time_t t1, t2;
|
||||
|
||||
qs = qtest_spapr_boot("-machine pseries");
|
||||
global_qtest = qs->qts;
|
||||
|
||||
t1 = time(NULL);
|
||||
ret = qrtas_get_time_of_day(qs->qts, qs->alloc, &tm, &ns);
|
||||
|
@ -77,6 +77,7 @@ int main(int argc, char **argv)
|
||||
"available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
global_qtest = qs->qts;
|
||||
ret = g_test_run();
|
||||
qtest_shutdown(qs);
|
||||
|
||||
|
@ -44,6 +44,7 @@ static QVirtIO9P *qvirtio_9p_start(const char *driver)
|
||||
g_printerr("virtio-9p tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
global_qtest = v9p->qs->qts;
|
||||
|
||||
return v9p;
|
||||
}
|
||||
|
@ -77,6 +77,7 @@ static QOSState *pci_test_start(void)
|
||||
g_printerr("virtio-blk tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
global_qtest = qs->qts;
|
||||
unlink(tmp_path);
|
||||
g_free(tmp_path);
|
||||
return qs;
|
||||
|
@ -54,18 +54,21 @@ static QVirtioPCIDevice *virtio_net_pci_init(QPCIBus *bus, int slot)
|
||||
|
||||
static QOSState *pci_test_start(int socket)
|
||||
{
|
||||
QOSState *qs;
|
||||
const char *arch = qtest_get_arch();
|
||||
const char *cmd = "-netdev socket,fd=%d,id=hs0 -device "
|
||||
"virtio-net-pci,netdev=hs0";
|
||||
|
||||
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||
return qtest_pc_boot(cmd, socket);
|
||||
qs = qtest_pc_boot(cmd, socket);
|
||||
} else if (strcmp(arch, "ppc64") == 0) {
|
||||
qs = qtest_spapr_boot(cmd, socket);
|
||||
} else {
|
||||
g_printerr("virtio-net tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (strcmp(arch, "ppc64") == 0) {
|
||||
return qtest_spapr_boot(cmd, socket);
|
||||
}
|
||||
g_printerr("virtio-net tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
global_qtest = qs->qts;
|
||||
return qs;
|
||||
}
|
||||
|
||||
static void driver_init(QVirtioDevice *dev)
|
||||
|
@ -34,20 +34,22 @@ typedef struct {
|
||||
|
||||
static QOSState *qvirtio_scsi_start(const char *extra_opts)
|
||||
{
|
||||
QOSState *qs;
|
||||
const char *arch = qtest_get_arch();
|
||||
const char *cmd = "-drive id=drv0,if=none,file=null-co://,format=raw "
|
||||
"-device virtio-scsi-pci,id=vs0 "
|
||||
"-device scsi-hd,bus=vs0.0,drive=drv0 %s";
|
||||
|
||||
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||
return qtest_pc_boot(cmd, extra_opts ? : "");
|
||||
qs = qtest_pc_boot(cmd, extra_opts ? : "");
|
||||
} else if (strcmp(arch, "ppc64") == 0) {
|
||||
qs = qtest_spapr_boot(cmd, extra_opts ? : "");
|
||||
} else {
|
||||
g_printerr("virtio-scsi tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (strcmp(arch, "ppc64") == 0) {
|
||||
return qtest_spapr_boot(cmd, extra_opts ? : "");
|
||||
}
|
||||
|
||||
g_printerr("virtio-scsi tests are only available on x86 or ppc64\n");
|
||||
exit(EXIT_FAILURE);
|
||||
global_qtest = qs->qts;
|
||||
return qs;
|
||||
}
|
||||
|
||||
static void qvirtio_scsi_stop(QOSState *qs)
|
||||
|
Loading…
Reference in New Issue
Block a user