From nobody Thu Sep 19 01:59:57 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1718319477; cv=none; d=zohomail.com; s=zohoarc; b=jjMFs6PmBr8EEIWVtf4pczk0/Jqrl+gSrcIIe4hv7o06kX91OLUhUxU0FWJW3sohL1W2xjxPWdetjjg93oGv1yN6ZJ6jJccnr8d/KUbFPCnyPl3mayBlwlQjb89+uftPIjtj1UY01JCXe+EVhIhtfECH5ZbWcrO24+RJXzwP6N4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319477; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=wDsPYM0bJTHJDqz1a2BhQbfnLqHWgwleHG9FE18Kpfs=; b=D+xVJx/FXtkdOQzhwf4Y6Ntz3WOPp8V/T8o07Vf1x9o0U8+cXtgHAQVEsLq2bIPSM34BAbhGGnok8y1XziuUSV67+DvwbIa4TZ0N3gHCEDihWmaq6HNuBdfGag50FJ5H/jK5yqeNX+MmmC2LDWby8z/BfnFAbQqvCgHM8F/ph6c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1718319477498558.5164171630112; Thu, 13 Jun 2024 15:57:57 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 60ECA1295; Thu, 13 Jun 2024 18:57:56 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 574D2126D; Thu, 13 Jun 2024 18:54:29 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D40551296; Thu, 13 Jun 2024 18:54:27 -0400 (EDT) Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8E6CD11FD for ; Thu, 13 Jun 2024 18:52:46 -0400 (EDT) Received: by mail-lj1-f181.google.com with SMTP id 38308e7fff4ca-2ec0f3b9cdbso3244051fa.0 for ; Thu, 13 Jun 2024 15:52:46 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b9568de216sm574410173.34.2024.06.13.15.52.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:44 -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=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1718319165; x=1718923965; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=T/DTDFlX+BphDLmZ3G6ywemH6t/QkDY+Ciw50E39TOc=; b=JetXAK/q14B4uR2btQ8MnXMhcuQXVs86oSUUJjHpYuf7TXK+X565idPOySjke/L2R+ D2xQKL19EA/JPD3Nrr/hr9HWmuCPezsz4XhDo8ZKd9eBQa5V8StyibYEGduMaaRLIPwK 5mwKFp3js1SmTA1hXcCpbp1oW+/4N/L/gnoeugvGCH2ncd8DEEG9Ww7A2Rm2bSRM1PJC ffSOM6rcc0+yu5tzDzQ55q59z5x4qs+4SwcYLnmQf+hzMB4dR61KEPzU7I3LIyS9deGd 9Mo5EzejQ5Pl2ZBp6Lk+ry2cwZxNdfy9OtDzj7DuAMhh1fL4Zy0WAtcO+LnK8ZsBSTVN 1wfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319165; x=1718923965; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T/DTDFlX+BphDLmZ3G6ywemH6t/QkDY+Ciw50E39TOc=; b=VzmszZhHOLxTG2lKw2s7JmgaGnQ8jBrRFkxfFI74NQpvutL91iqdGLMSL9Ah6wbZJ5 3OnQLfsMto/nvA+DAla9A6LIjobjNGwRW5WdzpFF3gBfKMFnZCKVvyUYMAbldWRaeg/G BTPCdwqSrH4E9Q3MvCTuGVUXlq+NpMRLRZxSuye79OPJwTPu9+vj1uUOXjLZu8/fd9jr jHyoEHHTVk6uKo0f+Tkzfg5wLYOpBugTzmmIeATo8vtJ+lFEa6K22Q9W99yrUT6hcvka FVQONVwcJZpUJApFt5IMfhFLxP0FuSPdnJY3CkfgynumVbxQs7amwF//T4BJYKH4scAa tlLg== X-Gm-Message-State: AOJu0YwLyhom/N4P78Y3nso3oSOHP7BEh7+J35e0GOnYJzR6NiiJNflg wH81ADLRZHxxxecQzYu3KGDXK+8PjGOgvlBysxX9PhAjxGnKJ1RovyZNu1DAimN0oGk5PbE3XcW t X-Google-Smtp-Source: AGHT+IH6PdDc6AIRHlOFatJL3TemeKFfglK4onvj/9rKiTh0MSXaE2CPErrqQTP99yyabOTk+laqPw== X-Received: by 2002:a2e:be0f:0:b0:2ec:12dd:d230 with SMTP id 38308e7fff4ca-2ec12ddd305mr3479161fa.35.1718319165188; Thu, 13 Jun 2024 15:52:45 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 7/9] qemu: Enable mapped-ram on restore Date: Thu, 13 Jun 2024 16:43:21 -0600 Message-ID: <20240613225228.10665-8-jfehlig@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240613225228.10665-1-jfehlig@suse.com> References: <20240613225228.10665-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 4VMC4VS5WY75775IEFWN6AHO4ANGIXYI X-Message-ID-Hash: 4VMC4VS5WY75775IEFWN6AHO4ANGIXYI X-MailFrom: jfehlig@suse.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 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: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1718319478619100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- src/qemu/qemu_migration.c | 19 +++++++++++---- src/qemu/qemu_migration.h | 3 ++- src/qemu/qemu_process.c | 49 ++++++++++++++++++++++++++++----------- src/qemu/qemu_process.h | 13 +++++++---- src/qemu/qemu_saveimage.c | 26 ++++++++++++++------- 5 files changed, 76 insertions(+), 34 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3110ef2621..b1d27e07e1 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2281,13 +2281,23 @@ qemuMigrationDstGetURI(const char *migrateFrom, int qemuMigrationDstRun(virDomainObj *vm, const char *uri, - virDomainAsyncJob asyncJob) + virDomainAsyncJob asyncJob, + unsigned int flags) { qemuDomainObjPrivate *priv =3D vm->privateData; int rv; =20 VIR_DEBUG("Setting up incoming migration with URI %s", uri); =20 + if (flags & VIR_QEMU_PROCESS_START_MAPPED_RAM) { + g_autoptr(qemuMigrationParams) migParams =3D NULL; + + if (!(migParams =3D qemuMigrationParamsForMappedSave())) + return -1; + + qemuMigrationParamsApply(vm, asyncJob, migParams, 0); + } + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) return -1; =20 @@ -2945,7 +2955,6 @@ qemuMigrationDstPrepare(virDomainObj *vm, unsigned short port, int fd) { - qemuDomainObjPrivate *priv =3D vm->privateData; g_autofree char *migrateFrom =3D NULL; =20 if (tunnel) { @@ -2999,8 +3008,8 @@ qemuMigrationDstPrepare(virDomainObj *vm, migrateFrom =3D g_strdup_printf(incFormat, protocol, listenAddress= , port); } =20 - return qemuProcessIncomingDefNew(priv->qemuCaps, listenAddress, - migrateFrom, fd, NULL); + return qemuProcessIncomingDefNew(vm, listenAddress, + migrateFrom, fd, NULL, 0); } =20 =20 @@ -3238,7 +3247,7 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, } =20 if (qemuMigrationDstRun(vm, incoming->uri, - VIR_ASYNC_JOB_MIGRATION_IN) < 0) + VIR_ASYNC_JOB_MIGRATION_IN, 0) < 0) goto error; =20 if (qemuProcessFinishStartup(driver, vm, VIR_ASYNC_JOB_MIGRATION_IN, diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index f845a0198b..864f3280e5 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -286,7 +286,8 @@ qemuMigrationDstGetURI(const char *migrateFrom, int qemuMigrationDstRun(virDomainObj *vm, const char *uri, - virDomainAsyncJob asyncJob); + virDomainAsyncJob asyncJob, + unsigned int flags); =20 void qemuMigrationSrcPostcopyFailed(virDomainObj *vm); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 7ef7040a85..f700390a8c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4684,28 +4684,43 @@ qemuProcessIncomingDefFree(qemuProcessIncomingDef *= inc) * qemuProcessIncomingDefFree will NOT close it. */ qemuProcessIncomingDef * -qemuProcessIncomingDefNew(virQEMUCaps *qemuCaps, +qemuProcessIncomingDefNew(virDomainObj *vm, const char *listenAddress, const char *migrateFrom, int fd, - const char *path) + const char *path, + unsigned int flags) { + qemuDomainObjPrivate *priv =3D vm->privateData; qemuProcessIncomingDef *inc =3D NULL; =20 - if (qemuMigrationDstCheckProtocol(qemuCaps, migrateFrom) < 0) + if (qemuMigrationDstCheckProtocol(priv->qemuCaps, migrateFrom) < 0) return NULL; =20 inc =3D g_new0(qemuProcessIncomingDef, 1); =20 inc->address =3D g_strdup(listenAddress); - - inc->uri =3D qemuMigrationDstGetURI(migrateFrom, fd); - if (!inc->uri) - goto error; - inc->fd =3D fd; inc->path =3D path; =20 + if (flags & VIR_QEMU_PROCESS_START_MAPPED_RAM) { + unsigned int fdsetId; + off_t offset; + + if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) + offset =3D 0; + + inc->fdPassMigrate =3D qemuFDPassNew("migrate", priv); + qemuFDPassAddFD(inc->fdPassMigrate, &fd, "-fd"); + qemuFDPassGetId(inc->fdPassMigrate, &fdsetId); + inc->uri =3D g_strdup_printf("file:/dev/fdset/%u,offset=3D%#lx", f= dsetId, offset); + } else { + inc->uri =3D qemuMigrationDstGetURI(migrateFrom, fd); + } + + if (!inc->uri) + goto error; + return inc; =20 error: @@ -7667,7 +7682,8 @@ qemuProcessLaunch(virConnectPtr conn, VIR_QEMU_PROCESS_START_AUTODESTROY | VIR_QEMU_PROCESS_START_NEW | VIR_QEMU_PROCESS_START_GEN_VMID | - VIR_QEMU_PROCESS_START_RESET_NVRAM, -1); + VIR_QEMU_PROCESS_START_RESET_NVRAM | + VIR_QEMU_PROCESS_START_MAPPED_RAM, -1); =20 cfg =3D virQEMUDriverGetConfig(driver); =20 @@ -7717,8 +7733,12 @@ qemuProcessLaunch(virConnectPtr conn, &nnicindexes, &nicindexes))) goto cleanup; =20 - if (incoming && incoming->fd !=3D -1) + if (incoming && incoming->fd !=3D -1) { virCommandPassFD(cmd, incoming->fd, 0); + if (incoming->fdPassMigrate !=3D NULL) { + qemuFDPassTransferCommand(incoming->fdPassMigrate, cmd); + } + } =20 /* now that we know it is about to start call the hook if present */ if (qemuProcessStartHook(driver, vm, @@ -8153,7 +8173,8 @@ qemuProcessStart(virConnectPtr conn, VIR_QEMU_PROCESS_START_PAUSED | VIR_QEMU_PROCESS_START_AUTODESTROY | VIR_QEMU_PROCESS_START_GEN_VMID | - VIR_QEMU_PROCESS_START_RESET_NVRAM, cleanup); + VIR_QEMU_PROCESS_START_RESET_NVRAM | + VIR_QEMU_PROCESS_START_MAPPED_RAM, cleanup); =20 if (!migrateFrom && !snapshot) flags |=3D VIR_QEMU_PROCESS_START_NEW; @@ -8163,8 +8184,8 @@ qemuProcessStart(virConnectPtr conn, goto cleanup; =20 if (migrateFrom) { - incoming =3D qemuProcessIncomingDefNew(priv->qemuCaps, NULL, migra= teFrom, - migrateFd, migratePath); + incoming =3D qemuProcessIncomingDefNew(vm, NULL, migrateFrom, + migrateFd, migratePath, flags= ); if (!incoming) goto stop; } @@ -8191,7 +8212,7 @@ qemuProcessStart(virConnectPtr conn, relabel =3D true; =20 if (incoming) { - if (qemuMigrationDstRun(vm, incoming->uri, asyncJob) < 0) + if (qemuMigrationDstRun(vm, incoming->uri, asyncJob, flags) < 0) goto stop; } else { /* Refresh state of devices from QEMU. During migration this happe= ns diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index c1ea949215..a5212ee56e 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -54,14 +54,16 @@ struct _qemuProcessIncomingDef { char *address; /* address where QEMU is supposed to listen */ char *uri; /* used when calling migrate-incoming QMP command */ int fd; /* for fd:N URI */ + qemuFDPass *fdPassMigrate; /* for file:/dev/fdset/n,offset=3Dx URI */ const char *path; /* path associated with fd */ }; =20 -qemuProcessIncomingDef *qemuProcessIncomingDefNew(virQEMUCaps *qemuCaps, - const char *listenAddr= ess, - const char *migrateFro= m, - int fd, - const char *path); +qemuProcessIncomingDef *qemuProcessIncomingDefNew(virDomainObj *vm, + const char *listenAddres= s, + const char *migrateFrom, + int fd, + const char *path, + unsigned int flags); void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc); =20 int qemuProcessBeginJob(virDomainObj *vm, @@ -77,6 +79,7 @@ typedef enum { VIR_QEMU_PROCESS_START_NEW =3D 1 << 4, /* internal, new VM is= starting */ VIR_QEMU_PROCESS_START_GEN_VMID =3D 1 << 5, /* Generate a new VMID= */ VIR_QEMU_PROCESS_START_RESET_NVRAM =3D 1 << 6, /* Re-initialize NVRAM= from template */ + VIR_QEMU_PROCESS_START_MAPPED_RAM =3D 1 << 7, /* Re-initialize NVRAM= from template */ } qemuProcessStartFlags; =20 int qemuProcessStart(virConnectPtr conn, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 8f28770086..1545c00472 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -628,6 +628,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, int oflags =3D open_write ? O_RDWR : O_RDONLY; size_t xml_len; size_t cookie_len; + bool use_mapped_ram =3D false; =20 if (bypass_cache) { int directFlag =3D virFileDirectFdFlag(); @@ -642,11 +643,6 @@ qemuSaveImageOpen(virQEMUDriver *driver, if ((fd =3D qemuDomainOpenFile(cfg, NULL, path, oflags, NULL)) < 0) return -1; =20 - if (bypass_cache && - !(*wrapperFd =3D virFileWrapperFdNew(&fd, path, - VIR_FILE_WRAPPER_BYPASS_CACHE))) - return -1; - data =3D g_new0(virQEMUSaveData, 1); =20 header =3D &data->header; @@ -708,10 +704,14 @@ qemuSaveImageOpen(virQEMUDriver *driver, return -1; } =20 - if (header->features && header->features !=3D QEMU_SAVE_FEATURE_MAPPED= _RAM) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("image contains unsupported features)")); - return -1; + if (header->features) { + if (header->features =3D=3D QEMU_SAVE_FEATURE_MAPPED_RAM) { + use_mapped_ram =3D true; + } else { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("image contains unsupported features)")); + return -1; + } } =20 if (header->cookieOffset) @@ -739,6 +739,11 @@ qemuSaveImageOpen(virQEMUDriver *driver, } } =20 + if (bypass_cache && !use_mapped_ram && + !(*wrapperFd =3D virFileWrapperFdNew(&fd, path, + VIR_FILE_WRAPPER_BYPASS_CACHE))) + return -1; + /* Create a domain from this XML */ if (!(def =3D virDomainDefParseString(data->xml, driver->xmlopt, qemuC= aps, VIR_DOMAIN_DEF_PARSE_INACTIVE | @@ -777,6 +782,9 @@ qemuSaveImageStartVM(virConnectPtr conn, if (reset_nvram) start_flags |=3D VIR_QEMU_PROCESS_START_RESET_NVRAM; =20 + if (header->features & QEMU_SAVE_FEATURE_MAPPED_RAM) + start_flags |=3D VIR_QEMU_PROCESS_START_MAPPED_RAM; + if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, path, NULL, = data, asyncJob, start_flags, "restored", &started) < 0) { --=20 2.44.0