diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index d183b310cb4366e08ab36abf21f74d145deb9dc9..f8f197bfc27627397b02a252c7fae1362877db32 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -108,6 +108,8 @@ struct _qemuAgent { GSource *watch; bool running; + bool singleSync; + bool inSync; virDomainObjPtr vm; @@ -673,7 +675,8 @@ qemuAgentPtr qemuAgentOpen(virDomainObjPtr vm, const virDomainChrSourceDef *config, GMainContext *context, - qemuAgentCallbacksPtr cb) + qemuAgentCallbacksPtr cb, + bool singleSync) { qemuAgentPtr agent; g_autoptr(GError) gerr = NULL; @@ -700,6 +703,7 @@ qemuAgentOpen(virDomainObjPtr vm, } agent->vm = vm; agent->cb = cb; + agent->singleSync = singleSync; if (config->type != VIR_DOMAIN_CHR_TYPE_UNIX) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -853,6 +857,7 @@ static int qemuAgentSend(qemuAgentPtr agent, _("Unable to wait on agent socket " "condition")); } + agent->inSync = false; goto cleanup; } } @@ -894,6 +899,9 @@ qemuAgentGuestSync(qemuAgentPtr agent) qemuAgentMessage sync_msg; int timeout = VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT; + if (agent->singleSync && agent->inSync) + return 0; + /* if user specified a custom agent timeout that is lower than the * default timeout, use the shorter timeout instead */ if ((agent->timeout >= 0) && (agent->timeout < timeout)) @@ -939,6 +947,9 @@ qemuAgentGuestSync(qemuAgentPtr agent) } } + if (agent->singleSync) + agent->inSync = true; + ret = 0; cleanup: diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index d4d861532375de3b311e94b8c10b5a47621ad7d2..67fe9fcde948188f65162b02959fe5ea511a253f 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -42,7 +42,8 @@ struct _qemuAgentCallbacks { qemuAgentPtr qemuAgentOpen(virDomainObjPtr vm, const virDomainChrSourceDef *config, GMainContext *context, - qemuAgentCallbacksPtr cb); + qemuAgentCallbacksPtr cb, + bool singleSync); void qemuAgentClose(qemuAgentPtr mon); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 67dad9841ade22ca70c03e880f69a59767531c10..31cd553afd2f9b5d84419bbc2ad1d3e47b185ded 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -238,7 +238,8 @@ qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm) agent = qemuAgentOpen(vm, config->source, virEventThreadGetContext(priv->eventThread), - &agentCallbacks); + &agentCallbacks, + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VSERPORT_CHANGE)); virObjectLock(vm); diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c index 328bfb85253932d47717de0431cbad441a11d904..159b1b909e6478cfe6cf373386588a53c13c67d0 100644 --- a/tests/qemumonitortestutils.c +++ b/tests/qemumonitortestutils.c @@ -1407,7 +1407,8 @@ qemuMonitorTestNewAgent(virDomainXMLOptionPtr xmlopt) if (!(test->agent = qemuAgentOpen(test->vm, &src, virEventThreadGetContext(test->eventThread), - &qemuMonitorTestAgentCallbacks))) + &qemuMonitorTestAgentCallbacks, + false))) goto error; virObjectLock(test->agent);