提交 a111b9e2 编写于 作者: M Michal Privoznik

qemu: Check for outstanding async job too

Currently, qemuDomainGetXMLDesc and qemudDomainGetInfo check for
outstanding synchronous job before (eventual) monitor entering.
However, there can be already async job set, e.g. migration.
上级 086608de
...@@ -696,11 +696,17 @@ qemuDomainObjDiscardAsyncJob(struct qemud_driver *driver, virDomainObjPtr obj) ...@@ -696,11 +696,17 @@ qemuDomainObjDiscardAsyncJob(struct qemud_driver *driver, virDomainObjPtr obj)
} }
static bool static bool
qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv, enum qemuDomainJob job) qemuDomainNestedJobAllowed(qemuDomainObjPrivatePtr priv, enum qemuDomainJob job)
{ {
return !priv->job.asyncJob || (priv->job.mask & JOB_MASK(job)) != 0; return !priv->job.asyncJob || (priv->job.mask & JOB_MASK(job)) != 0;
} }
bool
qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv, enum qemuDomainJob job)
{
return !priv->job.active && qemuDomainNestedJobAllowed(priv, job);
}
/* Give up waiting for mutex after 30 seconds */ /* Give up waiting for mutex after 30 seconds */
#define QEMU_JOB_WAIT_TIME (1000ull * 30) #define QEMU_JOB_WAIT_TIME (1000ull * 30)
...@@ -736,7 +742,7 @@ retry: ...@@ -736,7 +742,7 @@ retry:
goto error; goto error;
} }
while (!nested && !qemuDomainJobAllowed(priv, job)) { while (!nested && !qemuDomainNestedJobAllowed(priv, job)) {
if (virCondWaitUntil(&priv->job.asyncCond, &obj->lock, then) < 0) if (virCondWaitUntil(&priv->job.asyncCond, &obj->lock, then) < 0)
goto error; goto error;
} }
...@@ -748,7 +754,7 @@ retry: ...@@ -748,7 +754,7 @@ retry:
/* No job is active but a new async job could have been started while obj /* No job is active but a new async job could have been started while obj
* was unlocked, so we need to recheck it. */ * was unlocked, so we need to recheck it. */
if (!nested && !qemuDomainJobAllowed(priv, job)) if (!nested && !qemuDomainNestedJobAllowed(priv, job))
goto retry; goto retry;
qemuDomainObjResetJob(priv); qemuDomainObjResetJob(priv);
......
...@@ -277,4 +277,6 @@ void qemuDomainSetFakeReboot(struct qemud_driver *driver, ...@@ -277,4 +277,6 @@ void qemuDomainSetFakeReboot(struct qemud_driver *driver,
virDomainObjPtr vm, virDomainObjPtr vm,
bool value); bool value);
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
enum qemuDomainJob job);
#endif /* __QEMU_DOMAIN_H__ */ #endif /* __QEMU_DOMAIN_H__ */
...@@ -2068,7 +2068,7 @@ static int qemudDomainGetInfo(virDomainPtr dom, ...@@ -2068,7 +2068,7 @@ static int qemudDomainGetInfo(virDomainPtr dom,
if ((vm->def->memballoon != NULL) && if ((vm->def->memballoon != NULL) &&
(vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) { (vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) {
info->memory = vm->def->mem.max_balloon; info->memory = vm->def->mem.max_balloon;
} else if (!priv->job.active) { } else if (qemuDomainJobAllowed(priv, QEMU_JOB_QUERY)) {
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
goto cleanup; goto cleanup;
if (!virDomainObjIsActive(vm)) if (!virDomainObjIsActive(vm))
...@@ -4400,7 +4400,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom, ...@@ -4400,7 +4400,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom,
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
/* Don't delay if someone's using the monitor, just use /* Don't delay if someone's using the monitor, just use
* existing most recent data instead */ * existing most recent data instead */
if (!priv->job.active) { if (qemuDomainJobAllowed(priv, QEMU_JOB_QUERY)) {
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_QUERY) < 0) if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_QUERY) < 0)
goto cleanup; goto cleanup;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册