From 04397de2a165f03ed66aa0bdb807eb7b33bb6aa6 Mon Sep 17 00:00:00 2001 From: ray Date: Wed, 21 Feb 2024 06:45:36 -0800 Subject: [PATCH] qemu: Fix guest-sync response time in qga command The current implementation sets the guest-sync timeout to the smaller value between the default value (QEMU_AGENT_WAIT_TIME) and agent->timeout, without considering the timeout passed via the qga command. This patch enhances the guest-sync timeout logic to use the minimum value among the default value, agent->timeout, and the timeout passed via the qga command. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/590 Signed-off-by: ray Reviewed-by: Michal Privoznik --- src/qemu/qemu_agent.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index f9bcf38dfb..22359f8518 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -835,6 +835,7 @@ qemuAgentGuestSyncSend(qemuAgent *agent, /** * qemuAgentGuestSync: * @agent: agent object + * @seconds: qemu agent command timeout value * * Send guest-sync with unique ID * and wait for reply. If we get one, check if @@ -844,9 +845,10 @@ qemuAgentGuestSyncSend(qemuAgent *agent, * -1 otherwise */ static int -qemuAgentGuestSync(qemuAgent *agent) +qemuAgentGuestSync(qemuAgent *agent, + int seconds) { - int timeout = VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT; + int timeout = QEMU_AGENT_WAIT_TIME; int rc; if (agent->inSync) @@ -854,9 +856,15 @@ qemuAgentGuestSync(qemuAgent *agent) /* 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 < QEMU_AGENT_WAIT_TIME)) + if ((agent->timeout >= 0) && (agent->timeout < timeout)) timeout = agent->timeout; + /* If user specified a timeout parameter smaller than both default + * value and agent->timeout in qga APIs(such as qemu-agent-command), + * use the parameter timeout value */ + if ((seconds >= 0) && (seconds < timeout)) + timeout = seconds; + if ((rc = qemuAgentGuestSyncSend(agent, timeout, true)) < 0) return -1; @@ -1022,7 +1030,7 @@ qemuAgentCommandFull(qemuAgent *agent, goto cleanup; } - if (qemuAgentGuestSync(agent) < 0) + if (qemuAgentGuestSync(agent, seconds) < 0) goto cleanup; if (!(cmdstr = virJSONValueToString(cmd, false)))