From nobody Mon Sep 16 19:08:06 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=1718319294; cv=none; d=zohomail.com; s=zohoarc; b=WyMVBEjan4MwnBaOxJRDBxq+tWkts101xFqG4+avNXmd6jd6Ff7/+JHhZdDhwv84zHcH8rPLLM8YaztnnEPwZ2TWsPn6bDZQw0Tq36ERq1DYSNU+i6cpyP5vb0No7JXlQ4wRGsGX5CIr9OIIJh9BIl1/QXii8xJRVUIGiTKFc4s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319294; 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=gdeT2vHQ+K5ApbmJ4uyYDV2ldXfuCXzv9GZlXXvfy18=; b=ZhsSf1JJistMYdglcbBxEoyddjb1/2Frj5oAvL/fMR/L5xsKO7Kt9my8buPBdoq+uETvdEwlwdINMjLMHfguLmr0PSOVuxiH+UZBjUq5caSEdDtFAC98Pedx7vHyFMG9owXe1kFiFNjB2WjY6h4CItdIKEpc7gNBEmmwAxXG1es= 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 1718319294100422.75247948489766; Thu, 13 Jun 2024 15:54:54 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1234D11F9; Thu, 13 Jun 2024 18:54:53 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5D9EC127A; Thu, 13 Jun 2024 18:52:39 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6440911EA; Thu, 13 Jun 2024 18:52:35 -0400 (EDT) Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) (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 8F333C91 for ; Thu, 13 Jun 2024 18:52:34 -0400 (EDT) Received: by mail-lj1-f175.google.com with SMTP id 38308e7fff4ca-2eaea28868dso21194531fa.3 for ; Thu, 13 Jun 2024 15:52:34 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b956a5f4f7sm583699173.176.2024.06.13.15.52.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:32 -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=1718319153; x=1718923953; 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=RgabMJE0E9zD9seuX6RCb7OTaNskxBwEgRSTxa5hR04=; b=NNQxeYKf4ycNbZYTC9fnHcn4y0337lSP7NgqrFSfHDbt5uUKrHGK+VKAvEs9YA//yD rhvubrctdZ9ImGhOrEGCSimrM5iqs/+hVhEUpWHmjYTeVSFcBN5rOHH/NQRMStKjDJbG auP11CExwrdt/OkC9ef0GBAHTU1fClUMeigZW5Hg+sffszjil4hsmowSM4KQvM79OJ0q fmsAHwkGziufUb620FIFA8qKIDe+nFeyAy8NrDqETC/L4bGQqnVuY460nsno255TXs6p 0NXkP97uODqpyD15gFm5GKY4iLZxPJZ+2jjYytsLtb4m86oynoez3vwVrCkEVfqfeJJx 3QTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319153; x=1718923953; 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=RgabMJE0E9zD9seuX6RCb7OTaNskxBwEgRSTxa5hR04=; b=gADcyPEvctp8fSreIkEz2QLq8yNULllVrmyyLJXBYZzediaFhZ+fIEmIauhlaOJ7/Z 1n8IN/nkRApKOhrFV+yzmUIPHwSRy7tCmQb0DLQmNBlDf1fpGHBjkCeMmKbTk+cix0mu wzvQGkTz4qXUl+KubUl31ushBKc8L3DCqyHcypDvXM+5cxOmrnrvJBuAsqM29nfZIvfL ZkcI0aPnS5jtbKAX6tU9CpsxeBvFZLInlmPo1CcO/kRGKbaKir6iQx9o7ZDZWFytj45S UySoeAVxx0+7r3BYY6nKGanZI0iPPH1ghHRJSMhpIJvaTPsVXty+EsX0Xf11vr8GpJFG eOLw== X-Gm-Message-State: AOJu0Ywg/08xXsWIj6al6AbnHfg1nhjy9QhPVg2qjKGtSHOcbZmPMqDS eKUDDim5EKWchZi3R+l8uLna9MEheOvP8fNq6ugPUET1bBnbrv3ySYglIBRMV3A3SnIDeIEl/qO J X-Google-Smtp-Source: AGHT+IFJOj2F5XE0pzbGVu+5yJqEvhSv34jqrEqcvva/n7VUs6F+KfTgZ9Qen9SlQwjxt7b0l/oe6A== X-Received: by 2002:a2e:3c0a:0:b0:2eb:e746:d9fb with SMTP id 38308e7fff4ca-2ec0e5c9d69mr7922811fa.50.1718319153292; Thu, 13 Jun 2024 15:52:33 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 1/9] qemu: Enable mapped-ram migration capability Date: Thu, 13 Jun 2024 16:43:15 -0600 Message-ID: <20240613225228.10665-2-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: WALQXZFF63GYUGRRKYRY7LAVGBA4SZGR X-Message-ID-Hash: WALQXZFF63GYUGRRKYRY7LAVGBA4SZGR 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: 1718319295669100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- src/qemu/qemu_migration_params.c | 1 + src/qemu/qemu_migration_params.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 48f8657f71..201286e58c 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -105,6 +105,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, "return-path", "zero-copy-send", "postcopy-preempt", + "mapped-ram", ); =20 =20 diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index 91bc6792cd..a14b189b48 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -41,6 +41,7 @@ typedef enum { QEMU_MIGRATION_CAP_RETURN_PATH, QEMU_MIGRATION_CAP_ZERO_COPY_SEND, QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT, + QEMU_MIGRATION_CAP_MAPPED_RAM, =20 QEMU_MIGRATION_CAP_LAST } qemuMigrationCapability; --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319318; cv=none; d=zohomail.com; s=zohoarc; b=UnNwlzqRQ7jPpEQ6OUruuQSUPSzRzyaS6NSJC1eNKkq782SB5KvDZVunbSH4jch2nObqZnJD2kEA4TEGBIlM5aprZ2wg6AVBVt1WqhnDbJ95VHhojhTbRRm+aWR/gI8yikVpevNCzMSSP6vaYwRv2ZzmROCfv1Q/JmsFm1gTp84= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319318; 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=PRbwi4wVisSvK0D7ZMg46V3d2J5Hlvk2XLl9u3AXhFw=; b=iuztX+yAr/V2SvI+vpH3hgknnqk0ZHQYtM61QSSWW5d/QPivVnYewyNuZUmXIytYJptalsgdOD1OV2JNIB2WZxrIdqmbPDTrYb8ZnFYobDVjCA73RiDm7r2XWHgGTS2+Khm6Ap4jSq1FPtkk8tmbb/y6QLeZbdamHiV/q0yhIwA= 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 171831931791743.883765081907995; Thu, 13 Jun 2024 15:55:17 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DDDAD123F; Thu, 13 Jun 2024 18:55:16 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id AC2F91264; Thu, 13 Jun 2024 18:53:34 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 485BA129B; Thu, 13 Jun 2024 18:53:32 -0400 (EDT) Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (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 9536A1247 for ; Thu, 13 Jun 2024 18:52:36 -0400 (EDT) Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-2e95a75a90eso16134221fa.2 for ; Thu, 13 Jun 2024 15:52:36 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-7ebdba39d7bsm52432639f.20.2024.06.13.15.52.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:34 -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=1718319155; x=1718923955; 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=2O1J4Qqxq0iCjaScaAA2h569FJvuXTUNghZswmTDyV0=; b=DBmbfVVRv1OY6NDRrEn2IlpvIvQWqfYDES1Axtlqx0qEtLWfJ2xWC/KKurvjC/trg7 tJmTmLd9ej4t+CrkIYOCUllD00KTjO4P1oAJkco1vxRRarBRa91urNFm7dy1YdoDSou3 MiXy6mfxQNjIxQi8Ls1R6r5XcOUI3bBD1ApAMmFWHlEtTw1IIq+G9mCythg1ow68mRVy sZNJ4+IwO2LTNkyuIkt7Qo7kfpYsMUMyt6lF9ZIxnOtb/9pEcHxONDCj1XqyBG89y7Wt SHF7EKSaSzvYWXMlNKY6I5RADmEvy2P5duKLoRjy8ZFO5uIeDazHTovSqlS1Ma35/qAz VijQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319155; x=1718923955; 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=2O1J4Qqxq0iCjaScaAA2h569FJvuXTUNghZswmTDyV0=; b=cpWYygfKQbDZvOOdbxWpky68vs/i4jV3IkgoJtmndMUunAUSqTQrnF2iWjbTqMXDk6 QyG3pUz3QZBFqQUyqGKXSz4uL+xIe523WtCN2tLt4mJD2eZjsJvt5MrF4wJI4iIfpnlT 6yCF4hva4Y3/TLVTGD4EdkDwja5kI8L5SvpkphNpZ8Xr1b5BPyKBEpThFYmYHFxDqrPO zMBndw/u6eXyRPYpp3TtIPFrDqopjMuI4NBQThF42QXZfyBjTTbvm2EEyNmUHEtukXV1 o+mpT9JNJOjelM/ifyh20qqdbu6Z8G/+2Zh/gZm1dc4prstuqSQ6yYDU6fY9Mz+lrMov kL4g== X-Gm-Message-State: AOJu0YyDditNjHAoKavw/Q3pA0JcjAOnLQ2Im2vVa5gVJhxUsY+P19jJ /R+QSAskVx1SZcO+KRB26Xhj335KPI71r/AGeHpMUBT4HKfWQDFh4G0i4LsiKMX3X9Jwm4zc7dE H X-Google-Smtp-Source: AGHT+IHB9WcVkdMpzJX/1htbC5iI2GlOKOaW9XRaQysbFvynO0YJa43LU/7CI2zfIUFmoB2eWwBlLA== X-Received: by 2002:a2e:8791:0:b0:2ec:1611:451 with SMTP id 38308e7fff4ca-2ec161104b1mr1712481fa.3.1718319155219; Thu, 13 Jun 2024 15:52:35 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 2/9] qemu_fd: Add function to retrieve fdset ID Date: Thu, 13 Jun 2024 16:43:16 -0600 Message-ID: <20240613225228.10665-3-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: 22NTWPESU5HTI3TVFQ35NMZ5YFY6SVZB X-Message-ID-Hash: 22NTWPESU5HTI3TVFQ35NMZ5YFY6SVZB 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: 1718319319810100001 Content-Type: text/plain; charset="utf-8" Add new function qemuFDPassGetId(), to be used when adding support for mapped-ram save format. Signed-off-by: Jim Fehlig --- src/qemu/qemu_fd.c | 18 ++++++++++++++++++ src/qemu/qemu_fd.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/src/qemu/qemu_fd.c b/src/qemu/qemu_fd.c index e847056573..3ae4a87a20 100644 --- a/src/qemu/qemu_fd.c +++ b/src/qemu/qemu_fd.c @@ -276,6 +276,24 @@ qemuFDPassGetPath(qemuFDPass *fdpass) } =20 =20 +/** + * qemuFDPassGetId: + * @fdpass: The fd passing helper struct + * @id: An out parameter for providing the fdset ID + * + * Returns 0 on success, -1 on error. + */ +int +qemuFDPassGetId(qemuFDPass *fdpass, unsigned int *id) +{ + if (!fdpass) + return -1; + + *id =3D fdpass->fdSetID; + return 0; +} + + struct _qemuFDPassDirect { int fd; char *name; diff --git a/src/qemu/qemu_fd.h b/src/qemu/qemu_fd.h index cd0ff2c690..dfcd5fb754 100644 --- a/src/qemu/qemu_fd.h +++ b/src/qemu/qemu_fd.h @@ -58,6 +58,9 @@ qemuFDPassTransferMonitorRollback(qemuFDPass *fdpass, const char * qemuFDPassGetPath(qemuFDPass *fdpass); =20 +int +qemuFDPassGetId(qemuFDPass *fdpass, unsigned int *id); + =20 typedef struct _qemuFDPassDirect qemuFDPassDirect; =20 --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319340; cv=none; d=zohomail.com; s=zohoarc; b=Ry5+IspEZA8PtKqLXVSdl/WrL5yJPeWDUCbSxl/8QVBVBjknMt2CwIoiFp7KJEB7d/bDpjMAY910qK4wj5O6dDnSurKiMhsaMyje4BIwVrrWegInin543BKMo6sNp0p1tkdWKFGHP9AQhKvTPaeA1hh0cSzvRRmQ/z3XdPS8Ksg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319340; 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=xx7ph8edMWVmKejSYn6xDMckjyo663Vsqz4T8Aq84xA=; b=CsVsAxWO+mV6qz+4dD5Mj3i56pmkn8qlxid6YmgZ1hmfs0DrhasQ5H4u9W5qRXW7ISW1OC+Dihkq1Z9Po8K2/maHy274B6O9/hXHSU7gDLIAyPlepMdkInVq+qOudtSGppac+cZEUy4N+GaoAfiJFjBUtYm0hjbMHKjg5X4uBBc= 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 1718319340502376.38698520271896; Thu, 13 Jun 2024 15:55:40 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6CCB3129F; Thu, 13 Jun 2024 18:55:39 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id EF94A12A2; Thu, 13 Jun 2024 18:53:38 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C251E12A0; Thu, 13 Jun 2024 18:53:35 -0400 (EDT) Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) (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 6719C1269 for ; Thu, 13 Jun 2024 18:52:38 -0400 (EDT) Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-2ebe40673e8so15212211fa.3 for ; Thu, 13 Jun 2024 15:52:38 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b9568ddeb0sm582342173.3.2024.06.13.15.52.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:36 -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=1718319157; x=1718923957; 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=dE/e+I6BauzdxmnwWirFXHQZL5WLgzHGglBEMPOfGKs=; b=E8F0wFxIM4xXJqfb5BR+TdJgXcpAMFmsXXZkbZzrbRdtrF76G7CAJIP9K63KxiVvx+ w0A1/So7s71XoLtnNEqjTv31kp7uwO37XPYM2roc74B0qUamLzBrVz/PHCKzXwsK7HOy Gp8iJyAwqfx0UDnkCRCU+t6E9tdL3kazmXy463XT6+rp5AgIim/PE4ePHzZ76jSCa2oc 2WenCFmssTBumKF1em31+Q5z7EZNV9VQHvpApYTb6oCCSONmIOv+Mok4BQt8knt/jHG7 FMaQEgTZpfheGASFduv8vj7VJOAjN+eQSF19Jhe1jpK1YIunkewhxcSNMog9hBx9EEQd E/eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319157; x=1718923957; 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=dE/e+I6BauzdxmnwWirFXHQZL5WLgzHGglBEMPOfGKs=; b=sc1n8YjHJY3QJ5eop85V1EWy/4ObBDUjBTme2G/EQCREBeVvkXkKEWulKh1AjCbTw+ B5Zc+y/xmpa5m0m2Qm5PkdcVo3Z0oXGk/T14Tz8sLjo9Rds5ZgtbedADdCKh4JqC7Jeg 9vFsDQIk160yMc/GCuwEknEqmmNFyj3JFPlBhQM55O+vYyYU/OMTxU4lBNhqoq/z8Tov RqJNaTMgOF85h89snUnNZ5y50Cb19JFBL2TotMS0ZoI0WNeDbMNrznQ0MF6KcWL0hC9n 0MG/YitX1zyZv0Y7w7aVXAqfjP3eKyTNd+rOpYQroC/JQAkifsKuZHhY3L8p+x6YBzM4 Ma8Q== X-Gm-Message-State: AOJu0YzG4cMw7zOOuLROOzvUItF7dyOjSp2Ciz/tNMhXAe95+1lCVVgH TMTC/L74oGqBdJvIhPwhTlQoIzLyLyemyOO86n0602ZwTvxh048xf4u6bPJEhP2olbKDYFN3W6j 5 X-Google-Smtp-Source: AGHT+IF+JMH7BTXXaIp3jltCyFx/tkPgXJ7iJOKPngdytrVku8O4Y8ff9m2bVPZPx2uLSTHMNVT/nw== X-Received: by 2002:a05:651c:221f:b0:2ec:1042:fafc with SMTP id 38308e7fff4ca-2ec1042fbdemr3846611fa.0.1718319157130; Thu, 13 Jun 2024 15:52:37 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 3/9] qemu: Add function to get migration params for save Date: Thu, 13 Jun 2024 16:43:17 -0600 Message-ID: <20240613225228.10665-4-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: 7XQCLYEDUAJSHUGCPQ25G2VHGDCUQMVE X-Message-ID-Hash: 7XQCLYEDUAJSHUGCPQ25G2VHGDCUQMVE 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: 1718319341936100001 Content-Type: text/plain; charset="utf-8" Introduce qemuMigrationParamsForMappedSave() to create a qemuMigrationParams object initialized with appropriate migration capabilities and parameters for a save operation using mapped-ram. Note that mapped-ram also requires the multifd capability. For now, the number of multifd channels is set to 1. Future work to support parallel save/restore can set the number of channels specified by the user. Signed-off-by: Jim Fehlig --- src/qemu/qemu_migration_params.c | 19 +++++++++++++++++++ src/qemu/qemu_migration_params.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 201286e58c..96698bde9f 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -781,6 +781,25 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr para= ms, } =20 =20 +qemuMigrationParams * +qemuMigrationParamsForMappedSave(void) +{ + g_autoptr(qemuMigrationParams) saveParams =3D NULL; + + if (!(saveParams =3D qemuMigrationParamsNew())) + return NULL; + + if (virBitmapSetBit(saveParams->caps, QEMU_MIGRATION_CAP_MAPPED_RAM) <= 0) + return NULL; + if (virBitmapSetBit(saveParams->caps, QEMU_MIGRATION_CAP_MULTIFD) < 0) + return NULL; + saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].value.i =3D = 1; + saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].set =3D true; + + return g_steal_pointer(&saveParams); +} + + int qemuMigrationParamsDump(qemuMigrationParams *migParams, virTypedParameterPtr *params, diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index a14b189b48..0f3ed07384 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -85,6 +85,9 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, unsigned int flags, qemuMigrationParty party); =20 +qemuMigrationParams * +qemuMigrationParamsForMappedSave(void); + int qemuMigrationParamsDump(qemuMigrationParams *migParams, virTypedParameterPtr *params, --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319361; cv=none; d=zohomail.com; s=zohoarc; b=HodCkshs7qd5Je5JL0YO1I2EKTUJY0Uuv8hNgmExbeeFGwPLQnyYDM/JCRxlbbCFiU8Mf6hZcT+L/qmzwUdYhIsPXyp0pubJANbZTaluD3n/i0bMupKsZtfoGlBKMcWkiW3AvKNSYmgPqgzYC2xNAWm66lBWZIYi+FS5UrjQyGI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319361; 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=Cn27G0rvAZUCFD4J5Zou8rdZiUpUGqTuQsnVQl7dTo4=; b=kqvr8Or2hSJGX3vrM0n/jtNJXsJgKpozinA6kmkncPMqr2Wk/DQ/HkbchsNOHAG10nZrxtmPTqyUaNM2J7fvviKX+iDaq7N/oG2eBO+C6KUwPvi5235NIMZrp+3j14uEn1fYD/vi+Vj2b5PFZWBTbAuZpqwHeQOHc996jv0Cseg= 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 1718319361664796.2029131354103; Thu, 13 Jun 2024 15:56:01 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 8602A1281; Thu, 13 Jun 2024 18:56:00 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 3EC28129D; Thu, 13 Jun 2024 18:53:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6AC12129A; Thu, 13 Jun 2024 18:53:36 -0400 (EDT) Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (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 3C947127E for ; Thu, 13 Jun 2024 18:52:40 -0400 (EDT) Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-2ec002caeb3so20107981fa.2 for ; Thu, 13 Jun 2024 15:52:40 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b956df737asm574574173.76.2024.06.13.15.52.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:38 -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=1718319159; x=1718923959; 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=7cTy2JbbSOhpb00Oq7WlFCt/kJn3RSHeMWdvZ8gXKNw=; b=LUqgG7n1vXtiWQ6VqKih8WbvImS7XOYRXSbFdghaKxi/SRvnqqn4IYfz6xj8y3AJdP Y7RL09H6lBj1qbfhf/fFzOe28tPxEtpFiECZPUwCTQw3fxUXemMpb+jj36js++iMpgwd NmrV5nIJrycwgUYOg1xq4mS8ADJW4t3CvF8y0221mhff+QvyDS2GKCVOPVHVYw9qeEUk D8eAxUr2zh4VHMpkdDqoID5TeFlWybkcEH5CN0GHuCd7UoM+R/7bQUqem6zshcaNoG8X IYChEVzIZzLFyLO8bm7oJKsBo50KGpkN+1pO5slqd4KdSxxhYclToIFQReG+6ffl2m1E I8uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319159; x=1718923959; 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=7cTy2JbbSOhpb00Oq7WlFCt/kJn3RSHeMWdvZ8gXKNw=; b=FHdKGuG/Z/7WieFwSoKDsOAJ9X0JYhraZJmIasL2p5YyPqft+DqRTTpKxId/x8Cvnm tSE30N7Oz8Wax8yAvJmfmHcN974IEQ5rKWegQ6yPIePQOTjeWoCvjethZOq28WEYjCON F+NzTgcLvmbgiDl1sls3D5xRuegMX23oc1uR1gL1tqH+mOqwHSmT8Qt4N5YUnHnmw85f 2c1UScVCFbQ/lQPz1YNIkMAsRaP/+bIMWGn3IIgkC4G1uxrtaYlPmxFhhfk9Q/biIY3B YBqfSkHp9aFzYgfFMRy6DifzOQmkw1ZB9kEJVfazgVTTiWG2GnqkvUTJEQAh53G1dhOU NxCA== X-Gm-Message-State: AOJu0YxmiJsSHBwU1xGVSrn7GttrZYCBkKbgRfnyX1nhEy2AfEF/Jlvo V4aTnCfewclSJQJtJCx906/Hz4YTxoMV/d8s3QAbt7wMwgj+C27sr3JzDBsY3IAeuJiBsHYw42I d X-Google-Smtp-Source: AGHT+IFqVQ0zhcG7F2iAMmTqnqBbc+Q6U+rFgk5e0hJsCtWx7s+euj0F8mAo9lVLNU4ROSZRIxb1tA== X-Received: by 2002:a2e:7d02:0:b0:2ec:1682:b4dd with SMTP id 38308e7fff4ca-2ec1682bb67mr913851fa.7.1718319159015; Thu, 13 Jun 2024 15:52:39 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 4/9] qemu: Add a 'features' element to save image header and bump version Date: Thu, 13 Jun 2024 16:43:18 -0600 Message-ID: <20240613225228.10665-5-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: RQC6GLU2PDCLY45SWCCFFW4BTRIN7I62 X-Message-ID-Hash: RQC6GLU2PDCLY45SWCCFFW4BTRIN7I62 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: 1718319362051100001 Content-Type: text/plain; charset="utf-8" QEMU's new mapped-ram stream format [1] is incompatible with the existing sequential format. In order to support the new format in libvirt, a new 'features' element is added to the saved image header. This element can be used now indicate the use of mapped-ram feature, and provides a mechanism to support future save image features. An older libvirt that is unaware of mapped-ram must not attempt to open and restore a mapped-ram saved image. ATM, this can only be done by bumping the save image version. [1] https://gitlab.com/qemu-project/qemu/-/blob/master/docs/devel/migration= /mapped-ram.rst?ref_type=3Dheads Signed-off-by: Jim Fehlig --- src/qemu/qemu_saveimage.c | 7 +++++++ src/qemu/qemu_saveimage.h | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 018ab5a222..50fec33f54 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -74,6 +74,7 @@ qemuSaveImageBswapHeader(virQEMUSaveHeader *hdr) hdr->was_running =3D GUINT32_SWAP_LE_BE(hdr->was_running); hdr->compressed =3D GUINT32_SWAP_LE_BE(hdr->compressed); hdr->cookieOffset =3D GUINT32_SWAP_LE_BE(hdr->cookieOffset); + hdr->features =3D GUINT32_SWAP_LE_BE(hdr->features); } =20 =20 @@ -637,6 +638,12 @@ 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->cookieOffset) xml_len =3D header->cookieOffset; else diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index e541792153..9dd7de292d 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -28,10 +28,14 @@ */ #define QEMU_SAVE_MAGIC "LibvirtQemudSave" #define QEMU_SAVE_PARTIAL "LibvirtQemudPart" -#define QEMU_SAVE_VERSION 2 +#define QEMU_SAVE_VERSION 3 =20 G_STATIC_ASSERT(sizeof(QEMU_SAVE_MAGIC) =3D=3D sizeof(QEMU_SAVE_PARTIAL)); =20 +typedef enum { + QEMU_SAVE_FEATURE_MAPPED_RAM =3D 1 << 0, +} qemuSaveFeatures; + typedef struct _virQEMUSaveHeader virQEMUSaveHeader; struct _virQEMUSaveHeader { char magic[sizeof(QEMU_SAVE_MAGIC)-1]; @@ -40,7 +44,8 @@ struct _virQEMUSaveHeader { uint32_t was_running; uint32_t compressed; uint32_t cookieOffset; - uint32_t unused[14]; + uint32_t features; + uint32_t unused[13]; }; =20 =20 --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319398; cv=none; d=zohomail.com; s=zohoarc; b=hgFZD1hvI7eG9qRLj8LU5h9MsLJebUyioQFPrlDQ1cnqX304RJgSfm/CWyN4901jJM3mv/5YJVoh7ck9cqTS249YV8v3+M3Uf8MzECCOVg7BMecDwHHv+DyhVJgQprS0E3D8Ms1ILr07Kk8OQQe913WlcVtzKgjLq/QJvOHnZqo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319398; 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=PAJvD6ZIZre3Ip1q6nPtwgugnd4IvLSzaD76IrAu5hw=; b=hwpB2K7yvMUH+IObiPWYlpKMkZNbT9Wz0WfiHUjXPqNRWXpVaABgFOycEdvDt5TjOz7JXTfd0VgZu8TFD3E91dp4JuI3YiMVrjFD2aYCurqAeBpewXHBv4ukummm59naS25SNWwfcI6Wnqr3RQh6IM32HBwud3LUKL5iHe1OoMs= 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 1718319398614433.51176114127; Thu, 13 Jun 2024 15:56:38 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 8D7A51264; Thu, 13 Jun 2024 18:56:37 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 9A9E11202; Thu, 13 Jun 2024 18:53:42 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D2161129C; Thu, 13 Jun 2024 18:53:39 -0400 (EDT) Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) (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 5285D1282 for ; Thu, 13 Jun 2024 18:52:42 -0400 (EDT) Received: by mail-lj1-f176.google.com with SMTP id 38308e7fff4ca-2e78fe9fc2bso18805341fa.3 for ; Thu, 13 Jun 2024 15:52:42 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b956a5f4dfsm595666173.177.2024.06.13.15.52.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:40 -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=1718319161; x=1718923961; 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=6Jh3/fyH6EI9JpQvA7X2njO6QvG6pGmjXBv1CQHvLd8=; b=ge64TePFVAebhsDY27uY1TX3+efFjdBXS97aG3w3xFaUiZPgCwgFpH8fyXqHMkUgy9 JSv7ydPWQKetd/m0Dqg5cmpLyYWeOIo9CjeTSl6cnqEb3EeObtXQ/KVxf2UssjfUlSuC kXkRSKVS6nfGMv7xCZw31bumNaDYxN7RgIT5m7OYmGCjn/mMBhRlpd/PB8xgfceo8GPB T/tzXeA1KYRrJEjShmGQUevikgGRJMTJUuRwAFcrsg5WnsTMyk7TXOuZx9ECCDFc2Mum u/6Bh67oFk8K+6q1S6nbdHVw66ls1TZYAQMvdKMvrwHHpn+PFr8vBFecl2BPETKAM7G8 PQ+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319161; x=1718923961; 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=6Jh3/fyH6EI9JpQvA7X2njO6QvG6pGmjXBv1CQHvLd8=; b=F6fhIK+sndy1x/Q+mNOze8jJaBQ+SWpWT2QwO5yY81dBtxak6Q/K1dtrIaMP6aMhr4 FKaNUNf/fccgwNLx4sWh/K8VoxDK10ufE6kyr2If9rCnTg2lSJqc/Q2UbtYviYctMe7B KKnoQqP+9OIEZNBx37Q/oboAuwGZwTfqLsdSB6wBwt/LaRdzQKuwiC9IPCyF3lBJ1GNq AyeWmUNH5BwSZnBHWuS9xTI84iC7wegX1z/Z6RyMozKIs0nTcfdSwFdiPsj8CZLS4w6D eeXhQZ/j2Pe1M5DSFXNrOcd4mBKhA9ayWRvLX/LFLlmCmA2FUZx7QM+XfMRVUNOmjVEM eFUg== X-Gm-Message-State: AOJu0YxUWpbagf+XzkSjP41F99ZxK3OgyQ5naurvOVL9+djgAR1THtsp PhxkpCOXs8jhulE7I0G5un8TbANUEsPtPbvAX4or4wCyJc34Xxc6moe3yv2bPXotvNjj+ejiSNm Q X-Google-Smtp-Source: AGHT+IF3orjiVvaRkvnjDE1scFTuRcdInArZqRf3lM43wXSfme/EPcWc4atqYE9Mr7/EvkYppIUquA== X-Received: by 2002:a2e:904c:0:b0:2eb:eb0f:a822 with SMTP id 38308e7fff4ca-2ec0e5d0c7emr5558431fa.24.1718319160994; Thu, 13 Jun 2024 15:52:40 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 5/9] qemu: conf: Add setting for save image version Date: Thu, 13 Jun 2024 16:43:19 -0600 Message-ID: <20240613225228.10665-6-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: S7MMBCMZBEXZQODUD32DXZZSH75MFCEO X-Message-ID-Hash: S7MMBCMZBEXZQODUD32DXZZSH75MFCEO 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: 1718319400260100001 Content-Type: text/plain; charset="utf-8" Add a 'save_image_version' setting to qemu.conf to control the image version when saving a VM with 'virsh save' or 'virsh managedsave'. Default to the new version 3. Signed-off-by: Jim Fehlig --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf.in | 6 ++++++ src/qemu/qemu_conf.c | 8 ++++++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 3 +-- src/qemu/qemu_saveimage.c | 19 ++++++++++++++----- src/qemu/qemu_saveimage.h | 6 +++--- src/qemu/qemu_snapshot.c | 4 ++-- src/qemu/test_libvirtd_qemu.aug.in | 1 + 9 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index 2b6526538f..acbfcd9fc3 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -92,6 +92,7 @@ module Libvirtd_qemu =3D | str_array_entry "namespaces" =20 let save_entry =3D str_entry "save_image_format" + | int_entry "save_image_version" | str_entry "dump_image_format" | str_entry "snapshot_image_format" | str_entry "auto_dump_path" diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in index 6bc2140dcb..b5df8c1cc6 100644 --- a/src/qemu/qemu.conf.in +++ b/src/qemu/qemu.conf.in @@ -590,6 +590,11 @@ # at scheduled saving, and it is an error if the specified save_image_form= at # is not valid, or the requested compression program can't be found. # +# save_image_version is applicable when using 'virsh save' or 'virsh manag= ed-save'. +# Currently only versions 2 and 3 are supported, with version 3 being the = default. +# If saved images must be compatible with an older libvirt without this se= tting, +# then set save_image_format_version to 2. +# # dump_image_format is used when you use 'virsh dump' at emergency # crashdump, and if the specified dump_image_format is not valid, or # the requested compression program can't be found, this falls @@ -601,6 +606,7 @@ # or the requested compression program can't be found. # #save_image_format =3D "raw" +#save_image_version =3D 3 #dump_image_format =3D "raw" #snapshot_image_format =3D "raw" =20 diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 4050a82341..3ed17165b8 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -66,6 +66,10 @@ VIR_LOG_INIT("qemu.qemu_conf"); #define QEMU_MIGRATION_PORT_MIN 49152 #define QEMU_MIGRATION_PORT_MAX 49215 =20 +/* Need to reconsile definition here and in qemu_saveimage.h */ +#define QEMU_SAVE_VERSION 3 + + VIR_ENUM_IMPL(virQEMUSchedCore, QEMU_SCHED_CORE_LAST, "none", @@ -246,6 +250,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->migrationPortMin =3D QEMU_MIGRATION_PORT_MIN; cfg->migrationPortMax =3D QEMU_MIGRATION_PORT_MAX; =20 + cfg->saveImageVersion =3D QEMU_SAVE_VERSION; + /* For privileged driver, try and find hugetlbfs mounts automatically. * Non-privileged driver requires admin to create a dir for the * user, chown it, and then let user configure it manually. */ @@ -610,6 +616,8 @@ virQEMUDriverConfigLoadSaveEntry(virQEMUDriverConfig *c= fg, { if (virConfGetValueString(conf, "save_image_format", &cfg->saveImageFo= rmat) < 0) return -1; + if (virConfGetValueUInt(conf, "save_image_version", &cfg->saveImageVer= sion) < 0) + return -1; if (virConfGetValueString(conf, "dump_image_format", &cfg->dumpImageFo= rmat) < 0) return -1; if (virConfGetValueString(conf, "snapshot_image_format", &cfg->snapsho= tImageFormat) < 0) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 36049b4bfa..30f5c2151e 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -193,6 +193,7 @@ struct _virQEMUDriverConfig { bool securityRequireConfined; =20 char *saveImageFormat; + unsigned int saveImageVersion; char *dumpImageFormat; char *snapshotImageFormat; =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e2698c7924..f9761242d2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2696,8 +2696,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver, if (!(cookie =3D qemuDomainSaveCookieNew(vm))) goto endjob; =20 - if (!(data =3D virQEMUSaveDataNew(xml, cookie, was_running, compressed, - driver->xmlopt))) + if (!(data =3D virQEMUSaveDataNew(driver, xml, cookie, was_running, co= mpressed))) goto endjob; xml =3D NULL; =20 diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 50fec33f54..30085dc7bc 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -95,25 +95,34 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUSaveData, virQEMUS= aveDataFree); * This function steals @domXML on success. */ virQEMUSaveData * -virQEMUSaveDataNew(char *domXML, +virQEMUSaveDataNew(virQEMUDriver *driver, + char *domXML, qemuDomainSaveCookie *cookieObj, bool running, - int compressed, - virDomainXMLOption *xmlopt) + int compressed) { virQEMUSaveData *data =3D NULL; virQEMUSaveHeader *header; + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); =20 data =3D g_new0(virQEMUSaveData, 1); =20 if (cookieObj && !(data->cookie =3D virSaveCookieFormat((virObject *) cookieObj, - virDomainXMLOptionGetSaveCook= ie(xmlopt)))) + virDomainXMLOptionGetSaveCook= ie(driver->xmlopt)))) goto error; =20 header =3D &data->header; memcpy(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)); - header->version =3D QEMU_SAVE_VERSION; + + if (cfg->saveImageVersion < 2 || cfg->saveImageVersion > QEMU_SAVE_VER= SION) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("Invalid save image version %1$u"), + cfg->saveImageVersion); + goto error; + } + header->version =3D cfg->saveImageVersion; + header->was_running =3D running ? 1 : 0; header->compressed =3D compressed; =20 diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 9dd7de292d..63ad5508ed 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -123,11 +123,11 @@ virQEMUSaveDataWrite(virQEMUSaveData *data, const char *path); =20 virQEMUSaveData * -virQEMUSaveDataNew(char *domXML, +virQEMUSaveDataNew(virQEMUDriver *driver, + char *domXML, qemuDomainSaveCookie *cookieObj, bool running, - int compressed, - virDomainXMLOption *xmlopt); + int compressed); =20 void virQEMUSaveDataFree(virQEMUSaveData *data); diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index f5260c4a22..1d75208814 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1390,9 +1390,9 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *drive= r, !(snapdef->cookie =3D (virObject *) qemuDomainSaveCookieNew(vm= ))) goto cleanup; =20 - if (!(data =3D virQEMUSaveDataNew(xml, + if (!(data =3D virQEMUSaveDataNew(driver, xml, (qemuDomainSaveCookie *) snapdef->= cookie, - resume, compressed, driver->xmlopt= ))) + resume, compressed))) goto cleanup; xml =3D NULL; =20 diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qe= mu.aug.in index b97e6de11e..8bcb332020 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -70,6 +70,7 @@ module Test_libvirtd_qemu =3D { "8" =3D "/dev/userfaultfd" } } { "save_image_format" =3D "raw" } +{ "save_image_version" =3D "3" } { "dump_image_format" =3D "raw" } { "snapshot_image_format" =3D "raw" } { "auto_dump_path" =3D "/var/lib/libvirt/qemu/dump" } --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319435; cv=none; d=zohomail.com; s=zohoarc; b=XCzr10u91dbHSDaxun27zcDTu0X+8PoPpSzk5FiKaKiQR9yWQc/vbczrLn+zbo2jGMnl9/Y+k5VbXMzzLZe2CiXrkcAtbutX8Z+zNyuX8r6Aufv3NHSgUYaXqVN9r291brMUme2rDhwWUnvFd7Tq8BiMsEwYgD6OfSWRmwa51E8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319435; 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=qLHhFwtvA+42q5TuT2eH4+lMo12AbQg7W/P/q1dZc+s=; b=l+LdrbIsawxR0kbWAYrY+zZiPKelWDZAgJPcsM5SmCY9SeFqZxKSEjMUQrd7srHgWJvvpwu9b1lnF13F9BdJOGe6t8waBXPCLQPZ8durZm6V5+XFjrD6wlZyvqPi/FlhWQBfW7M0K6IxogDxPpfGaIo+adA1obtydujMkYD8ty4= 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 1718319435046329.9360603904307; Thu, 13 Jun 2024 15:57:15 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C7F951275; Thu, 13 Jun 2024 18:57:13 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id EBFE112B0; Thu, 13 Jun 2024 18:53:43 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5C63A12AA; Thu, 13 Jun 2024 18:53:41 -0400 (EDT) Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (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 51AB711EC for ; Thu, 13 Jun 2024 18:52:44 -0400 (EDT) Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-2eaafda3b5cso17982481fa.3 for ; Thu, 13 Jun 2024 15:52:44 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4b9569e8f94sm612884173.89.2024.06.13.15.52.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:42 -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=1718319163; x=1718923963; 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=HuMqZhiI8mcxfHbacNPVnCAMh/8vHkU7mdGHgJIgOTk=; b=Rb/fcKcsa5I3v7SOc8t3Ydpy5QXuxjwM9qPxLQtxPNojfrqPHqUDLN5e6eAn3pZhVz 8yNXNV9gx6MR/vK1ffDtd5K211GFTkOztqJmJsz7FyOTdyfIX8hQE895f3+ct0Ea1CHT MKKoCLBiPFjbMQ3EY1XnNsadSqyYyrAiBPkX6RKdlwzcPyxhBk9g8ECkWp2CHf2Kb61N Ru6Zg/3jzHoMrpQzFSdg/s8I57aa0whGFpKWLd2UNDGNg1ckYqwTsmUbgFMfJz23ZJc0 kdjwYO09Nr4ezUMqKW1fw79OO0leCziyn5I3Bt8ERP0J7pyljYnoEWvEbNTNX7QkKbXI WQEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319163; x=1718923963; 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=HuMqZhiI8mcxfHbacNPVnCAMh/8vHkU7mdGHgJIgOTk=; b=sRzyFOmZvV1L+8D/MdlpOOF7h72QAFfHS+mtDLtUXI4DgO+veDUlcmkfOu6PJZlEV0 h1nH0hzGdCmGTMQk4acE0onzHn4k5Ntcc5GkJEpRjTGWfzOsMEzljnAb+AjUAqaCGf5r o5NxQMSK35P7VUH50nTRocK0AZXoyoOO0uxrJo597/scAaFZduVz6BXDkRPBGkHGjlFj 3vuGTGhuLVBhj96yb7X9qk2owavw7sXbMHfdak5QmyTfGC9x0lbhBE0fqB9dOhiTRPGV R47QIOP+SBei1nQeHxi7mNyKPshyAO6MpzL8nJoSYUbo8rWcdidZG1zAhiDpWSr3inml ewDg== X-Gm-Message-State: AOJu0YxbbwjHmZkMXbWyKJ/A/3t7fFxtxK05ctZYNKPGVVz4r08cou11 V1nmRvT7ThFEpL7hXgkTISgSFzg363HzfvOecbQTJa64GKW8mnQYcSz5qmzs3ECxMrJf3QX7a6A b X-Google-Smtp-Source: AGHT+IEh31X74A+7bFfTwCvDk2/Q4noa+LCp44x5LMdXHHb+8AVR2/KFbQC5Yrt+Z8+YlrV6mSzOUw== X-Received: by 2002:a2e:8046:0:b0:2eb:dd8e:fbf5 with SMTP id 38308e7fff4ca-2ec0e46ed3bmr6687301fa.22.1718319162970; Thu, 13 Jun 2024 15:52:42 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 6/9] qemu: Add support for mapped-ram on save Date: Thu, 13 Jun 2024 16:43:20 -0600 Message-ID: <20240613225228.10665-7-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: FTNIAFGHIN2CMDFBFY2J6YQILT2DIMR3 X-Message-ID-Hash: FTNIAFGHIN2CMDFBFY2J6YQILT2DIMR3 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: 1718319436436100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_migration.c | 79 ++++++++++++++++++++++++++++ src/qemu/qemu_migration.h | 7 +++ src/qemu/qemu_monitor.c | 32 ++++++++++++ src/qemu/qemu_monitor.h | 4 ++ src/qemu/qemu_saveimage.c | 105 ++++++++++++++++++++++++++++++-------- src/qemu/qemu_saveimage.h | 1 + src/qemu/qemu_snapshot.c | 2 +- 8 files changed, 208 insertions(+), 24 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f9761242d2..34f37210d9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2696,7 +2696,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver, if (!(cookie =3D qemuDomainSaveCookieNew(vm))) goto endjob; =20 - if (!(data =3D virQEMUSaveDataNew(driver, xml, cookie, was_running, co= mpressed))) + if (!(data =3D virQEMUSaveDataNew(driver, vm, xml, cookie, was_running= , compressed))) goto endjob; xml =3D NULL; =20 diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 1faab5dd23..3110ef2621 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7072,6 +7072,85 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDom= ainObj *vm, } =20 =20 +int +qemuMigrationSrcToMappedFile(virQEMUDriver *driver, virDomainObj *vm, + int fd, + virDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(qemuMigrationParams) saveParams =3D NULL; + unsigned long saveMigBandwidth =3D priv->migMaxBandwidth; + int rc; + int ret =3D -1; + virErrorPtr orig_err =3D NULL; + + if (qemuMigrationSetDBusVMState(driver, vm) < 0) + return -1; + + if (!(saveParams =3D qemuMigrationParamsForMappedSave())) + return -1; + + /* Increase migration bandwidth to unlimited since target is a file. + * Failure to change migration speed is not fatal. */ + if (qemuMigrationParamsSetULL(saveParams, + QEMU_MIGRATION_PARAM_MAX_BANDWIDTH, + QEMU_DOMAIN_MIG_BANDWIDTH_MAX * 1024 * 1= 024) < 0) + return -1; + + if (qemuMigrationParamsApply(vm, asyncJob, saveParams, 0) < 0) + return -1; + + priv->migMaxBandwidth =3D QEMU_DOMAIN_MIG_BANDWIDTH_MAX; + + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("guest unexpectedly quit")); + /* nothing to tear down */ + return -1; + } + + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) + goto cleanup; + + rc =3D qemuMonitorMigrateToFdSet(vm, 0, fd); + qemuDomainObjExitMonitor(vm); + if (rc < 0) + goto cleanup; + + rc =3D qemuMigrationSrcWaitForCompletion(vm, asyncJob, NULL, 0); + + if (rc < 0) { + if (rc =3D=3D -2) { + virErrorPreserveLast(&orig_err); + if (virDomainObjIsActive(vm)) + qemuMigrationSrcCancel(vm, asyncJob, true); + } + goto cleanup; + } + + qemuDomainEventEmitJobCompleted(driver, vm); + ret =3D 0; + + cleanup: + if (ret < 0 && !orig_err) + virErrorPreserveLast(&orig_err); + + /* Restore max migration bandwidth */ + if (virDomainObjIsActive(vm)) { + if (qemuMigrationParamsSetULL(saveParams, + QEMU_MIGRATION_PARAM_MAX_BANDWIDTH, + saveMigBandwidth * 1024 * 1024) =3D= =3D 0) + ignore_value(qemuMigrationParamsApply(vm, asyncJob, + saveParams, 0)); + priv->migMaxBandwidth =3D saveMigBandwidth; + } + + virErrorRestore(&orig_err); + + return ret; +} + + /** * This function is supposed to be used only to while reconnecting to a do= main * with an active migration job. diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index ed62fd4a91..f845a0198b 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -241,6 +241,13 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainAsyncJob asyncJob) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; =20 +int +qemuMigrationSrcToMappedFile(virQEMUDriver *driver, + virDomainObj *vm, + int fd, + virDomainAsyncJob asyncJob) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; + int qemuMigrationSrcCancelUnattended(virDomainObj *vm, virDomainJobObj *oldJob); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 34e2ccab97..4c92bd740a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2237,6 +2237,38 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, } =20 =20 +int +qemuMonitorMigrateToFdSet(virDomainObj *vm, + unsigned int flags, + int fd) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + qemuMonitor *mon =3D priv->mon; + off_t offset; + g_autoptr(qemuFDPass) fdPassMigrate =3D NULL; + unsigned int setId; + g_autofree char *uri =3D NULL; + + VIR_DEBUG("fd=3D%d flags=3D0x%x", fd, flags); + + QEMU_CHECK_MONITOR(mon); + + if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) + return -1; + + fdPassMigrate =3D qemuFDPassNew("migrate", priv); + qemuFDPassAddFD(fdPassMigrate, &fd, "-fd"); + qemuFDPassTransferMonitor(fdPassMigrate, mon); + + if (qemuFDPassGetId(fdPassMigrate, &setId) < 0) + return -1; + + uri =3D g_strdup_printf("file:/dev/fdset/%u,offset=3D%#lx", setId, off= set); + + return qemuMonitorJSONMigrate(mon, flags, uri); +} + + int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 6e81945201..c477def138 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -843,6 +843,10 @@ int qemuMonitorMigrateToFd(qemuMonitor *mon, unsigned int flags, int fd); =20 +int qemuMonitorMigrateToFdSet(virDomainObj *vm, + unsigned int flags, + int fd); + int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, const char *protocol, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 30085dc7bc..8f28770086 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -96,6 +96,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUSaveData, virQEMUSav= eDataFree); */ virQEMUSaveData * virQEMUSaveDataNew(virQEMUDriver *driver, + virDomainObj *vm, char *domXML, qemuDomainSaveCookie *cookieObj, bool running, @@ -122,6 +123,10 @@ virQEMUSaveDataNew(virQEMUDriver *driver, goto error; } header->version =3D cfg->saveImageVersion; + /* Enable mapped-ram feature if available and save version >=3D 3 */ + if (header->version >=3D QEMU_SAVE_VERSION && + qemuMigrationCapsGet(vm, QEMU_MIGRATION_CAP_MAPPED_RAM)) + header->features |=3D QEMU_SAVE_FEATURE_MAPPED_RAM; =20 header->was_running =3D running ? 1 : 0; header->compressed =3D compressed; @@ -369,6 +374,79 @@ qemuSaveImageDecompressionStop(virCommand *cmd, } =20 =20 +static int +qemuSaveImageCreateSequential(virQEMUDriver *driver, + virDomainObj *vm, + const char *path, + int fd, + virQEMUSaveData *data, + virCommand *compressor, + unsigned int flags, + virDomainAsyncJob asyncJob) +{ + int ret =3D -1; + virFileWrapperFd *wrapperFd =3D NULL; + unsigned int wrapperFlags =3D VIR_FILE_WRAPPER_NON_BLOCKING; + + if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) + wrapperFlags |=3D VIR_FILE_WRAPPER_BYPASS_CACHE; + + if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) + goto cleanup; + + if (virQEMUSaveDataWrite(data, fd, path) < 0) + goto cleanup; + + /* Perform the migration */ + if (qemuMigrationSrcToFile(driver, vm, fd, compressor, asyncJob) < 0) + goto cleanup; + + if (VIR_CLOSE(fd) < 0) { + virReportSystemError(errno, _("unable to close %1$s"), path); + goto cleanup; + } + + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) + goto cleanup; + + ret =3D 0; + + cleanup: + VIR_FORCE_CLOSE(fd); + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) + ret =3D -1; + virFileWrapperFdFree(wrapperFd); + + return ret; +} + + +static int +qemuSaveImageCreateMapped(virQEMUDriver *driver, + virDomainObj *vm, + const char *path, + int fd, + virQEMUSaveData *data, + unsigned int flags, + virDomainAsyncJob asyncJob) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + + /* mapped-ram does not support directIO */ + if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("bypass cache unsupported by this system")); + return -1; + } + + if (virQEMUSaveDataWrite(data, fd, path) < 0) + return -1; + + /* Perform the migration */ + return qemuMigrationSrcToMappedFile(driver, vm, fd, asyncJob); +} + + /* Helper function to execute a migration to file with a correct save head= er * the caller needs to make sure that the processors are stopped and do al= l other * actions besides saving memory */ @@ -386,12 +464,9 @@ qemuSaveImageCreate(virQEMUDriver *driver, int ret =3D -1; int fd =3D -1; int directFlag =3D 0; - virFileWrapperFd *wrapperFd =3D NULL; - unsigned int wrapperFlags =3D VIR_FILE_WRAPPER_NON_BLOCKING; =20 /* Obtain the file handle. */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { - wrapperFlags |=3D VIR_FILE_WRAPPER_BYPASS_CACHE; directFlag =3D virFileDirectFdFlag(); if (directFlag < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", @@ -409,14 +484,12 @@ qemuSaveImageCreate(virQEMUDriver *driver, if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) = < 0) goto cleanup; =20 - if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) - goto cleanup; + if (data->header.features & QEMU_SAVE_FEATURE_MAPPED_RAM) + ret =3D qemuSaveImageCreateMapped(driver, vm, path, fd, data, flag= s, asyncJob); + else + ret =3D qemuSaveImageCreateSequential(driver, vm, path, fd, data, = compressor, flags, asyncJob); =20 - if (virQEMUSaveDataWrite(data, fd, path) < 0) - goto cleanup; - - /* Perform the migration */ - if (qemuMigrationSrcToFile(driver, vm, fd, compressor, asyncJob) < 0) + if (ret < 0) goto cleanup; =20 /* Touch up file header to mark image complete. */ @@ -425,14 +498,6 @@ qemuSaveImageCreate(virQEMUDriver *driver, * up to seek backwards on wrapperFd. The reopened fd will * trigger a single page of file system cache pollution, but * that's acceptable. */ - if (VIR_CLOSE(fd) < 0) { - virReportSystemError(errno, _("unable to close %1$s"), path); - goto cleanup; - } - - if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) - goto cleanup; - if ((fd =3D qemuDomainOpenFile(cfg, vm->def, path, O_WRONLY, NULL)) < = 0 || virQEMUSaveDataFinish(data, &fd, path) < 0) goto cleanup; @@ -441,10 +506,6 @@ qemuSaveImageCreate(virQEMUDriver *driver, =20 cleanup: VIR_FORCE_CLOSE(fd); - if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) - ret =3D -1; - virFileWrapperFdFree(wrapperFd); - if (ret < 0 && needUnlink) unlink(path); =20 diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 63ad5508ed..81d93bf33c 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -124,6 +124,7 @@ virQEMUSaveDataWrite(virQEMUSaveData *data, =20 virQEMUSaveData * virQEMUSaveDataNew(virQEMUDriver *driver, + virDomainObj *vm, char *domXML, qemuDomainSaveCookie *cookieObj, bool running, diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 1d75208814..1e9e0e31d7 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1390,7 +1390,7 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *drive= r, !(snapdef->cookie =3D (virObject *) qemuDomainSaveCookieNew(vm= ))) goto cleanup; =20 - if (!(data =3D virQEMUSaveDataNew(driver, xml, + if (!(data =3D virQEMUSaveDataNew(driver, vm, xml, (qemuDomainSaveCookie *) snapdef->= cookie, resume, compressed))) goto cleanup; --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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 From nobody Mon Sep 16 19:08:06 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=1718319506; cv=none; d=zohomail.com; s=zohoarc; b=ks25FoWPhWsPPmFcnRDFpB2hK2rhM5fLXt4Hnrp5gxVKYwtuDm4KPHKjqL/hix2ckuCdyZbuLOrOsu8lHW/poutvkCO8R4tQKOJWMVamgJPa3NAXoiLx7ncJqGDRM8zjae0ZmZ23jFPanwdADLz1uKUBSIJU8/wkEEbAgxBQDaQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319506; 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=5RbU/Iti/1i8ZgH4NHt6ZBVRPGuGSU38MPnuXrtQ80Q=; b=K8VbKeraoXPG8apX2rvAtBU4oHdfb5DqKCtgm+g2ZKajxdCss6dIGJwYADC1Te4mWTGPXxkr0pI4egqUUJoJ5irtiCiQCU6GTUqSX9Zf05Mr+OcZGYPKjBi6iL6czx6DtK/QNewz1MO3q6qsbM3ES3eB7IdlqBZTHPrmITBPAH0= 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 1718319506283265.2146537389865; Thu, 13 Jun 2024 15:58:26 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3C19312CC; Thu, 13 Jun 2024 18:58:25 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A92C7126B; Thu, 13 Jun 2024 18:54:30 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 78FAD122D; Thu, 13 Jun 2024 18:54:28 -0400 (EDT) Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (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 64A1F11F8 for ; Thu, 13 Jun 2024 18:52:48 -0400 (EDT) Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-35f2c9e23d3so1785395f8f.0 for ; Thu, 13 Jun 2024 15:52:48 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-7ebdba3d211sm52358839f.17.2024.06.13.15.52.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:46 -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=1718319167; x=1718923967; 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=mjxjcu+Myiwbp3z89yaRyIAHUnQfv5h4mNQ74YAhFsM=; b=PqeAFOEvWqvn8w4kcHVAsGg/Vj1YWRv85X5K2DiRuRi0lXv5tpHu21noEjgKKambRv ukv80r+oVE927av11UNVYQRMdpY2oiXw4g63ouQmfHKfolOZ6fL3MjgiSMVjBoKuJfNx xam306y7InK4fEnmlgIzYxh5Cluv5ToR50YHbglo1iMgM2Az/wOt+fClFg0ybWODVe/O qO7BylVoX52v5rxKlbotVDzxDIwfoTZYIiJbQtCSbi49G4mgSe8wz1I3bnby29sw0cI8 3gtfd88XgHHINiDi1p2agOy4JeO0KVn+IKduaC8BADg7bCzxEJQ52Jv50nXEusuMyCgR JS/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319167; x=1718923967; 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=mjxjcu+Myiwbp3z89yaRyIAHUnQfv5h4mNQ74YAhFsM=; b=WapcQc+Ic/lTQQ3Se5I0guJC9957TatfVqqeHVd43qQpu5OmHS4/1mroFOGuAMKmax 0M7qutW8bII3DcdDrVMSSiw7M6dqXY7Ckxt4Ug8alrskTOUoLxzxYvVOBNfIXTiyQFoJ bINzV11IMBgCr2TZTlaGytv/8CA9bIB9ROtArwvImJv4JVpZKq186p7oLXbpIP+GO8Ts A0GiB8qWLB0B8BZpzs0eRaycQNzfqM9eHTArrupYkc9FeRGV3QK5PiizpaUfvGVKEo84 D4k7t51Lbg8g/vUaUla3xNsxDVyr+XmTsoXigSr0wpgeX9O0IDkFiGmxwjo3DnrLOWS4 uH3Q== X-Gm-Message-State: AOJu0YyrFw4krtPaZkZqyP9xIJvBrcmg4xBGnt2uJdPXuZ6E8F2EsxZs NFJYxeDPvCOGkJDWJVbO9QkSAeyZ4sUBc4Hf9/iDWC3Q4fBXDxtbYqXS/6iZyXVKQM5J2LWq9hh e X-Google-Smtp-Source: AGHT+IFfR5Y1Oge+5dKgbva50h9CZpiEiOOYfBDUmZrO+cIbpLk+a36JQizIX407/EnvArKN+I3k8Q== X-Received: by 2002:a5d:6545:0:b0:35f:d50:3301 with SMTP id ffacd0b85a97d-360718c9db7mr4253276f8f.3.1718319167148; Thu, 13 Jun 2024 15:52:47 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 8/9] qemu: Support O_DIRECT with mapped-ram on save Date: Thu, 13 Jun 2024 16:43:22 -0600 Message-ID: <20240613225228.10665-9-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: 7KHVHLKT7DIT6P7BMY5BWB3AOU5RUET4 X-Message-ID-Hash: 7KHVHLKT7DIT6P7BMY5BWB3AOU5RUET4 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: 1718319508637100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- I'm not happy with this and the subsequent patch, which pass another FD around for QEMU to use for reading/writing unaligned state when BYPASS_CACHE has been specified. One idea is to pass the qemuFdPass object around the various functions, but qemu_fd.h already includes qemu_monitor.h. E.g. passing a qemuFdPass to qemuMonitorMigrateToMappedFile requires including qemu_fd.h in qemu_monitor.h, so a cyclical dependency. I could move qemuFDPass*TransferMonitor* functions to qemu_monitor.[ch] to avoid the include in qemu_fd.h, but would likely require moving the _qemuFDPass struct in qemu_fd.c to qemu_fd.h. Another idea is to move qemuProcessIncomingDefNew in qemu_process.c to qemuMigrationConnectionDefNew() in qemu_migration.c. Also move qemuProcessIncomingDef object in qemu_process.h to qemuMigrationConnectDef (or something like that) in qemu_migration.h. The qemuMigrationConnectDef can encapsulate all the connection info related to the migration. E.g. traditional fd, path associated with fd, uri, listen address, qemuFDPass object containing fds for mapped_ram, etc. This can be used by both save and restore paths. Other suggestions kindly welcomed :-). src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_migration.h | 1 + src/qemu/qemu_monitor.c | 14 +++++++++++--- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_saveimage.c | 25 +++++++++++++++++-------- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index b1d27e07e1..a0435a0572 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7084,6 +7084,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDoma= inObj *vm, int qemuMigrationSrcToMappedFile(virQEMUDriver *driver, virDomainObj *vm, int fd, + int nondirectFD, virDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv =3D vm->privateData; @@ -7121,7 +7122,7 @@ qemuMigrationSrcToMappedFile(virQEMUDriver *driver, v= irDomainObj *vm, if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) goto cleanup; =20 - rc =3D qemuMonitorMigrateToFdSet(vm, 0, fd); + rc =3D qemuMonitorMigrateToFdSet(vm, 0, fd, nondirectFD); qemuDomainObjExitMonitor(vm); if (rc < 0) goto cleanup; diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index 864f3280e5..939205ef13 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -245,6 +245,7 @@ int qemuMigrationSrcToMappedFile(virQEMUDriver *driver, virDomainObj *vm, int fd, + int nondirectFD, virDomainAsyncJob asyncJob) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; =20 diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4c92bd740a..c0936bee6b 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2240,7 +2240,8 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int fd) + int fd, + int nondirectFD) { qemuDomainObjPrivate *priv =3D vm->privateData; qemuMonitor *mon =3D priv->mon; @@ -2249,15 +2250,22 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int setId; g_autofree char *uri =3D NULL; =20 - VIR_DEBUG("fd=3D%d flags=3D0x%x", fd, flags); + VIR_DEBUG("fd=3D%d nondirectFD=3D%d flags=3D0x%x", fd, nondirectFD, fl= ags); =20 QEMU_CHECK_MONITOR(mon); =20 - if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) + if (nondirectFD !=3D -1) + offset =3D lseek(nondirectFD, 0, SEEK_CUR); + else + offset =3D lseek(fd, 0, SEEK_CUR); + + if (offset =3D=3D -1) return -1; =20 fdPassMigrate =3D qemuFDPassNew("migrate", priv); qemuFDPassAddFD(fdPassMigrate, &fd, "-fd"); + if (nondirectFD !=3D -1) + qemuFDPassAddFD(fdPassMigrate, &nondirectFD, "-nondirect-fd"); qemuFDPassTransferMonitor(fdPassMigrate, mon); =20 if (qemuFDPassGetId(fdPassMigrate, &setId) < 0) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c477def138..0fbb2dadc1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -845,7 +845,8 @@ int qemuMonitorMigrateToFd(qemuMonitor *mon, =20 int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int fd); + int fd, + int nondirectFD); =20 int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 1545c00472..2b0281895a 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -431,19 +431,28 @@ qemuSaveImageCreateMapped(virQEMUDriver *driver, virDomainAsyncJob asyncJob) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE nondirectFD =3D -1; =20 - /* mapped-ram does not support directIO */ + /* If BYPASS_CACHE has been specified, fd has been opened with O_DIREC= T. + * In this case, QEMU requires a second FD without O_DIRECT for writing + * unaligned state. We'll use this FD as well to write the header. + * Relative to VM RAM size, this data is a drop in the bucket and fine + * to write without O_DIRECT. + */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("bypass cache unsupported by this system")); - return -1; + if ((nondirectFD =3D qemuDomainOpenFile(cfg, vm->def, path, O_WRON= LY, NULL)) < 0) + return -1; + if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, = nondirectFD) < 0) + return -1; + if (virQEMUSaveDataWrite(data, nondirectFD, path) < 0) + return -1; + } else { + if (virQEMUSaveDataWrite(data, fd, path) < 0) + return -1; } =20 - if (virQEMUSaveDataWrite(data, fd, path) < 0) - return -1; - /* Perform the migration */ - return qemuMigrationSrcToMappedFile(driver, vm, fd, asyncJob); + return qemuMigrationSrcToMappedFile(driver, vm, fd, nondirectFD, async= Job); } =20 =20 --=20 2.44.0 From nobody Mon Sep 16 19:08:06 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=1718319545; cv=none; d=zohomail.com; s=zohoarc; b=P3jOP1VSGm8JjMiVQ+SMCVNMgQDlrbJVCUiGfgDd9j9X+ZCmk9jmFsD16HSpdwQcrIwI7LuVXucre/yTv4DKxAV2Vrl2Z6kETFlPNpchpoL9com+xFv8W2QAsJJiYG2x92kEPKgaKDT2J58sYJx76yy/41YK7Jp/0C1Sp0uQbl8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319545; 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=azHUXqv/O/WHBZdGCpiBw2TUyJVBYbE7yIZ9h7j4QsA=; b=XAsbHCcwaQBheLrLvTf7W2f4scbO9Et0x12klCXJm82Pyttf5rXgGyc5N+RxIcsS4TmtmjjpU4UFHcDaPaigBLIlAR0i5JNJ3T177Tm84So5EaAUvX1veHLXmmg5x1NR9HDbc7nesNJxTQqQvi4gKfxaT8NcLrd4/krMrDIW6QY= 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 1718319545270220.2393649786393; Thu, 13 Jun 2024 15:59:05 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3562E9CA; Thu, 13 Jun 2024 18:59:04 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0162D12D4; Thu, 13 Jun 2024 18:54:32 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 9D5FF12CD; Thu, 13 Jun 2024 18:54:29 -0400 (EDT) Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 5C44211F3 for ; Thu, 13 Jun 2024 18:52:50 -0400 (EDT) Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-35f1bc63981so1655705f8f.1 for ; Thu, 13 Jun 2024 15:52:50 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id e9e14a558f8ab-375d866e27fsm4376825ab.14.2024.06.13.15.52.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:48 -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=1718319169; x=1718923969; 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=wDpsDkitBj2LFWULfMDvURVaScKp3YhD/dOxsBPKczk=; b=LAxRVwMFujQ2NR7IvuFTA7li+DcYNkcdR7W65nwFLjW4WKtjgYIMzRuW4TEXH8bkyu /F7obh5bzfVMW730sRuMTs60BlLMzTKVOyYl8FU1Mh9y/NMPriB0/U9Fkn+5RJaR0nMK kGXgwiabfW1iS/mVs8BjnjmlUKIBQi9v+BEeDZfPpppYvE/+kItDSN5axEgosUt/aUvs n1kSc5TezzE53f1fDup4VXwmwRO930xnZX3nk2rftAk7rdrxRkbly58TCNe++1iX6aMv f6yRkO/4wsMXwk9/ifpEKM89CcXzUnBVJMDyN8R/tiZdQjY+JbxhdWPBGC5ELZWuqQAQ k04A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319169; x=1718923969; 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=wDpsDkitBj2LFWULfMDvURVaScKp3YhD/dOxsBPKczk=; b=cQN5iuhMJwHByT2D3RsVgYlD8mE0p2+4Ct1kkK+bwxSkwTJ/9smk4e7CyFByAv5M3R UhAi0NBI8aBwE6OI+f6vq9g3xiaDBpTXucAiCbfn3rea3RHWaobm/epmPq8wlqDJHVaa 9Lj6gWEImR+59+2O1/0KgwsKehkLVYKiwLLm4I/vDJu/DjnUme5wj+vj+7gWwOQJH4mG YhBajIBFE91Yh1mG4icllXv+Wgbh8VMT6OLhrnpq5+U8hQ3ArFD1tXrLi6qXqH66Rriw 7HSUvr+OpVCeZBCfbcSYsshwzf5Fv5ZOO1sCD+6eJtbWiLJKqfjVi89r8ccWrlLX4IZN hosw== X-Gm-Message-State: AOJu0YxWUeQe0ssedYHEbqH8XHuTDxEAF/H/ISpabT9LKUY9u58FSMBR n+scS8aPEUKo+kViee1yKNeCP+4OCVGpY9rnxHGaEmTgNKBakA+TxM4qrFAUGlS2u3JEpfQUBiX 6 X-Google-Smtp-Source: AGHT+IG1+VBAuEj19e+x1Yi7BEWaW26n0y2Jje4pCan1pK3BBgLY5aBdW+aN+FF3Y8SLTUyS0jKRGg== X-Received: by 2002:a5d:64ab:0:b0:35f:2c6b:ffe4 with SMTP id ffacd0b85a97d-36071901383mr5011055f8f.28.1718319169069; Thu, 13 Jun 2024 15:52:49 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 9/9] qemu: Support O_DIRECT with mapped-ram on restore Date: Thu, 13 Jun 2024 16:43:23 -0600 Message-ID: <20240613225228.10665-10-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: QVNHQBMGKXEQ7GUMCSA2QYT43CLFURIJ X-Message-ID-Hash: QVNHQBMGKXEQ7GUMCSA2QYT43CLFURIJ 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: 1718319546845100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 22 +++++++++++++--------- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_process.c | 20 ++++++++++++++++---- src/qemu/qemu_process.h | 3 +++ src/qemu/qemu_saveimage.c | 29 +++++++++++++++++++++++++---- src/qemu/qemu_saveimage.h | 4 +++- src/qemu/qemu_snapshot.c | 8 ++++---- 7 files changed, 65 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 34f37210d9..53674458bf 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1624,7 +1624,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, } =20 if (qemuProcessStart(conn, driver, vm, NULL, VIR_ASYNC_JOB_START, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); @@ -5742,6 +5742,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, g_autofree char *xmlout =3D NULL; const char *newxml =3D dxml; int fd =3D -1; + int nondirectFd =3D -1; int ret =3D -1; virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; @@ -5758,7 +5759,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, - &wrapperFd, false, false); + &wrapperFd, &nondirectFd, false, false); if (fd < 0) goto cleanup; =20 @@ -5812,13 +5813,14 @@ qemuDomainRestoreInternal(virConnectPtr conn, if (qemuProcessBeginJob(vm, VIR_DOMAIN_JOB_OPERATION_RESTORE, flags) <= 0) goto cleanup; =20 - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, + ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, nondirectFd, data,= path, false, reset_nvram, VIR_ASYNC_JOB_START); =20 qemuProcessEndJob(vm); =20 cleanup: VIR_FORCE_CLOSE(fd); + VIR_FORCE_CLOSE(nondirectFd); if (virFileWrapperFdClose(wrapperFd) < 0) ret =3D -1; virFileWrapperFdFree(wrapperFd); @@ -5893,7 +5895,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, false, false); + false, NULL, NULL, false, false); =20 if (fd < 0) goto cleanup; @@ -5930,7 +5932,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, state =3D 0; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, true, false); + false, NULL, NULL, true, false); =20 if (fd < 0) goto cleanup; @@ -6011,7 +6013,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) } =20 if ((fd =3D qemuSaveImageOpen(driver, priv->qemuCaps, path, &def, &dat= a, - false, NULL, false, false)) < 0) + false, NULL, NULL, false, false)) < 0) goto cleanup; =20 ret =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); @@ -6069,13 +6071,14 @@ qemuDomainObjRestore(virConnectPtr conn, g_autoptr(virDomainDef) def =3D NULL; qemuDomainObjPrivate *priv =3D vm->privateData; int fd =3D -1; + int nondirectFd =3D -1; int ret =3D -1; g_autofree char *xmlout =3D NULL; virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - bypass_cache, &wrapperFd, false, true); + bypass_cache, &wrapperFd, &nondirectFd, false, = true); if (fd < 0) { if (fd =3D=3D -3) ret =3D 1; @@ -6120,12 +6123,13 @@ qemuDomainObjRestore(virConnectPtr conn, =20 virDomainObjAssignDef(vm, &def, true, NULL); =20 - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, + ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, nondirectFd, data,= path, start_paused, reset_nvram, asyncJob); =20 cleanup: virQEMUSaveDataFree(data); VIR_FORCE_CLOSE(fd); + VIR_FORCE_CLOSE(nondirectFd); if (virFileWrapperFdClose(wrapperFd) < 0) ret =3D -1; virFileWrapperFdFree(wrapperFd); @@ -6321,7 +6325,7 @@ qemuDomainObjStart(virConnectPtr conn, } =20 ret =3D qemuProcessStart(conn, driver, vm, NULL, asyncJob, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags= ); virDomainAuditStart(vm, "booted", ret >=3D 0); if (ret >=3D 0) { diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index a0435a0572..0b1e03394e 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3009,7 +3009,7 @@ qemuMigrationDstPrepare(virDomainObj *vm, } =20 return qemuProcessIncomingDefNew(vm, listenAddress, - migrateFrom, fd, NULL, 0); + migrateFrom, fd, -1, NULL, 0); } =20 =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f700390a8c..f5b2f9ea2b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4688,6 +4688,7 @@ qemuProcessIncomingDefNew(virDomainObj *vm, const char *listenAddress, const char *migrateFrom, int fd, + int nondirectFd, const char *path, unsigned int flags) { @@ -4707,11 +4708,18 @@ qemuProcessIncomingDefNew(virDomainObj *vm, unsigned int fdsetId; off_t offset; =20 - if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) - offset =3D 0; + if (nondirectFd =3D=3D -1) + offset =3D lseek(fd, 0, SEEK_CUR); + else + offset =3D lseek(nondirectFd, 0, SEEK_CUR); + + if (offset < 0) + goto error; =20 inc->fdPassMigrate =3D qemuFDPassNew("migrate", priv); qemuFDPassAddFD(inc->fdPassMigrate, &fd, "-fd"); + if (nondirectFd !=3D -1) + qemuFDPassAddFD(inc->fdPassMigrate, &nondirectFd, "-nondirect-= fd"); qemuFDPassGetId(inc->fdPassMigrate, &fdsetId); inc->uri =3D g_strdup_printf("file:/dev/fdset/%u,offset=3D%#lx", f= dsetId, offset); } else { @@ -8148,6 +8156,7 @@ qemuProcessStart(virConnectPtr conn, virDomainAsyncJob asyncJob, const char *migrateFrom, int migrateFd, + int migrateNondirectFd, const char *migratePath, virDomainMomentObj *snapshot, virNetDevVPortProfileOp vmop, @@ -8185,7 +8194,8 @@ qemuProcessStart(virConnectPtr conn, =20 if (migrateFrom) { incoming =3D qemuProcessIncomingDefNew(vm, NULL, migrateFrom, - migrateFd, migratePath, flags= ); + migrateFd, migrateNondirectFd, + migratePath, flags); if (!incoming) goto stop; } @@ -8264,6 +8274,7 @@ qemuProcessStart(virConnectPtr conn, * @driver: qemu driver object * @vm: domain object * @fd: FD pointer of memory state file + * @nondirectFd: FD for memory state file, opened without O_DIRECT * @path: path to memory state file * @snapshot: internal snapshot to load when starting QEMU process or NULL * @data: data from memory state file or NULL @@ -8290,6 +8301,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, @@ -8329,7 +8341,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, priv->disableSlirp =3D true; =20 if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, - asyncJob, migrateFrom, *fd, path, snapshot, + asyncJob, migrateFrom, *fd, nondirectFd, path, sn= apshot, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, start_flags) =3D=3D 0) *started =3D true; diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index a5212ee56e..6e37dac2ca 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -62,6 +62,7 @@ qemuProcessIncomingDef *qemuProcessIncomingDefNew(virDoma= inObj *vm, const char *listenAddres= s, const char *migrateFrom, int fd, + int nondirectFd, const char *path, unsigned int flags); void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc); @@ -89,6 +90,7 @@ int qemuProcessStart(virConnectPtr conn, virDomainAsyncJob asyncJob, const char *migrateFrom, int stdin_fd, + int nondirectFd, const char *stdin_path, virDomainMomentObj *snapshot, virNetDevVPortProfileOp vmop, @@ -98,6 +100,7 @@ int qemuProcessStartWithMemoryState(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 2b0281895a..8e634862a6 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -610,6 +610,7 @@ qemuSaveImageGetCompressionProgram(const char *imageFor= mat, * @ret_data: returns structure filled with data from the image header * @bypass_cache: bypass cache when opening the file * @wrapperFd: returns the file wrapper structure + * @nondirectFd: returns file descriptor without O_DIRECT set * @open_write: open the file for writing (for updates) * @unlink_corrupt: remove the image file if it is corrupted * @@ -625,11 +626,14 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, + int *nondirectFd, bool open_write, bool unlink_corrupt) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); VIR_AUTOCLOSE fd =3D -1; + VIR_AUTOCLOSE nondirect_fd =3D -1; + int read_fd; int ret =3D -1; g_autoptr(virQEMUSaveData) data =3D NULL; virQEMUSaveHeader *header; @@ -646,6 +650,13 @@ qemuSaveImageOpen(virQEMUDriver *driver, _("bypass cache unsupported by this system")); return -1; } + + /* Also open the file without O_DIRECT for reading header and for + * qemu to use when reading unaligned state + */ + if ((nondirect_fd =3D qemuDomainOpenFile(cfg, NULL, path, oflags, = NULL)) < 0) + return -1; + oflags |=3D directFlag; } =20 @@ -655,7 +666,12 @@ qemuSaveImageOpen(virQEMUDriver *driver, data =3D g_new0(virQEMUSaveData, 1); =20 header =3D &data->header; - if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { + if (nondirect_fd !=3D -1) + read_fd =3D nondirect_fd; + else + read_fd =3D fd; + + if (saferead(read_fd, header, sizeof(*header)) !=3D sizeof(*header)) { if (unlink_corrupt) { if (unlink(path) < 0) { virReportSystemError(errno, @@ -732,7 +748,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 data->xml =3D g_new0(char, xml_len); =20 - if (saferead(fd, data->xml, xml_len) !=3D xml_len) { + if (saferead(read_fd, data->xml, xml_len) !=3D xml_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read domain XML")); return -1; @@ -741,7 +757,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, if (cookie_len > 0) { data->cookie =3D g_new0(char, cookie_len); =20 - if (saferead(fd, data->cookie, cookie_len) !=3D cookie_len) { + if (saferead(read_fd, data->cookie, cookie_len) !=3D cookie_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read cookie")); return -1; @@ -761,6 +777,10 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 *ret_def =3D g_steal_pointer(&def); *ret_data =3D g_steal_pointer(&data); + if (nondirectFd) { + *nondirectFd =3D nondirect_fd; + nondirect_fd =3D -1; + } =20 ret =3D fd; fd =3D -1; @@ -774,6 +794,7 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, virQEMUSaveData *data, const char *path, bool start_paused, @@ -794,7 +815,7 @@ qemuSaveImageStartVM(virConnectPtr conn, if (header->features & QEMU_SAVE_FEATURE_MAPPED_RAM) start_flags |=3D VIR_QEMU_PROCESS_START_MAPPED_RAM; =20 - if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, path, NULL, = data, + if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, nondirectFd,= path, NULL, data, asyncJob, start_flags, "restored", &started) < 0) { goto cleanup; diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 81d93bf33c..0a8b35158a 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -67,12 +67,13 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, virQEMUSaveData *data, const char *path, bool start_paused, bool reset_nvram, virDomainAsyncJob asyncJob) - ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6); + ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7); =20 int qemuSaveImageOpen(virQEMUDriver *driver, @@ -82,6 +83,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, + int *nondirectFd, bool open_write, bool unlink_corrupt) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 1e9e0e31d7..f137a79a8d 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2115,7 +2115,7 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, memdata->path =3D snapdef->memorysnapshotfile; memdata->fd =3D qemuSaveImageOpen(driver, NULL, memdata->path, &savedef, &memdata->data, - false, NULL, + false, NULL, NULL, false, false); =20 if (memdata->fd < 0) @@ -2359,7 +2359,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, virDomainObjAssignDef(vm, config, true, NULL); =20 if (qemuProcessStartWithMemoryState(snapshot->domain->conn, driver, vm, - &memdata.fd, memdata.path, loadSna= p, + &memdata.fd, -1, memdata.path, loa= dSnap, memdata.data, VIR_ASYNC_JOB_SNAPSH= OT, start_flags, "from-snapshot", &started) < 0) { @@ -2513,7 +2513,7 @@ qemuSnapshotRevertInactive(virDomainObj *vm, start_flags |=3D paused ? VIR_QEMU_PROCESS_START_PAUSED : 0; =20 rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NULL, - VIR_ASYNC_JOB_SNAPSHOT, NULL, -1, NULL, NULL, + VIR_ASYNC_JOB_SNAPSHOT, NULL, -1, -1, NULL, = NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); @@ -2991,7 +2991,7 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, =20 if (!virDomainObjIsActive(vm)) { if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNA= PSHOT, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, VIR_QEMU_PROCESS_START_PAUSED) < 0) { return -1; --=20 2.44.0