From 136ebc6e3cf6b3100445befd050dad63b82c8f8a Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 21 Sep 2007 21:20:32 +0000 Subject: [PATCH] Detect QEMU flags per VM instead of once for driver as a whole --- ChangeLog | 12 ++++++++-- src/qemu_conf.c | 50 ++++++++++++++++++++++------------------ src/qemu_conf.h | 4 +++- tests/qemuxml2argvtest.c | 8 +++---- tests/qemuxml2xmltest.c | 8 +++---- 5 files changed, 49 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2763f79dc8..18efb21014 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Fri Sep 21 17:14:00 EST 2007 Daniel P. Berrange + + * src/qemu_conf.c, src/qemu_conf.h: Detect QEMU flags per-VM, + not per driver, since different QEMU binaries have their own + requirements. + * tests/qemuxml2xmltest.c, tests/qemuxml2argvtets.c: Update + to changed internal QEMU api/structs. + Fri Sep 21 16:22:00 EST 2007 Daniel P. Berrange * src/remote_internal.c: Add a no_tty flag to stop SSH prompting @@ -6,11 +14,11 @@ Fri Sep 21 16:22:00 EST 2007 Daniel P. Berrange Fri Sep 21 15:06:00 EST 2007 Daniel P. Berrange - * acinclude.m4: Check all compiler flags link successfully + * acinclude.m4: Check all compiler flags link successfully instead of just compiling, to deal with broken debian linker with stack protector * configure.in: Remove redundant -fno-stack-protector workaround - + Fri Sep 21 15:06:00 EST 2007 Daniel P. Berrange * src/qemu_driver.c: Use libxml for parsing & checking URIs diff --git a/src/qemu_conf.c b/src/qemu_conf.c index cc41a57765..b7ccc43803 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -287,7 +287,6 @@ static const char *qemudDefaultBinaryForArch(const char *arch) { /* Find the fully qualified path to the binary for an architecture */ static char *qemudLocateBinaryForArch(virConnectPtr conn, - struct qemud_driver *driver ATTRIBUTE_UNUSED, int virtType, const char *arch) { const char *name; char *path; @@ -408,14 +407,15 @@ static int qemudExtractVersionInfo(const char *qemu, int *version, int *flags) { } int qemudExtractVersion(virConnectPtr conn, - struct qemud_driver *driver) { + struct qemud_driver *driver ATTRIBUTE_UNUSED) { char *binary = NULL; struct stat sb; + int ignored; if (driver->qemuVersion > 0) return 0; - if (!(binary = qemudLocateBinaryForArch(conn, driver, QEMUD_VIRT_QEMU, "i686"))) + if (!(binary = qemudLocateBinaryForArch(conn, QEMUD_VIRT_QEMU, "i686"))) return -1; if (stat(binary, &sb) < 0) { @@ -426,7 +426,7 @@ int qemudExtractVersion(virConnectPtr conn, return -1; } - if (qemudExtractVersionInfo(binary, &driver->qemuVersion, &driver->qemuCmdFlags) < 0) { + if (qemudExtractVersionInfo(binary, &driver->qemuVersion, &ignored) < 0) { free(binary); return -1; } @@ -1199,7 +1199,7 @@ static struct qemud_vm_def *qemudParseXML(virConnectPtr conn, obj = xmlXPathEval(BAD_CAST "string(/domain/devices/emulator[1])", ctxt); if ((obj == NULL) || (obj->type != XPATH_STRING) || (obj->stringval == NULL) || (obj->stringval[0] == 0)) { - char *tmp = qemudLocateBinaryForArch(conn, driver, def->virtType, def->os.arch); + char *tmp = qemudLocateBinaryForArch(conn, def->virtType, def->os.arch); if (!tmp) { goto error; } @@ -1466,8 +1466,23 @@ int qemudBuildCommandLine(virConnectPtr conn, struct utsname ut; int disableKQEMU = 0; - if (qemudExtractVersion(conn, driver) < 0) + /* Make sure the binary we are about to try exec'ing exists. + * Technically we could catch the exec() failure, but that's + * in a sub-process so its hard to feed back a useful error + */ + if (stat(vm->def->os.binary, &sb) < 0) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + "Cannot find QEMU binary %s: %s", vm->def->os.binary, + strerror(errno)); return -1; + } + + if (vm->qemuVersion == 0) { + if (qemudExtractVersionInfo(vm->def->os.binary, + &(vm->qemuVersion), + &(vm->qemuCmdFlags)) < 0) + return -1; + } uname(&ut); @@ -1483,22 +1498,11 @@ int qemudBuildCommandLine(virConnectPtr conn, * 2. Guest is 'qemu' * 3. The qemu binary has the -no-kqemu flag */ - if ((driver->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) && + if ((vm->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) && !strcmp(ut.machine, vm->def->os.arch) && vm->def->virtType == QEMUD_VIRT_QEMU) disableKQEMU = 1; - /* Make sure the binary we are about to try exec'ing exists. - * Technically we could catch the exec() failure, but that's - * in a sub-process so its hard to feed back a useful error - */ - if (stat(vm->def->os.binary, &sb) < 0) { - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, - "Cannot find QEMU binary %s: %s", vm->def->os.binary, - strerror(errno)); - return -1; - } - len = 1 + /* qemu */ 2 + /* machine type */ disableKQEMU + /* Disable kqemu */ @@ -1511,7 +1515,7 @@ int qemudBuildCommandLine(virConnectPtr conn, 2 + /* boot device */ 2 + /* monitor */ (vm->def->localtime ? 1 : 0) + /* localtime */ - (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && + (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && vm->def->noReboot ? 1 : 0) + /* no-reboot */ (vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */ (vm->def->os.kernel[0] ? 2 : 0) + /* kernel */ @@ -1567,7 +1571,7 @@ int qemudBuildCommandLine(virConnectPtr conn, goto no_memory; } - if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && + if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && vm->def->noReboot) { if (!((*argv)[++n] = strdup("-no-reboot"))) goto no_memory; @@ -1748,7 +1752,7 @@ int qemudBuildCommandLine(virConnectPtr conn, if (vm->def->graphicsType == QEMUD_GRAPHICS_VNC) { char vncdisplay[BR_INET_ADDR_MAXLEN+20]; int ret; - if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) + if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) ret = snprintf(vncdisplay, sizeof(vncdisplay), "%s:%d", vm->def->vncListen, vm->def->vncActivePort - 5900); @@ -1885,7 +1889,9 @@ qemudAssignVMDef(virConnectPtr conn, qemudFreeVMDef(vm->newDef); vm->newDef = def; } - + /* Reset version, because the emulator path might have changed */ + vm->qemuVersion = 0; + vm->qemuCmdFlags = 0; return vm; } diff --git a/src/qemu_conf.h b/src/qemu_conf.h index 4a9b1ae415..65443f38e4 100644 --- a/src/qemu_conf.h +++ b/src/qemu_conf.h @@ -211,6 +211,9 @@ struct qemud_vm { int *tapfds; int ntapfds; + int qemuVersion; + int qemuCmdFlags; /* values from enum qemud_cmd_flags */ + char configFile[PATH_MAX]; char autostartLink[PATH_MAX]; char migrateFrom[PATH_MAX]; @@ -272,7 +275,6 @@ struct qemud_network { /* Main driver state */ struct qemud_driver { int qemuVersion; - int qemuCmdFlags; /* values from enum qemud_cmd_flags */ int nactivevms; int ninactivevms; struct qemud_vm *vms; diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 8f0af1205a..f452db69ed 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -37,6 +37,10 @@ static int testCompareXMLToArgvFiles(const char *xml, const char *cmd) { vm.def = vmdef; vm.pid = -1; vm.id = -1; + vm.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1; + vm.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON | + QEMUD_CMD_FLAG_NO_REBOOT; + vmdef->vncActivePort = vmdef->vncPort; if (qemudBuildCommandLine(NULL, &driver, &vm, &argv) < 0) @@ -107,10 +111,6 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } - driver.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1; - driver.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON | - QEMUD_CMD_FLAG_NO_REBOOT; - if (virtTestRun("QEMU XML-2-ARGV minimal", 1, testCompareXMLToArgvHelper, "minimal") < 0) ret = -1; diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 29e57c4c48..59eaf8aebf 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -31,6 +31,10 @@ static int testCompareXMLToXMLFiles(const char *xml) { vm.def = vmdef; vm.pid = -1; vm.id = -1; + vm.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1; + vm.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON | + QEMUD_CMD_FLAG_NO_REBOOT; + vmdef->vncActivePort = vmdef->vncPort; if (!(actual = qemudGenerateXML(NULL, &driver, &vm, vmdef, 0))) @@ -72,10 +76,6 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } - driver.qemuVersion = 0 * 1000 * 100 + (8 * 1000) + 1; - driver.qemuCmdFlags = QEMUD_CMD_FLAG_VNC_COLON | - QEMUD_CMD_FLAG_NO_REBOOT; - if (virtTestRun("QEMU XML-2-ARGV minimal", 1, testCompareXMLToXMLHelper, "minimal") < 0) ret = -1;