From nobody Wed Apr 24 06:12:19 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1570139559; cv=none; d=zoho.com; s=zohoarc; b=cq89nQS3aNG7wNyDjlCkisqcS8Kcr7oNenJMitx9vXAaomWjMOmM+5A3GjfNlRaCpHnxzhtEwN+ZM9OKjq5QLZ/8jg14TTLCsRNQoJ8rrGNpjuJF3aUjJsF20hh5BsJZRxtVYmkx4cHvmv9pdsZwgalXlTq6Bmia/wVkNsrHI8E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1570139559; h=Content-Type:Content-Transfer-Encoding:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To:ARC-Authentication-Results; bh=0xZ7akkUuL2fihpWaexHzT/zEmzntVaEMabWIx9Rdyo=; b=M8UJru+QCbm1hQlqRAFVIMTTEtDs1ko01tEU44RJ77+QCbiUSihJSGMimo7tRZLhQHCCENGPcachTZeUa3irqMR0zgXBYJCUnG9UzzMfqWZaNC1A+/6OiuJqNuxsBk392bJ7r/6d2vJK85dvEvTHnaqKoq6JcMinbD2ItlgKoZQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1570139559883734.1837896957659; Thu, 3 Oct 2019 14:52:39 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8A0A43090FDA; Thu, 3 Oct 2019 21:52:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5CA495C1D6; Thu, 3 Oct 2019 21:52:35 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E059C18005A0; Thu, 3 Oct 2019 21:52:31 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x93LqTtX013764 for ; Thu, 3 Oct 2019 17:52:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 45BA160C18; Thu, 3 Oct 2019 21:52:29 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-117-231.phx2.redhat.com [10.3.117.231]) by smtp.corp.redhat.com (Postfix) with ESMTPS id F15DF60BE1 for ; Thu, 3 Oct 2019 21:52:26 +0000 (UTC) From: Jonathon Jongsma To: libvir-list@redhat.com Date: Thu, 3 Oct 2019 16:52:12 -0500 Message-Id: <20191003215212.21957-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [RFC] Add API to change qemu agent response timeout X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Thu, 03 Oct 2019 21:52:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Some layered products such as oVirt have requested a way to avoid being blocked by guest agent commands when querying a loaded vm. For example, many guest agent commands are polled periodically to monitor changes, and rather than blocking the calling process, they'd prefer to simply time out when an agent query is taking too long. This patch adds a way for the user to specify a custom agent timeout that is applied to all agent commands. One special case to note here is the 'guest-sync' command. 'guest-sync' is issued internally prior to calling any other command. (For example, when libvirt wants to call 'guest-get-fsinfo', we first call 'guest-sync' and then call 'guest-get-fsinfo'). Previously, the 'guest-sync' command used a 5-second timeout (VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT), whereas the actual command that followed always blocked indefinitely (VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK). As part of this patch, if a custom timeout is specified that is shorter than 5 seconds, this new timeout also used for 'guest-sync'. If there is no custom timeout or if the custom timeout is longer than 5 seconds, we will continue to use the 5-second timeout. See https://bugzilla.redhat.com/show_bug.cgi?id=3D1705426 for additional de= tails. Signed-off-by: Jonathon Jongsma --- include/libvirt/libvirt-qemu.h | 2 + src/driver-hypervisor.h | 5 +++ src/libvirt-qemu.c | 40 ++++++++++++++++++++ src/libvirt_qemu.syms | 4 ++ src/qemu/qemu_agent.c | 69 +++++++++++++++++++--------------- src/qemu/qemu_agent.h | 3 ++ src/qemu/qemu_driver.c | 24 ++++++++++++ src/qemu_protocol-structs | 8 ++++ src/remote/qemu_protocol.x | 18 ++++++++- src/remote/remote_driver.c | 1 + 10 files changed, 143 insertions(+), 31 deletions(-) diff --git a/include/libvirt/libvirt-qemu.h b/include/libvirt/libvirt-qemu.h index 891617443f..8d3cc776e9 100644 --- a/include/libvirt/libvirt-qemu.h +++ b/include/libvirt/libvirt-qemu.h @@ -53,6 +53,8 @@ typedef enum { char *virDomainQemuAgentCommand(virDomainPtr domain, const char *cmd, int timeout, unsigned int flags); =20 +int virDomainQemuAgentSetTimeout(virDomainPtr domain, int timeout); + /** * virConnectDomainQemuMonitorEventCallback: * @conn: the connection pointer diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 015b2cd01c..2f17bff844 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1372,6 +1372,10 @@ typedef int int *nparams, unsigned int flags); =20 +typedef int +(*virDrvDomainQemuAgentSetTimeout)(virDomainPtr domain, + int timeout); + typedef struct _virHypervisorDriver virHypervisorDriver; typedef virHypervisorDriver *virHypervisorDriverPtr; =20 @@ -1632,4 +1636,5 @@ struct _virHypervisorDriver { virDrvDomainCheckpointGetParent domainCheckpointGetParent; virDrvDomainCheckpointDelete domainCheckpointDelete; virDrvDomainGetGuestInfo domainGetGuestInfo; + virDrvDomainQemuAgentSetTimeout domainQemuAgentSetTimeout; }; diff --git a/src/libvirt-qemu.c b/src/libvirt-qemu.c index 1afb5fe529..73f119cb23 100644 --- a/src/libvirt-qemu.c +++ b/src/libvirt-qemu.c @@ -216,6 +216,46 @@ virDomainQemuAgentCommand(virDomainPtr domain, return NULL; } =20 +/** + * virDomainQemuAgentSetTimeout: + * @domain: a domain object + * @timeout: timeout in seconds + * + * Set how long to wait for a response from qemu agent commands. By defaul= t, + * agent commands block forever waiting for a response. + * + * @timeout must be -2, -1, 0 or positive. + * VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK(-2): meaning to block forever waiti= ng for + * a result. + * VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT(-1): use default timeout value. + * VIR_DOMAIN_QEMU_AGENT_COMMAND_NOWAIT(0): does not wait. + * positive value: wait for @timeout seconds + * + * Returns 0 on success, -1 on failure + */ +int +virDomainQemuAgentSetTimeout(virDomainPtr domain, + int timeout) +{ + virConnectPtr conn; + + virResetLastError(); + + virCheckDomainReturn(domain, -1); + conn =3D domain->conn; + + if (conn->driver->domainQemuAgentSetTimeout) { + if (conn->driver->domainQemuAgentSetTimeout(domain, timeout) < 0) + goto error; + return 0; + } + + virReportUnsupportedError(); + + error: + virDispatchError(conn); + return -1; +} =20 /** * virConnectDomainQemuMonitorEventRegister: diff --git a/src/libvirt_qemu.syms b/src/libvirt_qemu.syms index 3a297e3a2b..348caea72e 100644 --- a/src/libvirt_qemu.syms +++ b/src/libvirt_qemu.syms @@ -30,3 +30,7 @@ LIBVIRT_QEMU_1.2.3 { virConnectDomainQemuMonitorEventDeregister; virConnectDomainQemuMonitorEventRegister; } LIBVIRT_QEMU_0.10.0; +LIBVIRT_QEMU_5.8.0 { + global: + virDomainQemuAgentSetTimeout; +} LIBVIRT_QEMU_1.2.3; diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 34e1a85d64..86352aaec5 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -128,6 +128,7 @@ struct _qemuAgent { * but fire up an event on qemu monitor instead. * Take that as indication of successful completion */ qemuAgentEvent await_event; + int timeout; }; =20 static virClassPtr qemuAgentClass; @@ -696,6 +697,8 @@ qemuAgentOpen(virDomainObjPtr vm, if (!(mon =3D virObjectLockableNew(qemuAgentClass))) return NULL; =20 + /* agent commands block by default, user can choose different behavior= */ + mon->timeout =3D VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK; mon->fd =3D -1; if (virCondInit(&mon->notify) < 0) { virReportSystemError(errno, "%s", @@ -851,6 +854,11 @@ static int qemuAgentSend(qemuAgentPtr mon, return -1; if (seconds =3D=3D VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT) seconds =3D QEMU_AGENT_WAIT_TIME; + + /* if user specified a custom agent timeout that is lower than the + * default timeout, use the shorter timeout instead */ + if ((mon->timeout > 0) && (mon->timeout < seconds)) + seconds =3D mon->timeout; then =3D now + seconds * 1000ull; } =20 @@ -1305,8 +1313,7 @@ int qemuAgentFSFreeze(qemuAgentPtr mon, const char **= mountpoints, if (!cmd) goto cleanup; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 if (virJSONValueObjectGetNumberInt(reply, "return", &ret) < 0) { @@ -1343,8 +1350,7 @@ int qemuAgentFSThaw(qemuAgentPtr mon) if (!cmd) return -1; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 if (virJSONValueObjectGetNumberInt(reply, "return", &ret) < 0) { @@ -1381,8 +1387,7 @@ qemuAgentSuspend(qemuAgentPtr mon, return -1; =20 mon->await_event =3D QEMU_AGENT_EVENT_SUSPEND; - ret =3D qemuAgentCommand(mon, cmd, &reply, false, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK); + ret =3D qemuAgentCommand(mon, cmd, &reply, false, mon->timeout); =20 virJSONValueFree(cmd); virJSONValueFree(reply); @@ -1438,8 +1443,7 @@ qemuAgentFSTrim(qemuAgentPtr mon, if (!cmd) return ret; =20 - ret =3D qemuAgentCommand(mon, cmd, &reply, false, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK); + ret =3D qemuAgentCommand(mon, cmd, &reply, false, mon->timeout); =20 virJSONValueFree(cmd); virJSONValueFree(reply); @@ -1460,8 +1464,7 @@ qemuAgentGetVCPUs(qemuAgentPtr mon, if (!(cmd =3D qemuAgentMakeCommand("guest-get-vcpus", NULL))) return -1; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 if (!(data =3D virJSONValueObjectGetArray(reply, "return"))) { @@ -1576,8 +1579,7 @@ qemuAgentSetVCPUsCommand(qemuAgentPtr mon, NULL))) goto cleanup; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 /* All negative values are invalid. Return of 0 is bogus since we woul= dn't @@ -1732,8 +1734,7 @@ qemuAgentGetHostname(qemuAgentPtr mon, if (!cmd) return ret; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) { + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) { if (qemuAgentErrorCommandUnsupported(reply)) ret =3D -2; goto cleanup; @@ -1778,8 +1779,7 @@ qemuAgentGetTime(qemuAgentPtr mon, if (!cmd) return ret; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 if (virJSONValueObjectGetNumberUlong(reply, "return", &json_time) < 0)= { @@ -1844,8 +1844,7 @@ qemuAgentSetTime(qemuAgentPtr mon, if (!cmd) return ret; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 ret =3D 0; @@ -2054,8 +2053,7 @@ qemuAgentGetFSInfoInternal(qemuAgentPtr mon, if (!cmd) return ret; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) { + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) { if (qemuAgentErrorCommandUnsupported(reply)) ret =3D -2; goto cleanup; @@ -2347,8 +2345,7 @@ qemuAgentGetInterfaces(qemuAgentPtr mon, if (!(cmd =3D qemuAgentMakeCommand("guest-network-get-interfaces", NUL= L))) goto cleanup; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 if (!(ret_array =3D virJSONValueObjectGet(reply, "return"))) { @@ -2529,8 +2526,7 @@ qemuAgentSetUserPassword(qemuAgentPtr mon, NULL))) goto cleanup; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) goto cleanup; =20 ret =3D 0; @@ -2561,8 +2557,7 @@ qemuAgentGetUsers(qemuAgentPtr mon, if (!(cmd =3D qemuAgentMakeCommand("guest-get-users", NULL))) return -1; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) { + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) { if (qemuAgentErrorCommandUnsupported(reply)) return -2; return -1; @@ -2651,8 +2646,7 @@ qemuAgentGetOSInfo(qemuAgentPtr mon, if (!(cmd =3D qemuAgentMakeCommand("guest-get-osinfo", NULL))) return -1; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) { + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) { if (qemuAgentErrorCommandUnsupported(reply)) return -2; return -1; @@ -2707,8 +2701,7 @@ qemuAgentGetTimezone(qemuAgentPtr mon, if (!(cmd =3D qemuAgentMakeCommand("guest-get-timezone", NULL))) return -1; =20 - if (qemuAgentCommand(mon, cmd, &reply, true, - VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) { + if (qemuAgentCommand(mon, cmd, &reply, true, mon->timeout) < 0) { if (qemuAgentErrorCommandUnsupported(reply)) return -2; return -1; @@ -2737,3 +2730,19 @@ qemuAgentGetTimezone(qemuAgentPtr mon, =20 return 0; } + +int +qemuAgentSetTimeout(qemuAgentPtr mon, + int timeout) +{ + if (timeout < VIR_DOMAIN_QEMU_AGENT_COMMAND_MIN) { + virReportError(VIR_ERR_INVALID_ARG, + _("guest agent timeout '%d' is " + "less than the minimum '%d'"), + timeout, VIR_DOMAIN_QEMU_AGENT_COMMAND_MIN); + return -1; + } + + mon->timeout =3D timeout; + return 0; +} diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index 78e648992a..4037934b91 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -140,3 +140,6 @@ int qemuAgentGetTimezone(qemuAgentPtr mon, virTypedParameterPtr *params, int *nparams, int *maxparams); + +int qemuAgentSetTimeout(qemuAgentPtr mon, + int timeout); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1e041a8bac..09251cc9e2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -23434,6 +23434,29 @@ qemuDomainGetGuestInfo(virDomainPtr dom, return ret; } =20 +static int +qemuDomainQemuAgentSetTimeout(virDomainPtr dom, + int timeout) +{ + virDomainObjPtr vm =3D NULL; + qemuAgentPtr agent; + int ret =3D -1; + + if (!(vm =3D qemuDomObjFromDomain(dom))) + goto cleanup; + + if (virDomainQemuAgentSetTimeoutEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + agent =3D qemuDomainObjEnterAgent(vm); + ret =3D qemuAgentSetTimeout(agent, timeout); + qemuDomainObjExitAgent(vm, agent); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + static virHypervisorDriver qemuHypervisorDriver =3D { .name =3D QEMU_DRIVER_NAME, .connectURIProbe =3D qemuConnectURIProbe, @@ -23670,6 +23693,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainCheckpointGetParent =3D qemuDomainCheckpointGetParent, /* 5.6.0= */ .domainCheckpointDelete =3D qemuDomainCheckpointDelete, /* 5.6.0 */ .domainGetGuestInfo =3D qemuDomainGetGuestInfo, /* 5.7.0 */ + .domainQemuAgentSetTimeout =3D qemuDomainQemuAgentSetTimeout, /* 5.8.0= */ }; =20 =20 diff --git a/src/qemu_protocol-structs b/src/qemu_protocol-structs index 8501543cd9..be9e739bc6 100644 --- a/src/qemu_protocol-structs +++ b/src/qemu_protocol-structs @@ -47,6 +47,13 @@ struct qemu_domain_monitor_event_msg { u_int micros; remote_string details; }; +struct qemu_domain_agent_set_timeout_args { + remote_nonnull_domain dom; + int timeout; +}; +struct qemu_domain_agent_set_timeout_ret { + int result; +}; enum qemu_procedure { QEMU_PROC_DOMAIN_MONITOR_COMMAND =3D 1, QEMU_PROC_DOMAIN_ATTACH =3D 2, @@ -54,4 +61,5 @@ enum qemu_procedure { QEMU_PROC_CONNECT_DOMAIN_MONITOR_EVENT_REGISTER =3D 4, QEMU_PROC_CONNECT_DOMAIN_MONITOR_EVENT_DEREGISTER =3D 5, QEMU_PROC_DOMAIN_MONITOR_EVENT =3D 6, + QEMU_PROC_DOMAIN_AGENT_SET_TIMEOUT =3D 7, }; diff --git a/src/remote/qemu_protocol.x b/src/remote/qemu_protocol.x index 423e8fadaf..9be2cfa5b7 100644 --- a/src/remote/qemu_protocol.x +++ b/src/remote/qemu_protocol.x @@ -80,6 +80,15 @@ struct qemu_domain_monitor_event_msg { remote_string details; }; =20 +struct qemu_domain_agent_set_timeout_args { + remote_nonnull_domain dom; + int timeout; +}; + +struct qemu_domain_agent_set_timeout_ret { + int result; +}; + /* Define the program number, protocol version and procedure numbers here.= */ const QEMU_PROGRAM =3D 0x20008087; const QEMU_PROTOCOL_VERSION =3D 1; @@ -152,5 +161,12 @@ enum qemu_procedure { * @generate: both * @acl: none */ - QEMU_PROC_DOMAIN_MONITOR_EVENT =3D 6 + QEMU_PROC_DOMAIN_MONITOR_EVENT =3D 6, + + /** + * @generate: both + * @priority: low + * @acl: domain:write + */ + QEMU_PROC_DOMAIN_AGENT_SET_TIMEOUT =3D 7 }; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 8789c5da00..94688f9c2a 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8748,6 +8748,7 @@ static virHypervisorDriver hypervisor_driver =3D { .domainCheckpointGetParent =3D remoteDomainCheckpointGetParent, /* 5.6= .0 */ .domainCheckpointDelete =3D remoteDomainCheckpointDelete, /* 5.6.0 */ .domainGetGuestInfo =3D remoteDomainGetGuestInfo, /* 5.7.0 */ + .domainQemuAgentSetTimeout =3D remoteDomainQemuAgentSetTimeout, /* 5.8= .0 */ }; =20 static virNetworkDriver network_driver =3D { --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list