Now that drivers are using a private domain object state blob,
the virDomainObjFormat/Parse methods are no longer able to
directly serialize all neccessary state to/from XML. It is
thus neccessary to introduce a pair of callbacks fo serializing
private state.
The code for serializing vCPU PIDs and the monitor device
config can now move out of domain_conf.c and into the
qemu_driver.c where they belong.
* src/conf/capabilities.h: Add callbacks for serializing private
state to/from XML
* src/conf/domain_conf.c, src/conf/domain_conf.h: Remove the
monitor, monitor_chr, monitorWatch, nvcpupids and vcpupids
fields from virDomainObjPtr. Remove code that serialized
those fields
* src/libvirt_private.syms: Export virXPathBoolean
* src/qemu/qemu_driver.c: Add callbacks for serializing monitor
and vcpupid data to/from XML
* src/qemu/qemu_monitor.h, src/qemu/qemu_monitor.c: Pass monitor
char device config into qemuMonitorOpen directly.
---
src/conf/capabilities.h | 5 +
src/conf/domain_conf.c | 103 ++--------------------
src/conf/domain_conf.h | 8 +--
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 217 ++++++++++++++++++++++++++++++++++++---------
src/qemu/qemu_monitor.c | 9 +-
src/qemu/qemu_monitor.h | 1 +
7 files changed, 195 insertions(+), 149 deletions(-)
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index 7234cf4..f8cbae6 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -26,6 +26,9 @@
#include "internal.h"
#include "util.h"
+#include "buf.h"
+
+#include <libxml/xpath.h>
typedef struct _virCapsGuestFeature virCapsGuestFeature;
typedef virCapsGuestFeature *virCapsGuestFeaturePtr;
@@ -117,6 +120,8 @@ struct _virCaps {
unsigned int emulatorRequired : 1;
void *(*privateDataAllocFunc)(void);
void (*privateDataFreeFunc)(void *);
+ int (*privateDataXMLFormat)(virBufferPtr, void *);
+ int (*privateDataXMLParse)(xmlXPathContextPtr, void *);
};
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 42820a7..e9f79b7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -615,10 +615,6 @@ static void virDomainObjFree(virDomainObjPtr dom)
virDomainDefFree(dom->def);
virDomainDefFree(dom->newDef);
- virDomainChrDefFree(dom->monitor_chr);
-
- VIR_FREE(dom->vcpupids);
-
if (dom->privateDataFreeFunc)
(dom->privateDataFreeFunc)(dom->privateData);
@@ -675,8 +671,6 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
virDomainObjLock(domain);
domain->state = VIR_DOMAIN_SHUTOFF;
- domain->monitorWatch = -1;
- domain->monitor = -1;
domain->refs = 1;
VIR_DEBUG("obj=%p", domain);
@@ -3389,9 +3383,6 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
xmlNodePtr config;
xmlNodePtr oldnode;
virDomainObjPtr obj;
- char *monitorpath;
- xmlNodePtr *nodes = NULL;
- int n, i;
if (!(obj = virDomainObjNew(conn, caps)))
return NULL;
@@ -3430,69 +3421,13 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
}
obj->pid = (pid_t)val;
- if (VIR_ALLOC(obj->monitor_chr) < 0) {
- virReportOOMError(conn);
- goto error;
- }
-
- if (!(monitorpath =
- virXPathString(conn, "string(./monitor[1]/@path)", ctxt))) {
- virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("no monitor path"));
+ if (caps->privateDataXMLParse &&
+ ((caps->privateDataXMLParse)(ctxt, obj->privateData)) < 0)
goto error;
- }
-
- tmp = virXPathString(conn, "string(./monitor[1]/@type)", ctxt);
- if (tmp)
- obj->monitor_chr->type = virDomainChrTypeFromString(tmp);
- else
- obj->monitor_chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
- VIR_FREE(tmp);
-
- switch (obj->monitor_chr->type) {
- case VIR_DOMAIN_CHR_TYPE_PTY:
- obj->monitor_chr->data.file.path = monitorpath;
- break;
- case VIR_DOMAIN_CHR_TYPE_UNIX:
- obj->monitor_chr->data.nix.path = monitorpath;
- break;
- default:
- VIR_FREE(monitorpath);
- virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unsupported monitor type '%s'"),
- virDomainChrTypeToString(obj->monitor_chr->type));
- break;
- }
-
- n = virXPathNodeSet(conn, "./vcpus/vcpu", ctxt, &nodes);
- if (n < 0)
- goto error;
- if (n) {
- obj->nvcpupids = n;
- if (VIR_REALLOC_N(obj->vcpupids, obj->nvcpupids) < 0) {
- virReportOOMError(conn);
- goto error;
- }
-
- for (i = 0 ; i < n ; i++) {
- char *pidstr = virXMLPropString(nodes[i], "pid");
- if (!pidstr)
- goto error;
-
- if (virStrToLong_i(pidstr, NULL, 10, &(obj->vcpupids[i])) < 0) {
- VIR_FREE(pidstr);
- goto error;
- }
- VIR_FREE(pidstr);
- }
- VIR_FREE(nodes);
- }
return obj;
error:
- VIR_FREE(nodes);
- virDomainChrDefFree(obj->monitor_chr);
virDomainObjUnref(obj);
return NULL;
}
@@ -4858,43 +4793,20 @@ char *virDomainDefFormat(virConnectPtr conn,
}
char *virDomainObjFormat(virConnectPtr conn,
+ virCapsPtr caps,
virDomainObjPtr obj,
int flags)
{
char *config_xml = NULL, *xml = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER;
- const char *monitorpath;
virBufferVSprintf(&buf, "<domstatus state='%s'
pid='%d'>\n",
virDomainStateTypeToString(obj->state),
obj->pid);
- /* obj->monitor_chr is set only for qemu */
- if (obj->monitor_chr) {
- switch (obj->monitor_chr->type) {
- case VIR_DOMAIN_CHR_TYPE_UNIX:
- monitorpath = obj->monitor_chr->data.nix.path;
- break;
- default:
- case VIR_DOMAIN_CHR_TYPE_PTY:
- monitorpath = obj->monitor_chr->data.file.path;
- break;
- }
-
- virBufferEscapeString(&buf, " <monitor path='%s'",
monitorpath);
- virBufferVSprintf(&buf, " type='%s'/>\n",
- virDomainChrTypeToString(obj->monitor_chr->type));
- }
-
-
- if (obj->nvcpupids) {
- int i;
- virBufferAddLit(&buf, " <vcpus>\n");
- for (i = 0 ; i < obj->nvcpupids ; i++) {
- virBufferVSprintf(&buf, " <vcpu pid='%d'/>\n",
obj->vcpupids[i]);
- }
- virBufferAddLit(&buf, " </vcpus>\n");
- }
+ if (caps->privateDataXMLFormat &&
+ ((caps->privateDataXMLFormat)(&buf, obj->privateData)) < 0)
+ goto error;
if (!(config_xml = virDomainDefFormat(conn,
obj->def,
@@ -4994,6 +4906,7 @@ cleanup:
}
int virDomainSaveStatus(virConnectPtr conn,
+ virCapsPtr caps,
const char *statusDir,
virDomainObjPtr obj)
{
@@ -5001,7 +4914,7 @@ int virDomainSaveStatus(virConnectPtr conn,
int ret = -1;
char *xml;
- if (!(xml = virDomainObjFormat(conn, obj, flags)))
+ if (!(xml = virDomainObjFormat(conn, caps, obj, flags)))
goto cleanup;
if (virDomainSaveXML(conn, statusDir, obj->def, xml))
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6201463..ac39dcd 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -644,15 +644,9 @@ struct _virDomainObj {
virMutex lock;
int refs;
- int monitor;
- virDomainChrDefPtr monitor_chr;
- int monitorWatch;
int pid;
int state;
- int nvcpupids;
- int *vcpupids;
-
unsigned int autostart : 1;
unsigned int persistent : 1;
@@ -744,6 +738,7 @@ char *virDomainDefFormat(virConnectPtr conn,
virDomainDefPtr def,
int flags);
char *virDomainObjFormat(virConnectPtr conn,
+ virCapsPtr caps,
virDomainObjPtr obj,
int flags);
@@ -770,6 +765,7 @@ int virDomainSaveConfig(virConnectPtr conn,
const char *configDir,
virDomainDefPtr def);
int virDomainSaveStatus(virConnectPtr conn,
+ virCapsPtr caps,
const char *statusDir,
virDomainObjPtr obj);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ee7f3ed..09628ba 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -583,6 +583,7 @@ virStrerror;
# xml.h
+virXPathBoolean;
virXPathLong;
virXPathNode;
virXPathNodeSet;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b1f5894..468e0ab 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -72,6 +72,7 @@
#include "security/security_driver.h"
#include "cgroup.h"
#include "libvirt_internal.h"
+#include "xml.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -85,6 +86,10 @@ struct _qemuDomainObjPrivate {
* information, not merely actions */
qemuMonitorPtr mon;
+ virDomainChrDefPtr monConfig;
+
+ int nvcpupids;
+ int *vcpupids;
};
static int qemudShutdown(void);
@@ -138,6 +143,9 @@ static void qemuDomainObjPrivateFree(void *data)
{
qemuDomainObjPrivatePtr priv = data;
+ virDomainChrDefFree(priv->monConfig);
+ VIR_FREE(priv->vcpupids);
+
/* This should never be non-NULL if we get here, but just in case... */
if (priv->mon) {
VIR_ERROR0("Unexpected QEMU monitor still active during domain
deletion");
@@ -147,6 +155,116 @@ static void qemuDomainObjPrivateFree(void *data)
}
+static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
+{
+ qemuDomainObjPrivatePtr priv = data;
+ const char *monitorpath;
+
+ /* priv->monitor_chr is set only for qemu */
+ if (priv->monConfig) {
+ switch (priv->monConfig->type) {
+ case VIR_DOMAIN_CHR_TYPE_UNIX:
+ monitorpath = priv->monConfig->data.nix.path;
+ break;
+ default:
+ case VIR_DOMAIN_CHR_TYPE_PTY:
+ monitorpath = priv->monConfig->data.file.path;
+ break;
+ }
+
+ virBufferEscapeString(buf, " <monitor path='%s'",
monitorpath);
+ virBufferVSprintf(buf, " type='%s'/>\n",
+ virDomainChrTypeToString(priv->monConfig->type));
+ }
+
+
+ if (priv->nvcpupids) {
+ int i;
+ virBufferAddLit(buf, " <vcpus>\n");
+ for (i = 0 ; i < priv->nvcpupids ; i++) {
+ virBufferVSprintf(buf, " <vcpu pid='%d'/>\n",
priv->vcpupids[i]);
+ }
+ virBufferAddLit(buf, " </vcpus>\n");
+ }
+
+ return 0;
+}
+
+static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
+{
+ qemuDomainObjPrivatePtr priv = data;
+ char *monitorpath;
+ char *tmp;
+ int n, i;
+ xmlNodePtr *nodes = NULL;
+
+ if (VIR_ALLOC(priv->monConfig) < 0) {
+ virReportOOMError(NULL);
+ goto error;
+ }
+
+ if (!(monitorpath =
+ virXPathString(NULL, "string(./monitor[1]/@path)", ctxt))) {
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("no monitor path"));
+ goto error;
+ }
+
+ tmp = virXPathString(NULL, "string(./monitor[1]/@type)", ctxt);
+ if (tmp)
+ priv->monConfig->type = virDomainChrTypeFromString(tmp);
+ else
+ priv->monConfig->type = VIR_DOMAIN_CHR_TYPE_PTY;
+ VIR_FREE(tmp);
+
+ switch (priv->monConfig->type) {
+ case VIR_DOMAIN_CHR_TYPE_PTY:
+ priv->monConfig->data.file.path = monitorpath;
+ break;
+ case VIR_DOMAIN_CHR_TYPE_UNIX:
+ priv->monConfig->data.nix.path = monitorpath;
+ break;
+ default:
+ VIR_FREE(monitorpath);
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unsupported monitor type '%s'"),
+ virDomainChrTypeToString(priv->monConfig->type));
+ goto error;
+ }
+
+ n = virXPathNodeSet(NULL, "./vcpus/vcpu", ctxt, &nodes);
+ if (n < 0)
+ goto error;
+ if (n) {
+ priv->nvcpupids = n;
+ if (VIR_REALLOC_N(priv->vcpupids, priv->nvcpupids) < 0) {
+ virReportOOMError(NULL);
+ goto error;
+ }
+
+ for (i = 0 ; i < n ; i++) {
+ char *pidstr = virXMLPropString(nodes[i], "pid");
+ if (!pidstr)
+ goto error;
+
+ if (virStrToLong_i(pidstr, NULL, 10, &(priv->vcpupids[i])) < 0) {
+ VIR_FREE(pidstr);
+ goto error;
+ }
+ VIR_FREE(pidstr);
+ }
+ VIR_FREE(nodes);
+ }
+
+ return 0;
+
+error:
+ VIR_FREE(nodes);
+ return -1;
+}
+
+
+
/*
* obj must be locked before calling, qemud_driver must NOT be locked
*
@@ -660,7 +778,9 @@ qemuConnectMonitor(virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
- if ((priv->mon = qemuMonitorOpen(vm, qemuHandleMonitorEOF)) == NULL) {
+ if ((priv->mon = qemuMonitorOpen(vm,
+ priv->monConfig,
+ qemuHandleMonitorEOF)) == NULL) {
VIR_ERROR(_("Failed to connect monitor for %s\n"),
vm->def->name);
return -1;
}
@@ -917,6 +1037,8 @@ qemudStartup(int privileged) {
qemu_driver->caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
qemu_driver->caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
+ qemu_driver->caps->privateDataXMLFormat = qemuDomainObjPrivateXMLFormat;
+ qemu_driver->caps->privateDataXMLParse = qemuDomainObjPrivateXMLParse;
if ((qemu_driver->activePciHostdevs = pciDeviceListNew(NULL)) == NULL)
goto error;
@@ -1334,12 +1456,12 @@ qemuDetectVcpuPIDs(virConnectPtr conn,
qemuDomainObjPrivatePtr priv = vm->privateData;
if (vm->def->virtType != VIR_DOMAIN_VIRT_KVM) {
- vm->nvcpupids = 1;
- if (VIR_ALLOC_N(vm->vcpupids, vm->nvcpupids) < 0) {
+ priv->nvcpupids = 1;
+ if (VIR_ALLOC_N(priv->vcpupids, priv->nvcpupids) < 0) {
virReportOOMError(conn);
return -1;
}
- vm->vcpupids[0] = vm->pid;
+ priv->vcpupids[0] = vm->pid;
return 0;
}
@@ -1364,8 +1486,8 @@ qemuDetectVcpuPIDs(virConnectPtr conn,
return -1;
}
- vm->nvcpupids = ncpupids;
- vm->vcpupids = cpupids;
+ priv->nvcpupids = ncpupids;
+ priv->vcpupids = cpupids;
return 0;
}
@@ -1376,6 +1498,7 @@ qemudInitCpuAffinity(virConnectPtr conn,
virNodeInfo nodeinfo;
unsigned char *cpumap;
int cpumaplen;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
if (nodeGetInfo(conn, &nodeinfo) < 0)
return -1;
@@ -1409,8 +1532,8 @@ qemudInitCpuAffinity(virConnectPtr conn,
/* The XML config only gives a per-VM affinity, so we apply
* the same mapping to all vCPUs */
- for (i = 0 ; i < vm->nvcpupids ; i++) {
- if (virProcessInfoSetAffinity(vm->vcpupids[i],
+ for (i = 0 ; i < priv->nvcpupids ; i++) {
+ if (virProcessInfoSetAffinity(priv->vcpupids[i],
cpumap, cpumaplen, maxcpu) < 0) {
VIR_FREE(cpumap);
return -1;
@@ -2089,15 +2212,15 @@ static int qemudSecurityHook(void *data) {
static int
qemuPrepareMonitorChr(virConnectPtr conn,
struct qemud_driver *driver,
- virDomainChrDefPtr monitor_chr,
+ virDomainChrDefPtr monConfig,
const char *vm)
{
- monitor_chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_MONITOR;
+ monConfig->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_MONITOR;
- monitor_chr->type = VIR_DOMAIN_CHR_TYPE_UNIX;
- monitor_chr->data.nix.listen = 1;
+ monConfig->type = VIR_DOMAIN_CHR_TYPE_UNIX;
+ monConfig->data.nix.listen = 1;
- if (virAsprintf(&monitor_chr->data.nix.path, "%s/%s.monitor",
+ if (virAsprintf(&monConfig->data.nix.path, "%s/%s.monitor",
driver->libDir, vm) < 0) {
virReportOOMError(conn);
return -1;
@@ -2197,12 +2320,12 @@ static int qemudStartVMDaemon(virConnectPtr conn,
if (qemuPrepareHostDevices(conn, driver, vm->def) < 0)
goto cleanup;
- if (VIR_ALLOC(vm->monitor_chr) < 0) {
+ if (VIR_ALLOC(priv->monConfig) < 0) {
virReportOOMError(conn);
goto cleanup;
}
- if (qemuPrepareMonitorChr(conn, driver, vm->monitor_chr, vm->def->name) <
0)
+ if (qemuPrepareMonitorChr(conn, driver, priv->monConfig, vm->def->name) <
0)
goto cleanup;
if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
@@ -2219,7 +2342,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
}
vm->def->id = driver->nextvmid++;
- if (qemudBuildCommandLine(conn, driver, vm->def, vm->monitor_chr,
+ if (qemudBuildCommandLine(conn, driver, vm->def, priv->monConfig,
qemuCmdFlags, &argv, &progenv,
&tapfds, &ntapfds, migrateFrom) < 0)
goto cleanup;
@@ -2334,7 +2457,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
}
- if (virDomainSaveStatus(conn, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(conn, driver->caps, driver->stateDir, vm) < 0)
goto abort;
return 0;
@@ -2408,11 +2531,11 @@ static void qemudShutdownVMDaemon(virConnectPtr conn,
qemuMonitorClose(priv->mon) == 0)
priv->mon = NULL;
- if (vm->monitor_chr) {
- if (vm->monitor_chr->type == VIR_DOMAIN_CHR_TYPE_UNIX)
- unlink(vm->monitor_chr->data.nix.path);
- virDomainChrDefFree(vm->monitor_chr);
- vm->monitor_chr = NULL;
+ if (priv->monConfig) {
+ if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX)
+ unlink(priv->monConfig->data.nix.path);
+ virDomainChrDefFree(priv->monConfig);
+ priv->monConfig = NULL;
}
/* shut it off for sure */
@@ -2450,8 +2573,8 @@ retry:
vm->pid = -1;
vm->def->id = -1;
vm->state = VIR_DOMAIN_SHUTOFF;
- VIR_FREE(vm->vcpupids);
- vm->nvcpupids = 0;
+ VIR_FREE(priv->vcpupids);
+ priv->nvcpupids = 0;
if (vm->newDef) {
virDomainDefFree(vm->def);
@@ -2949,7 +3072,7 @@ static int qemudDomainSuspend(virDomainPtr dom) {
VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
}
- if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(dom->conn, driver->caps, driver->stateDir, vm) <
0)
goto endjob;
ret = 0;
@@ -3008,7 +3131,7 @@ static int qemudDomainResume(virDomainPtr dom) {
VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
}
- if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(dom->conn, driver->caps, driver->stateDir, vm) <
0)
goto endjob;
ret = 0;
@@ -3690,6 +3813,7 @@ qemudDomainPinVcpu(virDomainPtr dom,
int maxcpu, hostcpus;
virNodeInfo nodeinfo;
int ret = -1;
+ qemuDomainObjPrivatePtr priv;
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@@ -3709,10 +3833,12 @@ qemudDomainPinVcpu(virDomainPtr dom,
goto cleanup;
}
- if (vcpu > (vm->nvcpupids-1)) {
+ priv = vm->privateData;
+
+ if (vcpu > (priv->nvcpupids-1)) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
_("vcpu number out of range %d > %d"),
- vcpu, vm->nvcpupids);
+ vcpu, priv->nvcpupids);
goto cleanup;
}
@@ -3724,8 +3850,8 @@ qemudDomainPinVcpu(virDomainPtr dom,
if (maxcpu > hostcpus)
maxcpu = hostcpus;
- if (vm->vcpupids != NULL) {
- if (virProcessInfoSetAffinity(vm->vcpupids[vcpu],
+ if (priv->vcpupids != NULL) {
+ if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
cpumap, maplen, maxcpu) < 0)
goto cleanup;
} else {
@@ -3752,6 +3878,7 @@ qemudDomainGetVcpus(virDomainPtr dom,
virNodeInfo nodeinfo;
int i, v, maxcpu, hostcpus;
int ret = -1;
+ qemuDomainObjPrivatePtr priv;
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@@ -3772,6 +3899,8 @@ qemudDomainGetVcpus(virDomainPtr dom,
goto cleanup;
}
+ priv = vm->privateData;
+
if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
goto cleanup;
@@ -3781,8 +3910,8 @@ qemudDomainGetVcpus(virDomainPtr dom,
maxcpu = hostcpus;
/* Clamp to actual number of vcpus */
- if (maxinfo > vm->nvcpupids)
- maxinfo = vm->nvcpupids;
+ if (maxinfo > priv->nvcpupids)
+ maxinfo = priv->nvcpupids;
if (maxinfo >= 1) {
if (info != NULL) {
@@ -3791,11 +3920,11 @@ qemudDomainGetVcpus(virDomainPtr dom,
info[i].number = i;
info[i].state = VIR_VCPU_RUNNING;
- if (vm->vcpupids != NULL &&
+ if (priv->vcpupids != NULL &&
qemudGetProcessInfo(&(info[i].cpuTime),
&(info[i].cpu),
vm->pid,
- vm->vcpupids[i]) < 0) {
+ priv->vcpupids[i]) < 0) {
virReportSystemError(dom->conn, errno, "%s",
_("cannot get vCPU placement & pCPU
time"));
goto cleanup;
@@ -3805,11 +3934,11 @@ qemudDomainGetVcpus(virDomainPtr dom,
if (cpumaps != NULL) {
memset(cpumaps, 0, maplen * maxinfo);
- if (vm->vcpupids != NULL) {
+ if (priv->vcpupids != NULL) {
for (v = 0 ; v < maxinfo ; v++) {
unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
- if (virProcessInfoGetAffinity(vm->vcpupids[v],
+ if (virProcessInfoGetAffinity(priv->vcpupids[v],
cpumap, maplen, maxcpu) < 0)
goto cleanup;
}
@@ -4098,7 +4227,7 @@ static int qemudDomainRestore(virConnectPtr conn,
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
vm->state = VIR_DOMAIN_RUNNING;
- virDomainSaveStatus(conn, driver->stateDir, vm);
+ virDomainSaveStatus(conn, driver->caps, driver->stateDir, vm);
}
ret = 0;
@@ -4206,7 +4335,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
unsigned int flags ATTRIBUTE_UNUSED) {
struct qemud_driver *driver = conn->privateData;
virDomainDefPtr def = NULL;
- virDomainChrDef monitor_chr;
+ virDomainChrDef monConfig;
const char *emulator;
unsigned int qemuCmdFlags;
struct stat sb;
@@ -4285,11 +4414,11 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
goto cleanup;
}
- if (qemuPrepareMonitorChr(conn, driver, &monitor_chr, def->name) < 0)
+ if (qemuPrepareMonitorChr(conn, driver, &monConfig, def->name) < 0)
goto cleanup;
if (qemudBuildCommandLine(conn, driver, def,
- &monitor_chr, qemuCmdFlags,
+ &monConfig, qemuCmdFlags,
&retargv, &retenv,
NULL, NULL, /* Don't want it to create TAP devices */
NULL) < 0) {
@@ -4834,7 +4963,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
- if (vm->monitor_chr->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
+ if (priv->monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
qemudReportError(conn, dom, NULL, VIR_ERR_NO_SUPPORT,
_("network device type '%s' cannot be attached:
"
"qemu is not using a unix socket monitor"),
@@ -5172,7 +5301,7 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
goto endjob;
}
- if (!ret && virDomainSaveStatus(dom->conn, driver->stateDir, vm) <
0)
+ if (!ret && virDomainSaveStatus(dom->conn, driver->caps,
driver->stateDir, vm) < 0)
ret = -1;
endjob:
@@ -5506,7 +5635,7 @@ static int qemudDomainDetachDevice(virDomainPtr dom,
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("only SCSI or virtio disk device can be
detached dynamically"));
- if (!ret && virDomainSaveStatus(dom->conn, driver->stateDir, vm) <
0)
+ if (!ret && virDomainSaveStatus(dom->conn, driver->caps,
driver->stateDir, vm) < 0)
ret = -1;
endjob:
@@ -7354,7 +7483,7 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
- virDomainSaveStatus(dconn, driver->stateDir, vm);
+ virDomainSaveStatus(dconn, driver->caps, driver->stateDir, vm);
} else {
qemudShutdownVMDaemon (dconn, driver, vm);
event = virDomainEventNewFromObj(vm,
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index a6b445e..6c4dfde 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -533,6 +533,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
qemuMonitorPtr
qemuMonitorOpen(virDomainObjPtr vm,
+ virDomainChrDefPtr config,
qemuMonitorEOFNotify eofCB)
{
qemuMonitorPtr mon;
@@ -562,20 +563,20 @@ qemuMonitorOpen(virDomainObjPtr vm,
qemuMonitorLock(mon);
virDomainObjRef(vm);
- switch (vm->monitor_chr->type) {
+ switch (config->type) {
case VIR_DOMAIN_CHR_TYPE_UNIX:
mon->hasSendFD = 1;
- mon->fd = qemuMonitorOpenUnix(vm->monitor_chr->data.nix.path);
+ mon->fd = qemuMonitorOpenUnix(config->data.nix.path);
break;
case VIR_DOMAIN_CHR_TYPE_PTY:
- mon->fd = qemuMonitorOpenPty(vm->monitor_chr->data.file.path);
+ mon->fd = qemuMonitorOpenPty(config->data.file.path);
break;
default:
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
_("unable to handle monitor type: %s"),
- virDomainChrTypeToString(vm->monitor_chr->type));
+ virDomainChrTypeToString(config->type));
goto cleanup;
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 14198fb..5f1a65d 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -79,6 +79,7 @@ char *qemuMonitorEscapeArg(const char *in);
char *qemuMonitorEscapeShell(const char *in);
qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm,
+ virDomainChrDefPtr config,
qemuMonitorEOFNotify eofCB);
int qemuMonitorClose(qemuMonitorPtr mon);
--
1.6.5.2