From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151530566516.1577984340004; Mon, 11 Mar 2024 03:05:30 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5C56A1EDE; Mon, 11 Mar 2024 06:05:29 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id E3EB81EA2; Mon, 11 Mar 2024 05:46:02 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id E0EAD1A3F; Mon, 11 Mar 2024 05:44:16 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 5B5C41A89 for ; Mon, 11 Mar 2024 05:44:14 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 0524B20B74C2; Mon, 11 Mar 2024 02:44:07 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 0524B20B74C2 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 01/11] ch_driver: Support Save, Restore VM actions from monitor Date: Mon, 11 Mar 2024 09:43:57 +0000 Message-Id: <20240311094407.12217-2-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: HR3TAENZYQZD6TRQWBZTO6QZVER7YDQ4 X-Message-ID-Hash: HR3TAENZYQZD6TRQWBZTO6QZVER7YDQ4 X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151532034100001 Implement folowing API calls from CH monitor * vmm.snapshot -> to save a domain * vmm.restore -> to restore saved domain Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_monitor.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_monitor.h | 4 +++ 2 files changed, 91 insertions(+) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index fefbf7e67a..facbff002e 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -457,6 +457,22 @@ virCHMonitorBuildVMJson(virCHDriver *driver, virDomain= Def *vmdef, return 0; } =20 +static int +virCHMonitorBuildKeyValueStringJson(char **jsonstr, + const char *key, + const char *value) +{ + g_autoptr(virJSONValue) content =3D virJSONValueNewObject(); + + if (virJSONValueObjectAppendString(content, key, value) < 0) + return -1; + + if (!(*jsonstr =3D virJSONValueToString(content, false))) + return -1; + + return 0; +} + static int chMonitorCreateSocket(const char *socket_path) { @@ -896,6 +912,77 @@ virCHMonitorResumeVM(virCHMonitor *mon) return virCHMonitorPutNoContent(mon, URL_VM_RESUME); } =20 +static int +virCHMonitorSaveRestoreVM(virCHMonitor *mon, const char *path, bool save) +{ + g_autofree char *url =3D NULL; + int responseCode =3D 0; + int ret =3D -1; + g_autofree char *payload =3D NULL; + g_autofree char *path_url =3D NULL; + struct curl_slist *headers =3D NULL; + struct curl_data data =3D {0}; + + if (save) + url =3D g_strdup_printf("%s/%s", URL_ROOT, URL_VM_SAVE); + else + url =3D g_strdup_printf("%s/%s", URL_ROOT, URL_VM_RESTORE); + + headers =3D curl_slist_append(headers, "Accept: application/json"); + headers =3D curl_slist_append(headers, "Content-Type: application/json= "); + + path_url =3D g_strdup_printf("file://%s", path); + if (save) { + if (virCHMonitorBuildKeyValueStringJson(&payload, "destination_url= ", path_url) !=3D 0) + return -1; + } else { + if (virCHMonitorBuildKeyValueStringJson(&payload, "source_url", pa= th_url) !=3D 0) + return -1; + } + + VIR_WITH_OBJECT_LOCK_GUARD(mon) { + /* reset all options of a libcurl session handle at first */ + curl_easy_reset(mon->handle); + + curl_easy_setopt(mon->handle, CURLOPT_UNIX_SOCKET_PATH, mon->socke= tpath); + curl_easy_setopt(mon->handle, CURLOPT_URL, url); + curl_easy_setopt(mon->handle, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(mon->handle, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(mon->handle, CURLOPT_POSTFIELDS, payload); + curl_easy_setopt(mon->handle, CURLOPT_WRITEFUNCTION, curl_callback= ); + curl_easy_setopt(mon->handle, CURLOPT_WRITEDATA, (void *)&data); + + responseCode =3D virCHMonitorCurlPerform(mon->handle); + } + + if (responseCode =3D=3D 200 || responseCode =3D=3D 204) { + ret =3D 0; + } else { + data.content =3D g_realloc(data.content, data.size + 1); + data.content[data.size] =3D 0; + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + data.content); + g_free(data.content); + } + + /* reset the libcurl handle to avoid leaking a stack pointer to data */ + curl_easy_reset(mon->handle); + curl_slist_free_all(headers); + return ret; +} + +int +virCHMonitorSaveVM(virCHMonitor *mon, const char *to) +{ + return virCHMonitorSaveRestoreVM(mon, to, true); +} + +int +virCHMonitorRestoreVM(virCHMonitor *mon, const char *from) +{ + return virCHMonitorSaveRestoreVM(mon, from, false); +} + /** * virCHMonitorGetInfo: * @mon: Pointer to the monitor diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h index 47b4e7abbd..3e0befe5d0 100644 --- a/src/ch/ch_monitor.h +++ b/src/ch/ch_monitor.h @@ -37,6 +37,8 @@ #define URL_VM_Suspend "vm.pause" #define URL_VM_RESUME "vm.resume" #define URL_VM_INFO "vm.info" +#define URL_VM_SAVE "vm.snapshot" +#define URL_VM_RESTORE "vm.restore" =20 #define VIRCH_THREAD_NAME_LEN 16 =20 @@ -110,6 +112,8 @@ int virCHMonitorShutdownVM(virCHMonitor *mon); int virCHMonitorRebootVM(virCHMonitor *mon); int virCHMonitorSuspendVM(virCHMonitor *mon); int virCHMonitorResumeVM(virCHMonitor *mon); +int virCHMonitorSaveVM(virCHMonitor *mon, const char *to); +int virCHMonitorRestoreVM(virCHMonitor *mon, const char *from); int virCHMonitorGetInfo(virCHMonitor *mon, virJSONValue **info); =20 void virCHMonitorCPUInfoFree(virCHMonitorCPUInfo *cpus); --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710150473499826.5003774109158; Mon, 11 Mar 2024 02:47:53 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 741F21E23; Mon, 11 Mar 2024 05:47:52 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 2E09F1DEA; Mon, 11 Mar 2024 05:44:24 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id ACBB01A3F; Mon, 11 Mar 2024 05:44:10 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id C2FD21C73 for ; Mon, 11 Mar 2024 05:44:09 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 6C9F720B74C3; Mon, 11 Mar 2024 02:44:08 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 6C9F720B74C3 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 02/11] ch_driver: Pass virCHDriverConfig to virCHMonitorNew Date: Mon, 11 Mar 2024 09:43:58 +0000 Message-Id: <20240311094407.12217-3-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: WKAK2A5BDDF5UXLK22OVMZD7A2ZNG6JU X-Message-ID-Hash: WKAK2A5BDDF5UXLK22OVMZD7A2ZNG6JU X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710150475103100001 Pass virCHDriverConfig to VirCHMonitorNew instead of just stateDir so that the cfg can be used for any additional purposes. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_monitor.c | 3 ++- src/ch/ch_monitor.h | 2 +- src/ch/ch_process.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index facbff002e..939fa13667 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -529,10 +529,11 @@ chMonitorCreateSocket(const char *socket_path) } =20 virCHMonitor * -virCHMonitorNew(virDomainObj *vm, const char *socketdir) +virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg) { g_autoptr(virCHMonitor) mon =3D NULL; g_autoptr(virCommand) cmd =3D NULL; + const char *socketdir =3D cfg->stateDir; int socket_fd =3D 0; =20 if (virCHMonitorInitialize() < 0) diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h index 3e0befe5d0..ea6b2a771b 100644 --- a/src/ch/ch_monitor.h +++ b/src/ch/ch_monitor.h @@ -101,7 +101,7 @@ struct _virCHMonitor { virCHMonitorThreadInfo *threads; }; =20 -virCHMonitor *virCHMonitorNew(virDomainObj *vm, const char *socketdir); +virCHMonitor *virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg); void virCHMonitorClose(virCHMonitor *mon); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCHMonitor, virCHMonitorClose); =20 diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 7488b1d65d..4b360413fb 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -51,7 +51,7 @@ virCHProcessConnectMonitor(virCHDriver *driver, virCHMonitor *monitor =3D NULL; virCHDriverConfig *cfg =3D virCHDriverGetConfig(driver); =20 - monitor =3D virCHMonitorNew(vm, cfg->stateDir); + monitor =3D virCHMonitorNew(vm, cfg); =20 virObjectUnref(cfg); return monitor; --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710150614338793.6440348118111; Mon, 11 Mar 2024 02:50:14 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3C33F1E6A; Mon, 11 Mar 2024 05:50:13 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 3F34C1E34; Mon, 11 Mar 2024 05:44:35 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 29D651C87; Mon, 11 Mar 2024 05:44:11 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id E88FC1C31 for ; Mon, 11 Mar 2024 05:44:09 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id D3E4B20B74C4; Mon, 11 Mar 2024 02:44:08 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com D3E4B20B74C4 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 03/11] ch_driver: Add domainSave, domainSaveFlags callbacks Date: Mon, 11 Mar 2024 09:43:59 +0000 Message-Id: <20240311094407.12217-4-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: JOF3KV7AWOP7LJOBVDD2ETMKLBOL6BWG X-Message-ID-Hash: JOF3KV7AWOP7LJOBVDD2ETMKLBOL6BWG X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710150615871100001 Implemented save callbacks. CH's vmm.snapshot API is called to save the domain state. The path passed to these callbacks has to be of directory as CH takes dir as input to snapshot and saves multiple files under it. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_conf.h | 11 ++++ src/ch/ch_driver.c | 144 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h index 579eca894e..4b4c3345b6 100644 --- a/src/ch/ch_conf.h +++ b/src/ch/ch_conf.h @@ -81,6 +81,17 @@ struct _virCHDriver ebtablesContext *ebtables; }; =20 +#define CH_SAVE_MAGIC "libvirt-xml\n \0 \r" +#define CH_SAVE_XML "libvirt-save.xml" + +typedef struct _CHSaveXMLHeader CHSaveXMLHeader; +struct _CHSaveXMLHeader { + char magic[sizeof(CH_SAVE_MAGIC)-1]; + uint32_t xmlLen; + /* 20 bytes used, pad up to 64 bytes */ + uint32_t unused[11]; +}; + virCaps *virCHDriverCapsInit(void); virCaps *virCHDriverGetCapabilities(virCHDriver *driver, bool refresh); diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 2601eea44b..24f697d2e1 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -19,6 +19,7 @@ */ =20 #include +#include =20 #include "ch_capabilities.h" #include "ch_conf.h" @@ -34,6 +35,7 @@ #include "virerror.h" #include "virlog.h" #include "virobject.h" +#include "virfile.h" #include "virtypedparam.h" #include "virutil.h" #include "viruuid.h" @@ -621,6 +623,146 @@ chDomainDestroy(virDomainPtr dom) return chDomainDestroyFlags(dom, 0); } =20 +/** + * chDoDomainSave: + * @driver: pointer to driver structure + * @vm: pointer to virtual machine structure. Must be locked before invoca= tion. + * @to_dir: directory path (CH needs directory input) to save the domain + * @managed: whether the VM is managed or not + * + * Checks if the domain is running or paused, then suspends it and saves it + * using CH's vmm.snapshot API. CH creates multiple files for config, memo= ry, + * device state into @to_dir. + * + * Returns 0 on success or -1 in case of error + */ +static int +chDoDomainSave(virCHDriver *driver, + virDomainObj *vm, + const char *to_dir, + bool managed) +{ + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + virCHDomainObjPrivate *priv =3D vm->privateData; + CHSaveXMLHeader hdr; + g_autofree char *to =3D NULL; + g_autofree char *xml =3D NULL; + uint32_t xml_len; + VIR_AUTOCLOSE fd =3D -1; + int ret =3D -1; + + virDomainState domainState =3D virDomainObjGetState(vm, NULL); + if (domainState =3D=3D VIR_DOMAIN_RUNNING) { + if (virCHMonitorSuspendVM(priv->monitor) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to suspend domain before saving")); + goto end; + } + virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_SAVE= ); + } else if (domainState !=3D VIR_DOMAIN_PAUSED) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("only can save running/paused domain")); + goto end; + } + + if (virDirCreate(to_dir, 0770, cfg->user, cfg->group, + VIR_DIR_CREATE_ALLOW_EXIST) < 0) { + virReportSystemError(errno, _("Failed to create SAVE dir %1$s"), t= o_dir); + goto end; + } + + to =3D g_strdup_printf("%s/%s", to_dir, CH_SAVE_XML); + if ((fd =3D virFileOpenAs(to, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUS= R, + cfg->user, cfg->group, 0)) < 0) { + virReportSystemError(-fd, + _("Failed to create/open domain save xml file= '%1$s'"), + to); + goto end; + } + + if ((xml =3D virDomainDefFormat(vm->def, driver->xmlopt, 0)) =3D=3D NU= LL) + goto end; + xml_len =3D strlen(xml) + 1; + + memset(&hdr, 0, sizeof(hdr)); + memcpy(hdr.magic, CH_SAVE_MAGIC, sizeof(hdr.magic)); + hdr.xmlLen =3D xml_len; + + if (safewrite(fd, &hdr, sizeof(hdr)) !=3D sizeof(hdr)) { + virReportSystemError(errno, "%s", _("Failed to write file header")= ); + goto end; + } + + if (safewrite(fd, xml, xml_len) !=3D xml_len) { + virReportSystemError(errno, "%s", _("Failed to write xml definitio= n")); + goto end; + } + + if (virCHMonitorSaveVM(priv->monitor, to_dir) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failed to save dom= ain")); + goto end; + } + + if (virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to shutoff after domain save")); + goto end; + } + + vm->hasManagedSave =3D managed; + ret =3D 0; + + end: + return ret; +} + +static int +chDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml, unsi= gned int flags) +{ + virCHDriver *driver =3D dom->conn->privateData; + virDomainObj *vm =3D NULL; + int ret =3D -1; + + virCheckFlags(0, -1); + if (dxml) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("xml modification unsupported")); + return -1; + } + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + goto cleanup; + + if (virDomainSaveFlagsEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (chDoDomainSave(driver, vm, to, false) < 0) + goto endjob; + + /* Remove if VM is not persistent */ + virCHDomainRemoveInactive(driver, vm); + ret =3D 0; + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + +static int +chDomainSave(virDomainPtr dom, const char *to) +{ + return chDomainSaveFlags(dom, to, NULL, 0); +} + static virDomainPtr chDomainLookupByID(virConnectPtr conn, int id) { @@ -1743,6 +1885,8 @@ static virHypervisorDriver chHypervisorDriver =3D { .nodeGetCPUMap =3D chNodeGetCPUMap, /* 8.0.0 */ .domainSetNumaParameters =3D chDomainSetNumaParameters, /* 8.1.0 */ .domainGetNumaParameters =3D chDomainGetNumaParameters, /* 8.1.0 */ + .domainSave =3D chDomainSave, /* 10.2.0 */ + .domainSaveFlags =3D chDomainSaveFlags, /* 10.2.0 */ }; =20 static virConnectDriver chConnectDriver =3D { --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710150733429452.3455491707664; Mon, 11 Mar 2024 02:52:13 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 66D10188A; Mon, 11 Mar 2024 05:52:12 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B655C1E51; Mon, 11 Mar 2024 05:44:45 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DC7771C78; Mon, 11 Mar 2024 05:44:11 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 9901A1C76 for ; Mon, 11 Mar 2024 05:44:10 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 46E1720B74C5; Mon, 11 Mar 2024 02:44:09 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 46E1720B74C5 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 04/11] ch_driver: Add domainManagedSave callback Date: Mon, 11 Mar 2024 09:44:00 +0000 Message-Id: <20240311094407.12217-5-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: HEMQYQEIF2WA3YEWZNOIMSHEA2W4ZPJ7 X-Message-ID-Hash: HEMQYQEIF2WA3YEWZNOIMSHEA2W4ZPJ7 X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710150734485100001 Create libvirt managed saveDir and pass it to CH to save the VM Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_conf.c | 6 ++++++ src/ch/ch_conf.h | 1 + src/ch/ch_driver.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_monitor.c | 7 +++++++ 4 files changed, 65 insertions(+) diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c index a7b2285886..cab97639c4 100644 --- a/src/ch/ch_conf.c +++ b/src/ch/ch_conf.c @@ -148,10 +148,12 @@ virCHDriverConfigNew(bool privileged) if (privileged) { cfg->logDir =3D g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR= ); cfg->stateDir =3D g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR); + cfg->saveDir =3D g_strdup_printf("%s/lib/libvirt/ch/save", LOCALST= ATEDIR); =20 } else { g_autofree char *rundir =3D NULL; g_autofree char *cachedir =3D NULL; + g_autofree char *configbasedir =3D NULL; =20 cachedir =3D virGetUserCacheDirectory(); =20 @@ -159,6 +161,9 @@ virCHDriverConfigNew(bool privileged) =20 rundir =3D virGetUserRuntimeDirectory(); cfg->stateDir =3D g_strdup_printf("%s/ch/run", rundir); + + configbasedir =3D virGetUserConfigDirectory(); + cfg->saveDir =3D g_strdup_printf("%s/ch/save", configbasedir); } =20 return cfg; @@ -175,6 +180,7 @@ virCHDriverConfigDispose(void *obj) { virCHDriverConfig *cfg =3D obj; =20 + g_free(cfg->saveDir); g_free(cfg->stateDir); g_free(cfg->logDir); } diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h index 4b4c3345b6..a77cad7a2a 100644 --- a/src/ch/ch_conf.h +++ b/src/ch/ch_conf.h @@ -37,6 +37,7 @@ struct _virCHDriverConfig { =20 char *stateDir; char *logDir; + char *saveDir; =20 int cgroupControllers; =20 diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 24f697d2e1..be6e25c8e2 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -178,6 +178,14 @@ static char *chConnectGetCapabilities(virConnectPtr co= nn) return xml; } =20 +static char * +chDomainManagedSavePath(virCHDriver *driver, virDomainObj *vm) +{ + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + return g_strdup_printf("%s/%s.save", cfg->saveDir, vm->def->name); +} + + /** * chDomainCreateXML: * @conn: pointer to connection @@ -763,6 +771,48 @@ chDomainSave(virDomainPtr dom, const char *to) return chDomainSaveFlags(dom, to, NULL, 0); } =20 +static int +chDomainManagedSave(virDomainPtr dom, unsigned int flags) +{ + virCHDriver *driver =3D dom->conn->privateData; + virDomainObj *vm =3D NULL; + g_autofree char *to =3D NULL; + int ret =3D -1; + + virCheckFlags(0, -1); + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + goto cleanup; + + if (virDomainManagedSaveEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (!vm->persistent) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot do managed save for transient domain")); + goto endjob; + } + + to =3D chDomainManagedSavePath(driver, vm); + if (chDoDomainSave(driver, vm, to, true) < 0) + goto endjob; + + ret =3D 0; + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + static virDomainPtr chDomainLookupByID(virConnectPtr conn, int id) { @@ -1887,6 +1937,7 @@ static virHypervisorDriver chHypervisorDriver =3D { .domainGetNumaParameters =3D chDomainGetNumaParameters, /* 8.1.0 */ .domainSave =3D chDomainSave, /* 10.2.0 */ .domainSaveFlags =3D chDomainSaveFlags, /* 10.2.0 */ + .domainManagedSave =3D chDomainManagedSave, /* 10.2.0 */ }; =20 static virConnectDriver chConnectDriver =3D { diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 939fa13667..7b6b77de1c 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -557,6 +557,13 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *c= fg) return NULL; } =20 + if (g_mkdir_with_parents(cfg->saveDir, 0777) < 0) { + virReportSystemError(errno, + _("Cannot create save directory '%1$s'"), + cfg->saveDir); + return NULL; + } + cmd =3D virCommandNew(vm->def->emulator); virCommandSetUmask(cmd, 0x002); socket_fd =3D chMonitorCreateSocket(mon->socketpath); --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710150907281787.1319717201424; Mon, 11 Mar 2024 02:55:07 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3521D1EB9; Mon, 11 Mar 2024 05:55:06 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 1E37A1E6E; Mon, 11 Mar 2024 05:45:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 583551CC0; Mon, 11 Mar 2024 05:44:13 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id A47261C7E for ; Mon, 11 Mar 2024 05:44:10 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id AD7B620B74C0; Mon, 11 Mar 2024 02:44:09 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com AD7B620B74C0 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 05/11] ch_driver: Implement more save callbacks Date: Mon, 11 Mar 2024 09:44:01 +0000 Message-Id: <20240311094407.12217-6-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: NNPTHGFGSBWSG53WWTWRINTTCGCXDBVJ X-Message-ID-Hash: NNPTHGFGSBWSG53WWTWRINTTCGCXDBVJ X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710150909273100001 Following callbacks have been implemented * domainSaveImageGetXMLDesc * domainManagedSaveRemove * domainManagedSaveGetXMLDesc * domainHasManagedSaveImage Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_driver.c | 180 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index be6e25c8e2..577544c941 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -771,6 +771,99 @@ chDomainSave(virDomainPtr dom, const char *to) return chDomainSaveFlags(dom, to, NULL, 0); } =20 +static char * +chDomainSaveXMLRead(int fd) +{ + g_autofree char *xml =3D NULL; + CHSaveXMLHeader hdr; + + if (saferead(fd, &hdr, sizeof(hdr)) !=3D sizeof(hdr)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to read CHSaveXMLHeader header")); + return NULL; + } + + if (memcmp(hdr.magic, CH_SAVE_MAGIC, sizeof(hdr.magic))) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("save image magic is incorrect")); + return NULL; + } + + if (hdr.xmlLen <=3D 0) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("invalid XML length: %1$d"), hdr.xmlLen); + return NULL; + } + + xml =3D g_new0(char, hdr.xmlLen); + + if (saferead(fd, xml, hdr.xmlLen) !=3D hdr.xmlLen) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to read XML")); + return NULL; + } + + return g_steal_pointer(&xml); +} + +static int chDomainSaveImageRead(virCHDriver *driver, + const char *path, + virDomainDef **ret_def) +{ + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + g_autoptr(virDomainDef) def =3D NULL; + g_autofree char *from =3D NULL; + g_autofree char *xml =3D NULL; + VIR_AUTOCLOSE fd =3D -1; + int ret =3D -1; + + from =3D g_strdup_printf("%s/%s", path, CH_SAVE_XML); + if ((fd =3D virFileOpenAs(from, O_RDONLY, 0, cfg->user, cfg->group, 0)= ) < 0) { + virReportSystemError(errno, + _("Failed to open domain save file '%1$s'"), + from); + goto end; + } + + if (!(xml =3D chDomainSaveXMLRead(fd))) + goto end; + + if (!(def =3D virDomainDefParseString(xml, driver->xmlopt, NULL, + VIR_DOMAIN_DEF_PARSE_INACTIVE | + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) + goto end; + + *ret_def =3D g_steal_pointer(&def); + ret =3D 0; + + end: + return ret; +} + +static char * +chDomainSaveImageGetXMLDesc(virConnectPtr conn, + const char *path, + unsigned int flags) +{ + virCHDriver *driver =3D conn->privateData; + g_autoptr(virDomainDef) def =3D NULL; + char *ret =3D NULL; + + virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); + + if (chDomainSaveImageRead(driver, path, &def) < 0) + goto cleanup; + + if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0) + goto cleanup; + + ret =3D virDomainDefFormat(def, driver->xmlopt, + virDomainDefFormatConvertXMLFlags(flags)); + + cleanup: + return ret; +} + static int chDomainManagedSave(virDomainPtr dom, unsigned int flags) { @@ -813,6 +906,89 @@ chDomainManagedSave(virDomainPtr dom, unsigned int fla= gs) return ret; } =20 +static int +chDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) +{ + virCHDriver *driver =3D dom->conn->privateData; + virDomainObj *vm; + int ret =3D -1; + g_autofree char *path =3D NULL; + + virCheckFlags(0, -1); + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + return -1; + + if (virDomainManagedSaveRemoveEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + path =3D chDomainManagedSavePath(driver, vm); + + if (virFileDeleteTree(path) < 0) { + virReportSystemError(errno, + _("Failed to remove managed save path '%1$s'"= ), + path); + goto cleanup; + } + + vm->hasManagedSave =3D false; + ret =3D 0; + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + +static char * +chDomainManagedSaveGetXMLDesc(virDomainPtr dom, unsigned int flags) +{ + virCHDriver *driver =3D dom->conn->privateData; + virDomainObj *vm =3D NULL; + g_autoptr(virDomainDef) def =3D NULL; + char *ret =3D NULL; + g_autofree char *path =3D NULL; + + virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + goto cleanup; + + path =3D chDomainManagedSavePath(driver, vm); + if (chDomainSaveImageRead(driver, path, &def) < 0) + goto cleanup; + + if (virDomainManagedSaveGetXMLDescEnsureACL(dom->conn, def, flags) < 0) + goto cleanup; + + ret =3D virDomainDefFormat(def, driver->xmlopt, + virDomainDefFormatConvertXMLFlags(flags)); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + +static int +chDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) +{ + virDomainObj *vm =3D NULL; + int ret =3D -1; + + virCheckFlags(0, -1); + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + return -1; + + if (virDomainHasManagedSaveImageEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + ret =3D vm->hasManagedSave; + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + static virDomainPtr chDomainLookupByID(virConnectPtr conn, int id) { @@ -1937,7 +2113,11 @@ static virHypervisorDriver chHypervisorDriver =3D { .domainGetNumaParameters =3D chDomainGetNumaParameters, /* 8.1.0 */ .domainSave =3D chDomainSave, /* 10.2.0 */ .domainSaveFlags =3D chDomainSaveFlags, /* 10.2.0 */ + .domainSaveImageGetXMLDesc =3D chDomainSaveImageGetXMLDesc, /* 10.2.= 0 */ .domainManagedSave =3D chDomainManagedSave, /* 10.2.0 */ + .domainManagedSaveRemove =3D chDomainManagedSaveRemove, /* 10.2.0 */ + .domainManagedSaveGetXMLDesc =3D chDomainManagedSaveGetXMLDesc, /* 1= 0.2.0 */ + .domainHasManagedSaveImage =3D chDomainHasManagedSaveImage, /* 10.2.= 0 */ }; =20 static virConnectDriver chConnectDriver =3D { --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 171015109875329.671210520408067; Mon, 11 Mar 2024 02:58:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id B44C45FF; Mon, 11 Mar 2024 05:58:17 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 890CD1E7C; Mon, 11 Mar 2024 05:45:17 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 0690E1C73; Mon, 11 Mar 2024 05:44:14 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id EF6881A3F for ; Mon, 11 Mar 2024 05:44:11 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 204B020B74C6; Mon, 11 Mar 2024 02:44:10 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 204B020B74C6 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 06/11] ch_driver: Refactor virCHProcessStart Date: Mon, 11 Mar 2024 09:44:02 +0000 Message-Id: <20240311094407.12217-7-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: 7O7F7LKRF46LUGGAH7XANHVHHZ5OYECQ X-Message-ID-Hash: 7O7F7LKRF46LUGGAH7XANHVHHZ5OYECQ X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151100137100001 Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_process.c | 47 ++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 4b360413fb..02749adfb6 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -460,6 +460,34 @@ virCHProcessSetupVcpus(virDomainObj *vm) return 0; } =20 +static int +virCHProcessSetup(virDomainObj *vm) +{ + virCHDomainObjPrivate *priv =3D vm->privateData; + + virCHDomainRefreshThreadInfo(vm); + + VIR_DEBUG("Setting emulator tuning/settings"); + if (virCHProcessSetupEmulatorThreads(vm) < 0) + return -1; + + VIR_DEBUG("Setting iothread tuning/settings"); + if (virCHProcessSetupIOThreads(vm) < 0) + return -1; + + VIR_DEBUG("Setting global CPU cgroup (if required)"); + if (virDomainCgroupSetupGlobalCpuCgroup(vm, + priv->cgroup) < 0) + return -1; + + VIR_DEBUG("Setting vCPU tuning/settings"); + if (virCHProcessSetupVcpus(vm) < 0) + return -1; + + virCHProcessUpdateInfo(vm); + return 0; +} + =20 #define PKT_TIMEOUT_MS 500 /* ms */ =20 @@ -763,26 +791,9 @@ virCHProcessStart(virCHDriver *driver, goto cleanup; } =20 - virCHDomainRefreshThreadInfo(vm); - - VIR_DEBUG("Setting emulator tuning/settings"); - if (virCHProcessSetupEmulatorThreads(vm) < 0) - goto cleanup; - - VIR_DEBUG("Setting iothread tuning/settings"); - if (virCHProcessSetupIOThreads(vm) < 0) - goto cleanup; - - VIR_DEBUG("Setting global CPU cgroup (if required)"); - if (virDomainCgroupSetupGlobalCpuCgroup(vm, - priv->cgroup) < 0) + if (virCHProcessSetup(vm) < 0) goto cleanup; =20 - VIR_DEBUG("Setting vCPU tuning/settings"); - if (virCHProcessSetupVcpus(vm) < 0) - goto cleanup; - - virCHProcessUpdateInfo(vm); virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, reason); =20 return 0; --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151225948556.9339261380616; Mon, 11 Mar 2024 03:00:25 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DBE8B1E28; Mon, 11 Mar 2024 06:00:24 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 3FDE01E3C; Mon, 11 Mar 2024 05:45:28 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 922751A3F; Mon, 11 Mar 2024 05:44:14 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 577281C31 for ; Mon, 11 Mar 2024 05:44:11 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 873A720B74C7; Mon, 11 Mar 2024 02:44:10 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 873A720B74C7 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 07/11] ch_driver: Implement domain restore callbacks Date: Mon, 11 Mar 2024 09:44:03 +0000 Message-Id: <20240311094407.12217-8-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: LKO4RPGU5NSKVI6BAQK4MOHGU7TPSN6I X-Message-ID-Hash: LKO4RPGU5NSKVI6BAQK4MOHGU7TPSN6I X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151226656100001 Following callbacks have been implemented * domainRestore * domainRestoreFlags The path parameter to these callbacks has to be of the directory where libvirt has performed save. Additionally, call restore in `domainCreate` if the domain has managedsave. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_driver.c | 96 ++++++++++++++++++++++++++++++++++++++++++++- src/ch/ch_process.c | 53 +++++++++++++++++++++++++ src/ch/ch_process.h | 4 ++ 3 files changed, 152 insertions(+), 1 deletion(-) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 577544c941..218e2ec56f 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -252,6 +252,8 @@ chDomainCreateWithFlags(virDomainPtr dom, unsigned int = flags) { virCHDriver *driver =3D dom->conn->privateData; virDomainObj *vm; + virCHDomainObjPrivate *priv; + g_autofree char *managed_save_path =3D NULL; int ret =3D -1; =20 virCheckFlags(0, -1); @@ -265,8 +267,34 @@ chDomainCreateWithFlags(virDomainPtr dom, unsigned int= flags) if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) goto cleanup; =20 - ret =3D virCHProcessStart(driver, vm, VIR_DOMAIN_RUNNING_BOOTED); + if (vm->hasManagedSave) { + priv =3D vm->privateData; + managed_save_path =3D chDomainManagedSavePath(driver, vm); + if (virCHProcessStartRestore(driver, vm, managed_save_path) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to restore domain from managed save")= ); + goto endjob; + } + if (virCHMonitorResumeVM(priv->monitor) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to resume domain after restore from m= anaged save")); + goto endjob; + } + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_RE= STORED); + /* cleanup the save dir after restore */ + if (virFileDeleteTree(managed_save_path) < 0) { + virReportSystemError(errno, + _("Failed to remove managed save path '%1= $s'"), + managed_save_path); + goto endjob; + } + vm->hasManagedSave =3D false; + ret =3D 0; + } else { + ret =3D virCHProcessStart(driver, vm, VIR_DOMAIN_RUNNING_BOOTED); + } =20 + endjob: virDomainObjEndJob(vm); =20 cleanup: @@ -989,6 +1017,70 @@ chDomainHasManagedSaveImage(virDomainPtr dom, unsigne= d int flags) return ret; } =20 +static int +chDomainRestoreFlags(virConnectPtr conn, + const char *from, + const char *dxml, + unsigned int flags) +{ + virCHDriver *driver =3D conn->privateData; + virDomainObj *vm =3D NULL; + virCHDomainObjPrivate *priv; + g_autoptr(virDomainDef) def =3D NULL; + int ret =3D -1; + + virCheckFlags(0, -1); + + if (dxml) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("xml modification unsupported")); + return -1; + } + + if (chDomainSaveImageRead(driver, from, &def) < 0) + goto cleanup; + + if (virDomainRestoreFlagsEnsureACL(conn, def) < 0) + goto cleanup; + + if (!(vm =3D virDomainObjListAdd(driver->domains, &def, + driver->xmlopt, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) + goto cleanup; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (virCHProcessStartRestore(driver, vm, from) < 0) + goto endjob; + + priv =3D vm->privateData; + if (virCHMonitorResumeVM(priv->monitor) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to resume domain after restore")); + goto endjob; + } + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_RESTOR= ED); + ret =3D 0; + + endjob: + virDomainObjEndJob(vm); + + cleanup: + if (vm && ret < 0) + virCHDomainRemoveInactive(driver, vm); + virDomainObjEndAPI(&vm); + return ret; +} + +static int +chDomainRestore(virConnectPtr conn, const char *from) +{ + return chDomainRestoreFlags(conn, from, NULL, 0); +} + static virDomainPtr chDomainLookupByID(virConnectPtr conn, int id) { @@ -2118,6 +2210,8 @@ static virHypervisorDriver chHypervisorDriver =3D { .domainManagedSaveRemove =3D chDomainManagedSaveRemove, /* 10.2.0 */ .domainManagedSaveGetXMLDesc =3D chDomainManagedSaveGetXMLDesc, /* 1= 0.2.0 */ .domainHasManagedSaveImage =3D chDomainHasManagedSaveImage, /* 10.2.= 0 */ + .domainRestore =3D chDomainRestore, /* 10.2.0 */ + .domainRestoreFlags =3D chDomainRestoreFlags, /* 10.2.0 */ }; =20 static virConnectDriver chConnectDriver =3D { diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 02749adfb6..081fc5af52 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -852,3 +852,56 @@ virCHProcessStop(virCHDriver *driver G_GNUC_UNUSED, =20 return 0; } + +/** + * virCHProcessStartRestore: + * @driver: pointer to driver structure + * @vm: pointer to virtual machine structure + * @from: directory path to restore the VM from + * + * Starts Cloud-Hypervisor process with the restored VM + * + * Returns 0 on success or -1 in case of error + */ +int +virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char= *from) +{ + virCHDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(priv->driver= ); + + if (!priv->monitor) { + /* Get the first monitor connection if not already */ + if (!(priv->monitor =3D virCHProcessConnectMonitor(driver, vm))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to create connection to CH socket")); + return -1; + } + } + + vm->pid =3D priv->monitor->pid; + vm->def->id =3D vm->pid; + priv->machineName =3D virCHDomainGetMachineName(vm); + + if (virCHMonitorRestoreVM(priv->monitor, from) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to restore domain")); + return -1; + } + + /* Pass 0, NULL as restore only works without networking support */ + if (virDomainCgroupSetupCgroup("ch", vm, + 0, NULL, /* nnicindexes, nicindexes */ + &priv->cgroup, + cfg->cgroupControllers, + 0, /*maxThreadsPerProc*/ + priv->driver->privileged, + priv->machineName) < 0) + return -1; + + if (virCHProcessSetup(vm) < 0) + return -1; + + virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_FROM_SNA= PSHOT); + + return 0; +} diff --git a/src/ch/ch_process.h b/src/ch/ch_process.h index 800e3f4e23..38bfce3b7f 100644 --- a/src/ch/ch_process.h +++ b/src/ch/ch_process.h @@ -32,3 +32,7 @@ int virCHProcessStop(virCHDriver *driver, =20 int virCHProcessSetupVcpu(virDomainObj *vm, unsigned int vcpuid); + +int virCHProcessStartRestore(virCHDriver *driver, + virDomainObj *vm, + const char *from); --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151011584475.50890849199743; Mon, 11 Mar 2024 02:56:51 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 4D9371E61; Mon, 11 Mar 2024 05:56:50 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 646DC1E78; Mon, 11 Mar 2024 05:45:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 9E2F81CC0; Mon, 11 Mar 2024 05:44:13 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 7E8601A89 for ; Mon, 11 Mar 2024 05:44:11 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id EE56820B74C3; Mon, 11 Mar 2024 02:44:10 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com EE56820B74C3 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 08/11] ch_driver: cleanup any stale managed save dir before VM creation Date: Mon, 11 Mar 2024 09:44:04 +0000 Message-Id: <20240311094407.12217-9-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: S2Q6OAQC57GJFD4VPXCUZTJQKIP7UJ77 X-Message-ID-Hash: S2Q6OAQC57GJFD4VPXCUZTJQKIP7UJ77 X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151013794100001 There are chances that libvirt process is killed and it resulting in stale managed save dirs. So check for it, and cleanup it there's any. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_driver.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 218e2ec56f..09cd6b90e7 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -206,6 +206,7 @@ chDomainCreateXML(virConnectPtr conn, virDomainObj *vm =3D NULL; virDomainPtr dom =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; + g_autofree char *managed_save_path =3D NULL; =20 virCheckFlags(VIR_DOMAIN_START_VALIDATE, NULL); =20 @@ -228,6 +229,15 @@ chDomainCreateXML(virConnectPtr conn, NULL))) goto cleanup; =20 + /* cleanup if there's any stale managedsave dir */ + managed_save_path =3D chDomainManagedSavePath(driver, vm); + if (virFileDeleteTree(managed_save_path) < 0) { + virReportSystemError(errno, + _("Failed to cleanup stale managed save dir '= %1$s'"), + managed_save_path); + goto cleanup; + } + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) goto cleanup; =20 @@ -315,6 +325,7 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char *= xml, unsigned int flags) g_autoptr(virDomainDef) vmdef =3D NULL; virDomainObj *vm =3D NULL; virDomainPtr dom =3D NULL; + g_autofree char *managed_save_path =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL); @@ -337,6 +348,15 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char = *xml, unsigned int flags) 0, NULL))) goto cleanup; =20 + /* cleanup if there's any stale managedsave dir */ + managed_save_path =3D chDomainManagedSavePath(driver, vm); + if (virFileDeleteTree(managed_save_path) < 0) { + virReportSystemError(errno, + _("Failed to cleanup stale managed save dir '= %1$s'"), + managed_save_path); + goto cleanup; + } + vm->persistent =3D 1; =20 dom =3D virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151602177765.2252733996207; Mon, 11 Mar 2024 03:06:42 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 0D74D1E04; Mon, 11 Mar 2024 06:06:41 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5EBD81E71; Mon, 11 Mar 2024 05:46:13 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 045031A89; Mon, 11 Mar 2024 05:44:17 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 4E6861C94 for ; Mon, 11 Mar 2024 05:44:12 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 61D6F20B74C0; Mon, 11 Mar 2024 02:44:11 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 61D6F20B74C0 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 09/11] ch_driver: Add additional validation for save/restore Date: Mon, 11 Mar 2024 09:44:05 +0000 Message-Id: <20240311094407.12217-10-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: 3UGH3DYIEJYOHDKCCJCT62YR4TTUCU5Z X-Message-ID-Hash: 3UGH3DYIEJYOHDKCCJCT62YR4TTUCU5Z X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151604333100001 Save & Restore are supported without any network and hostdev config defined. So, add a validation for it before performing save. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/ch/ch_driver.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 09cd6b90e7..3d5b8d211a 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -679,6 +679,26 @@ chDomainDestroy(virDomainPtr dom) return chDomainDestroyFlags(dom, 0); } =20 +static int +chDomainSaveAdditionalValidation(virDomainDef *vmdef) +{ + /* + SAVE and RESTORE are functional only without any networking and + device passthrough configuration + */ + if (vmdef->nnets > 0) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot save domain with network interfaces")); + return -1; + } + if (vmdef->nhostdevs > 0) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot save domain with host devices")); + return -1; + } + return 0; +} + /** * chDoDomainSave: * @driver: pointer to driver structure @@ -701,13 +721,17 @@ chDoDomainSave(virCHDriver *driver, g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); virCHDomainObjPrivate *priv =3D vm->privateData; CHSaveXMLHeader hdr; + virDomainState domainState; g_autofree char *to =3D NULL; g_autofree char *xml =3D NULL; uint32_t xml_len; VIR_AUTOCLOSE fd =3D -1; int ret =3D -1; =20 - virDomainState domainState =3D virDomainObjGetState(vm, NULL); + if (chDomainSaveAdditionalValidation(vm->def) < 0) + goto end; + + domainState =3D virDomainObjGetState(vm, NULL); if (domainState =3D=3D VIR_DOMAIN_RUNNING) { if (virCHMonitorSuspendVM(priv->monitor) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151438365714.1101529187957; Mon, 11 Mar 2024 03:03:58 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 37D561DC7; Mon, 11 Mar 2024 06:03:57 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id CF27E1E90; Mon, 11 Mar 2024 05:45:50 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D87151A3F; Mon, 11 Mar 2024 05:44:15 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id DE7D91CA9 for ; Mon, 11 Mar 2024 05:44:12 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id C8CD420B74C4; Mon, 11 Mar 2024 02:44:11 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C8CD420B74C4 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 10/11] docs: Update doc for virDomainSave and virDomainRestore Date: Mon, 11 Mar 2024 09:44:06 +0000 Message-Id: <20240311094407.12217-11-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: BYTME3QMCTEDQ2HY5ERQUMIIH7OGCVFF X-Message-ID-Hash: BYTME3QMCTEDQ2HY5ERQUMIIH7OGCVFF X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151439641100001 ch_driver expects path to be of a dir for save/restore. So, update the documentation at global API as well. Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- src/libvirt-domain.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 9e3c61b66a..7c6b93963c 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -852,11 +852,11 @@ virDomainPMWakeup(virDomainPtr dom, /** * virDomainSave: * @domain: a domain object - * @to: path for the output file + * @to: path for the output save file / directory * - * This method will suspend a domain and save its memory contents to - * a file on disk. After the call, if successful, the domain is not - * listed as running anymore (this ends the life of a transient domain). + * This method will suspend a domain and save its memory contents to a fil= e or + * direcotry (based on the vmm) on disk. After the call, if successful,the= domain + * is not listed as running anymore (this ends the life of a transient dom= ain). * Use virDomainRestore() to restore a domain after saving. * * See virDomainSaveFlags() and virDomainSaveParams() for more control. @@ -1053,7 +1053,7 @@ virDomainSaveParams(virDomainPtr domain, /** * virDomainRestore: * @conn: pointer to the hypervisor connection - * @from: path to the input file + * @from: path to the input save file / directory * * This method will restore a domain saved to disk by virDomainSave(). * --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 08:35:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151304002979.3485249108115; Mon, 11 Mar 2024 03:01:44 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id E64B51966; Mon, 11 Mar 2024 06:01:42 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0F2121E8B; Mon, 11 Mar 2024 05:45:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id A651E1A3F; Mon, 11 Mar 2024 05:44:15 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 51B831CCC for ; Mon, 11 Mar 2024 05:44:13 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 3C6EC20B74C5; Mon, 11 Mar 2024 02:44:12 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 3C6EC20B74C5 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 11/11] NEWS: Mention save & restore support for ch driver Date: Mon, 11 Mar 2024 09:44:07 +0000 Message-Id: <20240311094407.12217-12-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: HFSDCXAIR2HDPL4RUEWXB3OAFHTEUHSP X-Message-ID-Hash: HFSDCXAIR2HDPL4RUEWXB3OAFHTEUHSP X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151305044100001 Signed-off-by: Purna Pavan Chandra Aekkaladevi Reviewed-by: Michal Privoznik --- NEWS.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 44b775b546..e25265e1b0 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -16,6 +16,11 @@ v10.2.0 (unreleased) * **Removed features** =20 * **New features** + * ch: Basic save and restore support for ch driver + + The ch driver now supports basic save and restore operations. This i= s functional + on domains without any network, host device config defined. The `pat= h` parameter + for save and restore should be a directory. =20 * **Improvements** =20 --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org