mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-22 14:09:22 +00:00
qemu: Implement virDomainGetControlInfo
This commit is contained in:
parent
6301ce5235
commit
559fcf8a24
@ -609,6 +609,7 @@ void qemuDomainObjEnterMonitor(virDomainObjPtr obj)
|
|||||||
|
|
||||||
qemuMonitorLock(priv->mon);
|
qemuMonitorLock(priv->mon);
|
||||||
qemuMonitorRef(priv->mon);
|
qemuMonitorRef(priv->mon);
|
||||||
|
virTimeMs(&priv->monStart);
|
||||||
virDomainObjUnlock(obj);
|
virDomainObjUnlock(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,6 +630,7 @@ void qemuDomainObjExitMonitor(virDomainObjPtr obj)
|
|||||||
|
|
||||||
virDomainObjLock(obj);
|
virDomainObjLock(obj);
|
||||||
|
|
||||||
|
priv->monStart = 0;
|
||||||
if (refs == 0) {
|
if (refs == 0) {
|
||||||
priv->mon = NULL;
|
priv->mon = NULL;
|
||||||
}
|
}
|
||||||
@ -650,6 +652,7 @@ void qemuDomainObjEnterMonitorWithDriver(struct qemud_driver *driver,
|
|||||||
|
|
||||||
qemuMonitorLock(priv->mon);
|
qemuMonitorLock(priv->mon);
|
||||||
qemuMonitorRef(priv->mon);
|
qemuMonitorRef(priv->mon);
|
||||||
|
virTimeMs(&priv->monStart);
|
||||||
virDomainObjUnlock(obj);
|
virDomainObjUnlock(obj);
|
||||||
qemuDriverUnlock(driver);
|
qemuDriverUnlock(driver);
|
||||||
}
|
}
|
||||||
@ -674,6 +677,7 @@ void qemuDomainObjExitMonitorWithDriver(struct qemud_driver *driver,
|
|||||||
qemuDriverLock(driver);
|
qemuDriverLock(driver);
|
||||||
virDomainObjLock(obj);
|
virDomainObjLock(obj);
|
||||||
|
|
||||||
|
priv->monStart = 0;
|
||||||
if (refs == 0) {
|
if (refs == 0) {
|
||||||
priv->mon = NULL;
|
priv->mon = NULL;
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,8 @@ struct _qemuDomainObjPrivate {
|
|||||||
qemuMonitorPtr mon;
|
qemuMonitorPtr mon;
|
||||||
virDomainChrSourceDefPtr monConfig;
|
virDomainChrSourceDefPtr monConfig;
|
||||||
int monJSON;
|
int monJSON;
|
||||||
|
bool monError;
|
||||||
|
unsigned long long monStart;
|
||||||
bool gotShutdown;
|
bool gotShutdown;
|
||||||
|
|
||||||
int nvcpupids;
|
int nvcpupids;
|
||||||
|
@ -1873,6 +1873,66 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainGetControlInfo(virDomainPtr dom,
|
||||||
|
virDomainControlInfoPtr info,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
struct qemud_driver *driver = dom->conn->privateData;
|
||||||
|
virDomainObjPtr vm;
|
||||||
|
qemuDomainObjPrivatePtr priv;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
|
qemuDriverLock(driver);
|
||||||
|
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
||||||
|
qemuDriverUnlock(driver);
|
||||||
|
|
||||||
|
if (!vm) {
|
||||||
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
virUUIDFormat(dom->uuid, uuidstr);
|
||||||
|
qemuReportError(VIR_ERR_NO_DOMAIN,
|
||||||
|
_("no domain with matching uuid '%s'"), uuidstr);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!virDomainObjIsActive(vm)) {
|
||||||
|
qemuReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
"%s", _("domain is not running"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv = vm->privateData;
|
||||||
|
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
|
if (priv->monError) {
|
||||||
|
info->state = VIR_DOMAIN_CONTROL_ERROR;
|
||||||
|
} else if (priv->jobActive) {
|
||||||
|
if (!priv->monStart) {
|
||||||
|
info->state = VIR_DOMAIN_CONTROL_JOB;
|
||||||
|
if (virTimeMs(&info->stateTime) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
info->stateTime -= priv->jobStart;
|
||||||
|
} else {
|
||||||
|
info->state = VIR_DOMAIN_CONTROL_OCCUPIED;
|
||||||
|
if (virTimeMs(&info->stateTime) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
info->stateTime -= priv->monStart;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
info->state = VIR_DOMAIN_CONTROL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (vm)
|
||||||
|
virDomainObjUnlock(vm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define QEMUD_SAVE_MAGIC "LibvirtQemudSave"
|
#define QEMUD_SAVE_MAGIC "LibvirtQemudSave"
|
||||||
#define QEMUD_SAVE_VERSION 2
|
#define QEMUD_SAVE_VERSION 2
|
||||||
@ -8159,6 +8219,7 @@ static virDriver qemuDriver = {
|
|||||||
.domainGetBlkioParameters = qemuDomainGetBlkioParameters, /* 0.9.0 */
|
.domainGetBlkioParameters = qemuDomainGetBlkioParameters, /* 0.9.0 */
|
||||||
.domainGetInfo = qemudDomainGetInfo, /* 0.2.0 */
|
.domainGetInfo = qemudDomainGetInfo, /* 0.2.0 */
|
||||||
.domainGetState = qemuDomainGetState, /* 0.9.2 */
|
.domainGetState = qemuDomainGetState, /* 0.9.2 */
|
||||||
|
.domainGetControlInfo = qemuDomainGetControlInfo, /* 0.9.3 */
|
||||||
.domainSave = qemudDomainSave, /* 0.2.0 */
|
.domainSave = qemudDomainSave, /* 0.2.0 */
|
||||||
.domainRestore = qemuDomainRestore, /* 0.2.0 */
|
.domainRestore = qemuDomainRestore, /* 0.2.0 */
|
||||||
.domainCoreDump = qemudDomainCoreDump, /* 0.7.0 */
|
.domainCoreDump = qemudDomainCoreDump, /* 0.7.0 */
|
||||||
|
@ -166,6 +166,7 @@ qemuProcessHandleMonitorError(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
|
|||||||
qemuDriverLock(driver);
|
qemuDriverLock(driver);
|
||||||
virDomainObjLock(vm);
|
virDomainObjLock(vm);
|
||||||
|
|
||||||
|
((qemuDomainObjPrivatePtr) vm->privateData)->monError = true;
|
||||||
event = virDomainEventControlErrorNewFromObj(vm);
|
event = virDomainEventControlErrorNewFromObj(vm);
|
||||||
if (event)
|
if (event)
|
||||||
qemuDomainEventQueue(driver, event);
|
qemuDomainEventQueue(driver, event);
|
||||||
@ -2300,6 +2301,8 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
#endif
|
#endif
|
||||||
priv->monJSON = 0;
|
priv->monJSON = 0;
|
||||||
|
|
||||||
|
priv->monError = false;
|
||||||
|
priv->monStart = 0;
|
||||||
priv->gotShutdown = false;
|
priv->gotShutdown = false;
|
||||||
|
|
||||||
if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
|
if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user