From nobody Wed Mar 12 12:44:55 2025 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=1741215068; cv=none; d=zohomail.com; s=zohoarc; b=K2ojCoBFyxLLIIP+l2hyMdIGSPX/HikWlRs5DMzvBRTA3HaNQXjL4voUIy5MzU1OzOutFCgetNyQYZV5T+8DucI/zaLCFUq/IZ5JuQXtsu50ih7G2xBgS4Zdf//YqqQT7QzOOkdu0IXe1o1OoTndLilqU49nJ4De25M2hrDEA84= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215068; h=Content-Transfer-Encoding:Cc:Cc: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; bh=pqvuSIf+aYNOMy/B52VKnszyrC363/Ut7VnHcX4mvcY=; b=kiaVJ4r2SUfJLtk2fVLYRuEJh7tAa244CSiACBQATfNmQsh413S48Igqk+yoWZtviF63u1b5dEEkGHZovSmEN1pi56sngLtX7zXiWapB1hUXshC6ayFBK/yNTGvetcy1oKwIao6/EymmMwHKIJNxkXyPEJd3oxccsu1AIlehTBg= 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 1741215067998125.03285981804083; Wed, 5 Mar 2025 14:51:07 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 00822178C; Wed, 5 Mar 2025 17:51:06 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id CC0461629; Wed, 5 Mar 2025 17:50:07 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id BEA1714E3; Wed, 5 Mar 2025 17:50:03 -0500 (EST) Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 CAECC14E0 for ; Wed, 5 Mar 2025 17:50:02 -0500 (EST) Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-abf5358984bso6192766b.3 for ; Wed, 05 Mar 2025 14:50:02 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7349fd03d95sm13527663b3a.0.2025.03.05.14.50.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:01 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215001; x=1741819801; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=35dEyg2yRw3uM+Le4foaG5LgKI3/K1rzj5vjSpdt/ZA=; b=TMG19SmKExAEYISAH+3A3lU1Tf68eO0TM3P5qIB9j1idyDM3bemmCol3varrS2qQTx oP5jnm0Y3HJO6p/Vpt4nk+WBo3LtHYAVMEbF+IKn5oU8ssVeSB3hBR0hxHmMc1ciRN4Z QHD3NFYGBzPNOioMKDGLIJXnAxyzDM/sLdTSVyA+m6BuzOm13TLD3Wdmqu4tmgyGW3c1 S4WqjgSYyFpqCDWMCPZvPvxov+aTp3OY/THS9tF+6Z1vP4aKrHiIDpVRFbYKvRg6lYFb /AHMPFbYyBY4miU5ztdPa6ifdtBg6ekuCmhM+ZdBrytslLJkz5xSE6fGG1+bk4IrRcfi cJ9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215001; x=1741819801; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=35dEyg2yRw3uM+Le4foaG5LgKI3/K1rzj5vjSpdt/ZA=; b=ntg14zn0oSdVmZrkGkZEb3I8GnD5n+7TJjwi7gb6hPEMspCS9YG9CNXVqsX+1wRPKB yM5XLhgS6ibRG2kzWyIoj7nvHO7u9FOxQ1bHYlkJZ5V5nJ2UlMOkM1GNCKdE6ldDOkAi Xi00eyzLUtJDLYSs6vRnwsYSFHYJS5obpwnH762SM6MvED0UZy7U6dp0Uczk7Y4HnCGl 8Zerh11ivwlZwXnO+w58hycIaANyTpC6QMjYGLXLzFV3mbCuRnuiphe9Vp/TeLaGCcqJ dRQW8CEXUVHxWszteo5bZzo/MHvlciOZ2SmhPJIqu28jwxRi45v44TapbF24G2Qk18p4 06SA== X-Gm-Message-State: AOJu0YwYQwn9nqOmE33s1fT8QZZF5EFEgEC0Xi+h/mHEKRTquhJynGho J2Z15leVsEqvkTIQIgqiyYt2JvYFePXYyUdY3VO+FP1wOLyaftcAYpmgwS06tzuSnHUKLXB8crQ v X-Gm-Gg: ASbGncvaQ/yzzwAbHBqA1RGbwlUInMT1r9HCWthQMuxnIsIkqxQwkuQJwJ6uu3wfFKM 2sOblYiylAi7BUc4+5zC8E3saJU/l3Gvova4pwV75tVoTM7TprgyFTas8CbwzkqDNTV84V4f/lD VkzV/T2nhN3a25C3yW+EDUSD/UbBMOaflUTb0jxfbh/Dc0kv4uOJ2Nf5RuWQRT8LDtEp//L7wBM 3Bn+C9C9h5bx7P2g7IKjdbhruX/dWaLsunNaCvJgsueU66JYl9dzizKfg73/hWxvUt0ZdHfZ7kj a1J+OREpYNLjlV+bKnbfUrHw7B/0EJO97l/417/DJ8t1O8cFjGwdA7iFhuo9BY0= X-Google-Smtp-Source: AGHT+IFduZPoaVrTfPenuTdnTEQJVnAlda9TkBkCPJpJZeb5Ocfcl7/GDjsVcVegPsBl/VEwO/eZ0w== X-Received: by 2002:a17:906:7950:b0:abf:4521:eb2a with SMTP id a640c23a62f3a-ac20db09298mr560818366b.49.1741215001603; Wed, 05 Mar 2025 14:50:01 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 01/18] lib: virDomain{Save,Restore}Params: Ensure absolute path Date: Wed, 5 Mar 2025 15:48:10 -0700 Message-ID: <20250305224957.5369-2-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: R24DUTKE4HYWOTQG65PTHCTXVMS74XTL X-Message-ID-Hash: R24DUTKE4HYWOTQG65PTHCTXVMS74XTL 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 CC: farosas@suse.de 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: 1741215068762019100 Content-Type: text/plain; charset="utf-8" When invoking virDomainSaveParams with a relative path, the image is saved to the daemon's CWD. Similarly, when providing virDomainRestoreParams with a relative path, it attempts to restore from the daemon's CWD. In most configurations, the daemon's CWD is set to '/'. Ensure a relative path is converted to absolute before invoking the driver domain{Save,Restore}Params functions. Signed-off-by: Jim Fehlig --- src/libvirt-domain.c | 89 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 18451ebdb9..0ee7c6f45b 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -1023,6 +1023,11 @@ virDomainSaveParams(virDomainPtr domain, unsigned int flags) { virConnectPtr conn; + virTypedParameterPtr params_copy =3D NULL; + int nparams_copy =3D 0; + const char *to =3D NULL; + g_autofree char *absolute_to =3D NULL; + int ret =3D -1; =20 VIR_DOMAIN_DEBUG(domain, "params=3D%p, nparams=3D%d, flags=3D0x%x", params, nparams, flags); @@ -1033,23 +1038,46 @@ virDomainSaveParams(virDomainPtr domain, virCheckDomainReturn(domain, -1); conn =3D domain->conn; =20 - virCheckReadOnlyGoto(conn->flags, error); + virCheckReadOnlyGoto(conn->flags, done); =20 VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING, VIR_DOMAIN_SAVE_PAUSED, - error); + done); + + /* We must absolutize the file path as the save is done out of process= */ + virTypedParamsCopy(¶ms_copy, params, nparams); + nparams_copy =3D nparams; + if (virTypedParamsGetString(params_copy, nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, &to) < 0) + goto done; + + if (to) { + if (!(absolute_to =3D g_canonicalize_filename(to, NULL))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("could not build absolute output file path")); + goto done; + } + + if (virTypedParamsReplaceString(¶ms_copy, &nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, + absolute_to) < 0) + goto done; + } =20 if (conn->driver->domainSaveParams) { - if (conn->driver->domainSaveParams(domain, params, nparams, flags)= < 0) - goto error; - return 0; + if (conn->driver->domainSaveParams(domain, params_copy, nparams_co= py, flags) < 0) + goto done; + ret =3D 0; + } else { + virReportUnsupportedError(); } =20 - virReportUnsupportedError(); + done: + if (ret < 0) + virDispatchError(domain->conn); + virTypedParamsFree(params_copy, nparams_copy); =20 - error: - virDispatchError(domain->conn); - return -1; + return ret; } =20 =20 @@ -1206,6 +1234,12 @@ virDomainRestoreParams(virConnectPtr conn, virTypedParameterPtr params, int nparams, unsigned int flags) { + virTypedParameterPtr params_copy =3D NULL; + int nparams_copy =3D 0; + const char *from =3D NULL; + g_autofree char *absolute_from =3D NULL; + int ret =3D -1; + VIR_DEBUG("conn=3D%p, params=3D%p, nparams=3D%d, flags=3D0x%x", conn, params, nparams, flags); VIR_TYPED_PARAMS_DEBUG(params, nparams); @@ -1213,23 +1247,46 @@ virDomainRestoreParams(virConnectPtr conn, virResetLastError(); =20 virCheckConnectReturn(conn, -1); - virCheckReadOnlyGoto(conn->flags, error); + virCheckReadOnlyGoto(conn->flags, done); =20 VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING, VIR_DOMAIN_SAVE_PAUSED, - error); + done); =20 if (conn->driver->domainRestoreParams) { + /* We must absolutize the file path as the save is done out of pro= cess */ + virTypedParamsCopy(¶ms_copy, params, nparams); + nparams_copy =3D nparams; + if (virTypedParamsGetString(params_copy, nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, &from) < 0) + goto done; + + if (from) { + if (!(absolute_from =3D g_canonicalize_filename(from, NULL))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("could not build absolute output file pat= h")); + goto done; + } + + if (virTypedParamsReplaceString(¶ms_copy, &nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, + absolute_from) < 0) + goto done; + } + if (conn->driver->domainRestoreParams(conn, params, nparams, flags= ) < 0) - goto error; - return 0; + goto done; + ret =3D 0; } =20 virReportUnsupportedError(); =20 - error: - virDispatchError(conn); - return -1; + done: + if (ret < 0) + virDispatchError(conn); + virTypedParamsFree(params_copy, nparams_copy); + + return ret; } =20 =20 --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215094; cv=none; d=zohomail.com; s=zohoarc; b=gfHt0whga00BKLnM4PJR9BCKHpMhh8NQMlXAb7X+8LxmyMAjJtcgYLrnI6raWkk0X59hN1a/zKWGsF8oXcXfr2vo3nFfg6m/4qlNRDShjlabE19C4fFi8mVsrSKybCfc0yB68gd53eWyAGjbhVmdmIXCMsANySuXUkx8kLaWMTA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215094; h=Content-Transfer-Encoding:Cc:Cc: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; bh=iMubqa3hV1lCxkHXfC7Zc6Oac1l+6t+wIgkh7v5aPhU=; b=lGE25vBIcm5TgN3OiBmTSXoIKgF+OUypyH3nGE2PR9rP9swGqeBNDHKvaoMTRg+kMkRhxy95Z8bsCCpN8KUSQ0nzfVJDB4gwHStTV8qZMm9buA0Jycn+OTziMxBaytG1QIQecZB18FElXcKSCm/Vtk9erihKHSDltTQ+AAUylIM= 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 1741215094758281.3233775739516; Wed, 5 Mar 2025 14:51:34 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id B0B7013DF; Wed, 5 Mar 2025 17:51:33 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id BD856162A; Wed, 5 Mar 2025 17:50:10 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 410F4150F; Wed, 5 Mar 2025 17:50:05 -0500 (EST) Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 8003413AD for ; Wed, 5 Mar 2025 17:50:04 -0500 (EST) Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-5e058ca6806so12287356a12.3 for ; Wed, 05 Mar 2025 14:50:04 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73638e4ab93sm9485408b3a.103.2025.03.05.14.50.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:02 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215003; x=1741819803; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cdQWvdl+Oh9/fYMS2A6hXXLmXZqsjA6zgZFWPKVe0Y4=; b=WrMrXQIFuqkGTaoYACBb5QkJy8z8xj4XGhkdKoF1iW53IMji7D87GU8Apq2aA/0FzQ 10MNUNR1cpZegNwyQ6fJuYvEvcWfxqVp1m+xaZbDccntlVXg5J5NDKqukN2GT/qqpG8l sJ/1cuf4H2ykzVWZ0KQ+d2I4nKcy9wXYYYhE2NDYTUZkMGjz5ELiOJU552O0kEBNMEh5 CvqZu8Rw3COxZCiV9U/aeubPE4mVIfXLJsfG799vz0aNy3XxTd0xme57P1VK3G1vYD3V 6MUBJ4GQ/cBCraWr8/4fAdF8XxVv49qgxvFMwwKf0BgHSDF0a9+uHR8atgPY1RTkBc0I U/FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215003; x=1741819803; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cdQWvdl+Oh9/fYMS2A6hXXLmXZqsjA6zgZFWPKVe0Y4=; b=ZVXnayf0KSB044C3ulXe866iwshBBUNRyEus1YZd3j0GAh2bkbY3b703/Uys1qSteJ RMwApzaNQOrqorKzUy8EPXqSN+SceUGI2iz44hkPITFaqPjVczr4xTiHn8KCSKA42jME E2ooDT7bwoi6oyq7tLam5uz5Tqg/0/3JrW9iOgp7T/Y+Ce0UIbbdNK/Gf353vUjVW5vJ dZ+oAXzWPJu5e67lS2BOL6Rd/6IorUkucTE0OVp69GNapBE9J1Nd7UVIzAKx/ixOoFbt JZ04DdeN/iGW3WiOpEVK2g8IwYhnqNRt95B0pHuDdWrypcIXxc0Rp2ACpp9BWSXEFDxl WktA== X-Gm-Message-State: AOJu0YzhgVhhEvaTESoEbRhCy5qHeM/A/OlsKI29jCjUuAiEpr9ryOw5 4g6JQJR9RzAyQkvTTAdaoEoNa432Z/gbmSh4uguQC8WA+A4nQYH3JD7pn1X+1J8PqSS+FRgosoU R X-Gm-Gg: ASbGnct6y3Cw+W2d2nomgg0dNt0vDqCJfdzKuM4aPJkbX+LXK7gf6Ur54XFMil7j4EZ L6lOyimmr4hZVpIn2pX02dDq4vraGwadAxP56tiiy+U7uSpHTVkm1o8pLckT63GrzDorMZiT4x+ 6kiipJbWoFnRoM6MFrHxpehL4n5JqzIzPnGC3Tn+uERCTsV6UIoQ9RWqUrlUiffnDXeFsNZIx90 r7Pl1WdndiDeQ4J2jRbNYHvnjDrX7xWDsVkWBkGP6Aj2vQdzdOF66L9BhVzvaSLECtsWWF3WTQO gAkY36ucs96+yj2+5s4xELrCXVoFu3s/lRmRgawmufrQsbj502ly6cY7Dn9/4rg= X-Google-Smtp-Source: AGHT+IHCf/l5bb/kJ/89yCNmaolbI4WLZ2PLIsHN+ui8/NvuapVLzo/Xk2/ujq42ijR+B+9HPWOZfA== X-Received: by 2002:a17:906:f5a9:b0:abf:4550:9764 with SMTP id a640c23a62f3a-ac20db11abemr425351666b.24.1741215003349; Wed, 05 Mar 2025 14:50:03 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 02/18] qemu: Add function to get FDPass object from monitor Date: Wed, 5 Mar 2025 15:48:11 -0700 Message-ID: <20250305224957.5369-3-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: XMWI3QES37A2SLMALK6O2LPYU7FIXGUT X-Message-ID-Hash: XMWI3QES37A2SLMALK6O2LPYU7FIXGUT 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 CC: farosas@suse.de 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: 1741215096875019100 Content-Type: text/plain; charset="utf-8" Add new function qemuFDPassNewFromMonitor to get an fdset previously passed to qemu, based on the 'prefix' provided when the qemuFDPass object was initially created. Signed-off-by: Jim Fehlig --- src/qemu/qemu_fd.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_fd.h | 4 ++++ 2 files changed, 50 insertions(+) diff --git a/src/qemu/qemu_fd.c b/src/qemu/qemu_fd.c index e847056573..333f9b128e 100644 --- a/src/qemu/qemu_fd.c +++ b/src/qemu/qemu_fd.c @@ -115,6 +115,52 @@ qemuFDPassNewPassed(unsigned int fdSetID) } =20 =20 +/** + * qemuFDPassNewFromMonitor: + * @prefix: Prefix of an FDset which was already passed to qemu + * @mon: monitor object + * + * Query the monitor for already passed FDsets and return a new qemuFDPass + * object if one is found to contain an fd with associated @prefix. Returns + * NULL on failure or if no matching FDset is found. Similar to + * qemuFDPassNewPassed, this is useful along with qemuFDPassTransferMonito= rRollback + * when only knowing the qemuFDPass prefix. + */ +qemuFDPass * +qemuFDPassNewFromMonitor(const char *prefix, qemuMonitor *mon) +{ + g_autoptr(qemuMonitorFdsets) fdsets =3D NULL; + qemuFDPass *fdpass =3D NULL; + size_t i; + + VIR_DEBUG("prefix =3D %s", prefix); + + if (qemuMonitorQueryFdsets(mon, &fdsets) < 0) + return NULL; + + for (i =3D 0; i < fdsets->nfdsets; i++) { + qemuMonitorFdsetInfo fdset =3D fdsets->fdsets[i]; + size_t j; + + for (j =3D 0; j < fdset.nfds; j++) { + qemuMonitorFdsetFdInfo fdinfo =3D fdset.fds[j]; + + VIR_DEBUG("fdinfo opaque =3D %s", fdinfo.opaque); + if (STRPREFIX(prefix, fdinfo.opaque)) { + fdpass =3D g_new0(qemuFDPass, 1); + + fdpass->fdSetID =3D fdset.id; + fdpass->prefix =3D g_strdup(prefix); + fdpass->path =3D g_strdup_printf("/dev/fdset/%u", fdset.id= ); + fdpass->passed =3D true; + } + } + } + + return fdpass; +} + + /** * qemuFDPassIsPassed: * @fdpass: The fd passing helper struct diff --git a/src/qemu/qemu_fd.h b/src/qemu/qemu_fd.h index cd0ff2c690..d873e110a8 100644 --- a/src/qemu/qemu_fd.h +++ b/src/qemu/qemu_fd.h @@ -34,6 +34,10 @@ qemuFDPassNew(const char *prefix, qemuFDPass * qemuFDPassNewPassed(unsigned int fdSetID); =20 +qemuFDPass * +qemuFDPassNewFromMonitor(const char *prefix, qemuMonitor *mon) + ATTRIBUTE_NONNULL(1); + bool qemuFDPassIsPassed(qemuFDPass *fdpass, unsigned *id); --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215124; cv=none; d=zohomail.com; s=zohoarc; b=UF0oYUTMj0Kq+WFcSbCOy+8hG57W6QBFN31xV3gbXWCRknZRpOlotqqO4sH4MlNU14T75ePYgm8i1TfsBRbGdj6jQOBhGqYitKxfmKnIT4f90yZLd7McaabKZCw0I1lH6N88e8kL9CUkcwq5hlAtf0EGvohaZ4U/UUVU8zBZyO4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215124; h=Content-Type:Content-Transfer-Encoding:Cc:Cc: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; bh=byWO8oBFnLOF7HvzoUDr7GEC9mg/JEK6X217Vt1uBnE=; b=SB4ysaRp8KFbhI0iULRu3oGNV5uMq5nfXuRBz9CbHDE2RMbKi3vv5ydGmc40w0s1xgc9VlpwYVOCXkoMndIegFreiXCJ8wHJh+aw32XqSpYW0835Wrk+VNL4MUndL72bbFUZI3ry1ZGtBi+WEN22m2jFymrgXk/x5zsrmPpddjc= 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 1741215124340994.3967512830263; Wed, 5 Mar 2025 14:52:04 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 978F31626; Wed, 5 Mar 2025 17:52:03 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B6BEE164F; Wed, 5 Mar 2025 17:50:19 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id AB0E1157F; Wed, 5 Mar 2025 17:50:15 -0500 (EST) Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (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 5A7A514F8 for ; Wed, 5 Mar 2025 17:50:06 -0500 (EST) Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-5e5491eb379so6662567a12.3 for ; Wed, 05 Mar 2025 14:50:06 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7364f983a1fsm7408154b3a.91.2025.03.05.14.50.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:04 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215005; x=1741819805; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=d+Nn/53QOkZY3f3W1SBui6U9knc1HfLHUCk2N/7s/a0=; b=genG3qW2/hPAXPNaZh2djFhS59wxcd8D+IAHJ0tVVm6RY6sYQIZp11mUMxhdyF2oqA qLDOhnEqpoUgfmpyd7qMagd/GCHhKOSro4CAfE2Fgc6d8whQrTyK5nKIpElUXvRqChq8 drgYLbdYb6aTxrq2+2vGxzY2jKKLD/pigo1VBKA9MWwQtDeWum9V4uBnSEtwg5oKDwMr taQe2OtfP+dhFU633XhP4I2UZEY6cIKMnzFMWRxpJV7+l2lRvHjxSmWmMStfcjr2JRIX SppUsMJhREn6bu6Fo10mSKSwplJ9dDXRUUtScRUB1bx6ZKni7gIOqKQxlXJCynP+Qq+B 1tVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215005; x=1741819805; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=d+Nn/53QOkZY3f3W1SBui6U9knc1HfLHUCk2N/7s/a0=; b=Cmwcxvzhx0LJINanoUE7NSgNTKAwVl9Sh84LJ9yK2/hS/tdzxeYJLs39orfTLke8/S WQBsycjz1LC6uPKMFEc+Jg3iefVUq0k4vEWBKsNqB0psqwghEyqpLSAeL/Zykx7wCIP+ ROiV+XaShU3080duVBK93vCzvGXc7rVdKfkhsqpKp6MPGlZDGn+OtTdJLWmo/nTXvNvP lxYic5f+lxKkQ5+WSnwUfEQdDiY14vMC1sNZGD2q5P6K1LK5daJCZBZ7r4ZeFAViIbh0 VJWqOtTjQtabj2FshsqZbfpoHFjZ1015xfh8QTSTYLqPcg/d7FzNRZ+nADPUCCMoTy6q EIjw== X-Gm-Message-State: AOJu0YxqD5VuX2k7lXbfZGXeLHrl7Y8kPY9LpYIUbmj9pr/onwZxf/Iz KAcQtIpDpcd0jzuMKSZx1eOwpib6QgYw19hPZUfWAXvjbCsO+uepDLrU4f+Zwb6h5u1bs5e5f8J m X-Gm-Gg: ASbGncsZm/Pmm72P97pmpGOki4McTERtmwDMtMR41F3XZuIIDEJmLSU6iiYeib9JFgh FkSqar4DNSJ3xFVfgFJzz98zt0wDEhwDrNGuiCRpo7c9OI5EX5EM3vtknlX3eI9lVvZpp0pIpxa L3WmNq+sGmJf+P3YLsbM/CIfZkHD3KixpccfrVyN/d8YtSqcR4Qr2fZTH7Njx/a4zZqyKPTyXjY pFd1+p4Ouvu/2apix+11JFB8CYElahUKTMCAVVhtG0KSXPUB/Zq8SAdZ3x9k6JazMMbuNB25ihK adCV8u6q5Tv1JRw3FvwmZWcW6/iQhY0YfxyOHDWQkMa9XgQG8Q3idPY2dXWjgMw= X-Google-Smtp-Source: AGHT+IHgR5N1DSYfDpll6NByecTiruFL4fA3Z+lG2xSNEs66r+5iONXipcH19a2BFWOUSqoAtDVZMQ== X-Received: by 2002:a17:907:1c13:b0:abf:7b38:7e64 with SMTP id a640c23a62f3a-ac20da87919mr438958866b.43.1741215005139; Wed, 05 Mar 2025 14:50:05 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 03/18] qemu: Add function to check capability in migration params Date: Wed, 5 Mar 2025 15:48:12 -0700 Message-ID: <20250305224957.5369-4-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: OMAPQ3K637Y4EIRHPBCVNZGBZF6DL5JA X-Message-ID-Hash: OMAPQ3K637Y4EIRHPBCVNZGBZF6DL5JA 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 CC: farosas@suse.de 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: 1741215124760019000 Content-Type: text/plain; charset="utf-8" Add new function qemuMigrationParamsCapEnabled() to check if a capability is set in the caller-provided migration parameters. Signed-off-by: Jim Fehlig Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_migration_params.c | 16 ++++++++++++++++ src/qemu/qemu_migration_params.h | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index c10660d6f2..252437e5b2 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -1312,6 +1312,22 @@ qemuMigrationParamsGetULL(qemuMigrationParams *migPa= rams, } =20 =20 +/** + * Returns true if @cap is enabled in @migParams, false otherwise. + */ +bool +qemuMigrationParamsCapEnabled(qemuMigrationParams *migParams, + qemuMigrationCapability cap) +{ + bool enabled =3D false; + + if (migParams) + ignore_value(virBitmapGetBit(migParams->caps, cap, &enabled)); + + return enabled; +} + + /** * qemuMigrationParamsCheck: * diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index 17fc63f527..da62ca5b8f 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -137,6 +137,10 @@ qemuMigrationParamsGetULL(qemuMigrationParams *migPara= ms, qemuMigrationParam param, unsigned long long *value); =20 +bool +qemuMigrationParamsCapEnabled(qemuMigrationParams *migParams, + qemuMigrationCapability cap); + void qemuMigrationParamsSetBlockDirtyBitmapMapping(qemuMigrationParams *migPara= ms, virJSONValue **params); --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215146; cv=none; d=zohomail.com; s=zohoarc; b=VZkUF5smVJWG+Ulx5Pbym5lVwZBwGjKkOszOrIYNYlcESvM8g3aS6/Kx9goE+/WMLmuCe3c1aZQeC1uGm1DCykNPXb0W7/mv5xzTPbJES6EwnbCZ9oDDwHULOsK/yTRWYt1y5YTiRmW9Nrsi4Vc3rnlduUA9pdI1eLGHKMmgBBw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215146; h=Content-Type:Content-Transfer-Encoding:Cc:Cc: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; bh=hgZCkQ/FIYFNqZ/wXoRZeAxyF1kii0uyORj1i5Zo3+g=; b=jv5aFSh6Gnw7C74wryvG830I+6XuNfsKWvnMBV9VdOw+xxLHooh5R4QAoVoErECrILEz9z6lGHLt+PP9MRBgE90ufonvOBlfI/TsUkMKiJcZxfSzQBbxywaf0psTMBcwEDh9YtkpgqAAnVADzMORFJ8hu/S/frK0Uf/FmWxouFM= 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 1741215146317444.9055486950307; Wed, 5 Mar 2025 14:52:26 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 415371621; Wed, 5 Mar 2025 17:52:25 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 6A234155F; Wed, 5 Mar 2025 17:50:27 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 46E131553; Wed, 5 Mar 2025 17:50:24 -0500 (EST) Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (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 53127150C for ; Wed, 5 Mar 2025 17:50:08 -0500 (EST) Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-abf615d5f31so7338966b.2 for ; Wed, 05 Mar 2025 14:50:08 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7363fefd91esm8502623b3a.172.2025.03.05.14.50.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:06 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215007; x=1741819807; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HUVXnUtwHVZ4OhdLJUfrcpq43Zx1mCS3Qo12iEIX/eU=; b=B6VlCU704YupLtPTmArYFH0Phosm3FMqTBrUwwHS+/fNqkFUYUxRJXZO4cqnoEOgtG c3GpkwqWVoiK5clhdOlU81xeRBxqUG0JHS4Gvpb3ORz5nMG1Rk0WaGFcoKAaZKI/BerX VL5Q9iF0git6jDJol8B2yGPdd7J37BryOsYMVvpr9tj1PY+AspoVgNG+CWvAxOlZ7nEB 9NGCLHPFwOKByHrp1d4PTobI6KZD0ft+XVR9I0c/dZpvntER45nAZyHxl+9D//4ZEWhJ D0EpDsbW4eOn4qr9rN1M/3Ux03Y12fgOfU3FubsIVdrv4cgqH1Iy6x9FFFuM2adlpAGq dmqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215007; x=1741819807; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HUVXnUtwHVZ4OhdLJUfrcpq43Zx1mCS3Qo12iEIX/eU=; b=VaRfI4RIMK4T1raxclzxnod+hG+78FhXBisYhF8LZgRW2DOrySb1zEO+5ry/Rii/pJ KUn9kOuCny7LWJREohfGNTR7d2IIM8w9nqdU5XKU9qcara4aLDQk+RxMmcHTgT9nI7dT 034P9ToQehWuOYzWpeYLzWzlur+Uj3/bA0aQs1UBq2jP9yFygNgmL3y6KBOowv37L1Dp k6taWJS5WzM/7p/BtwzTQvPdvsgHAVqP/CzP//Dm2P6fRWz9brA3nW0hCwBuMEQNR3Lc 8RBEnTG7e9TyW6qPHOHY4uSB1Op5wPOqsT2+LbHgjR1P+HGyCJNe9k1BgKwEqdnWlCkW 07+A== X-Gm-Message-State: AOJu0YwQ9Eymv0BTugVFKJGc3El92/OHaInB1CUiZZGo41lo3GZP7yxf osjD6J+SW4Wv72HWhrnAerHkZ7fsiYkgek5ACCvENP/m94gyq2nNDEtdGn6AMdoDTqtoAIpnavj K X-Gm-Gg: ASbGncvVQ0Qn7MJyBUCPLNDtCNX4b60fFvmdwpFbQBvz14PRlQ2qyJXgN9pwPJjRGjV FUaZQGft4+6ufjuwUVnfvAo5NEj3R3qJ8R89LVnbt/oEyejrvs6P9PfJf+LzIPrjAKV13NzDuPP f7oiMOFfO8u6LKT1YjuubhoXdKvqCljKr61xn37SEEFJuWwdhu4VFERSvxvvcX1mUERLh7wuL4z lk46UuCbmjKrAr3qkzpeHwYrYe8z0v7JjKXQKamLz7zHI2IlD7zWcjEzDDxcGDcDSRTd2s9sYsn 1utzrznSwU+woq4WgL9uZ/LDQXkqod4ovmjMTl8cLPbA+cmT9d/jD24OuMWPB+s= X-Google-Smtp-Source: AGHT+IFjXgtE0olIGGFjmg5Nbl29XB94MxZ3XLbxqJ0BGkR9OtRbbGhVkZhyzswQKV8FLTkAp3HtrQ== X-Received: by 2002:a17:907:c48c:b0:ac1:f6ba:3b18 with SMTP id a640c23a62f3a-ac20dadcb0cmr471885966b.44.1741215007025; Wed, 05 Mar 2025 14:50:07 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 04/18] qemu: Add function to get bool value from migration params Date: Wed, 5 Mar 2025 15:48:13 -0700 Message-ID: <20250305224957.5369-5-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: EG6NH7BLSUCZ2TXSTBSNVCFQNMUPYAID X-Message-ID-Hash: EG6NH7BLSUCZ2TXSTBSNVCFQNMUPYAID 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 CC: farosas@suse.de 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: 1741215148756019100 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_migration_params.c | 18 ++++++++++++++++++ src/qemu/qemu_migration_params.h | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 252437e5b2..939d9f01e4 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -1312,6 +1312,24 @@ qemuMigrationParamsGetULL(qemuMigrationParams *migPa= rams, } =20 =20 +int +qemuMigrationParamsGetBool(qemuMigrationParams *migParams, + qemuMigrationParam param, + bool *value) +{ + if (!migParams || !value) + return 0; + + if (qemuMigrationParamsCheckType(param, QEMU_MIGRATION_PARAM_TYPE_BOOL= ) < 0) + return -1; + + *value =3D migParams->params[param].set ? + migParams->params[param].value.b : false; + + return 0; +} + + /** * Returns true if @cap is enabled in @migParams, false otherwise. */ diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index da62ca5b8f..fb2cfd9fad 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -137,6 +137,11 @@ qemuMigrationParamsGetULL(qemuMigrationParams *migPara= ms, qemuMigrationParam param, unsigned long long *value); =20 +int +qemuMigrationParamsGetBool(qemuMigrationParams *migParams, + qemuMigrationParam param, + bool *value); + bool qemuMigrationParamsCapEnabled(qemuMigrationParams *migParams, qemuMigrationCapability cap); --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215163; cv=none; d=zohomail.com; s=zohoarc; b=P/mBQbKQaGVNdDA+kL5aRuJN+/3YGhqe6Sf8NzdSmTb1PgUAHViDAnEVlDgEwbZl1r/lBjv3tR6HMdO1ffwPdXhy4qLKyEUGzfOeemqjFbtNkR3+nEWjdDCXBdhTdvy80PJzo9iIkFo4ml/qTEx2N8FkENOsTJIfSkEjtY8pc20= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215163; h=Content-Type:Content-Transfer-Encoding:Cc:Cc: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; bh=osddx4XsZNZZAY8W8U6bK8T6RQGZDNR9UyybX35ipUk=; b=GRc8x9csfHJPBZSU+5EUgBXxcBxN1ug6SCiS1hqcqfKIqqfbeY6qKpGz3Op9dwpidiVT9+nktv1TFXst1iWuj831V736n0vM6bObgueF7YV3BgEwHpu64GwdtTqLV9zs1bkGKds8MszpZftkUBoHmzJu3FVGMRe1pCsja7XLoA0= 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 1741215163895875.2000786346197; Wed, 5 Mar 2025 14:52:43 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 49B0713E5; Wed, 5 Mar 2025 17:52:43 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 176DE162E; Wed, 5 Mar 2025 17:50:30 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 027CD1670; Wed, 5 Mar 2025 17:50:24 -0500 (EST) Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (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 2FDFC1584 for ; Wed, 5 Mar 2025 17:50:10 -0500 (EST) Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-ac0b6e8d96cso7847366b.0 for ; Wed, 05 Mar 2025 14:50:10 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-223504c603bsm118724565ad.121.2025.03.05.14.50.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:08 -0800 (PST) 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_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE 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=1741215009; x=1741819809; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jjphJ6QLmhC94epX3i+EnkGIEFXSHw1r/Po6kthdPd0=; b=fL29ZapdbINe3Jo4D7QPFfAupefBNFDcjJYrGmDi1XcadzGqTV4DgSiWKFNWjjdeJf 8blpqo0bRXQ43PDY3gOYaft9EIKbmW7EkO6+ROlWY9uFIgbN1mVqB6JpMMF4O517S/pt zmzDerleCBQ4xpaYTLFaVNDzgDpama8v6QvA8I65T+2GpUqI5ghlMu62jS4E6OCbjZIO KIvRJvyJbi31yFjWr9JL3OonAUFfpJ9TY0ZtuN10CaNU3MbcQDw+ecWwni2vH47IElFv 16cb25DQPrwi1LB0ugh7zm6bvuEd1+o0kH7BvHV7/g1zNaZV0wha1Hj/GD7vSXnKfh6B Exqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215009; x=1741819809; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jjphJ6QLmhC94epX3i+EnkGIEFXSHw1r/Po6kthdPd0=; b=DzoFM6lggkapOtuQj8OdA7Vunq7uoClCknIVWaqkiEWS9PUwbbOhCZuiBiIxkAfP+B uAO0dR/td2mlKgkANy1V0h7q+jVkPi00EVikGluYHa/jutwcK7b50zOuDX9qZgkeCwEf 0+NSXcHf3VHKDdZfilMNOKVD5rMGDfpKQu5pYv29EDDyd0O9/AL3xqDBiTHLsMjJmHkz JgPSDUTwL+QdqAL54nD8s4ZpGnnqhc9CSZ1OgOLK4hh1tFTo0MMZkdEa4MiyGyGVwBoE tBLkslm8VBu1Ue6TuRwT2cK78p02x3uvK1KUVl4Hem/Od1doE1TV+ltK7GhJNhLr7MJh /gvQ== X-Gm-Message-State: AOJu0YyDeDwIFQIwh9Q5xjLchzKqtTvuladCVehBCZ1joN3U9NVQgAPg eAgovmzT6ng8FxpftoKYRxfKeeQn8s7gXR/pTv21794FXS2ykAFOomlQdxN39ySlyEpPsnbqPG7 y X-Gm-Gg: ASbGnctJmqsbrQjPhSOXVeeJBF+jGgPjuC+r5bXcwKn2HP8zk4Rax9aSxxhSU6lzquX Ce/4QISoygaAmyM3TEkAH+FncekbCkeYhuS03wQKlkAQpLzQjBEetEIqLMnGAUazYX4n56S3Fvp FWZp6w5IbIp30HYv3Mo+nk+AOZgISQkcQRvHgtrR+fTePWwuYTmyOOV/jvJKuxfJa2VRKcW+UrN KWaWZbju0ffyGzB/ur7eazBBbROVQcv5gCfdkCj/jpLK34YkIw4n6CI8tBZlPWgKGxBOaTCrN2l mgm7KMZGRXkUDxzPJqsDQJ1TTJEKNUutbP2yfWlolZQicL4hY1aXMq6c8aA48M8= X-Google-Smtp-Source: AGHT+IEp484n3BpauExrnwb/y23Y3SlLik1lazlWWvpbDfI0KOjfwYK2fm+6ShsW1PrJyIecN42b9w== X-Received: by 2002:a17:907:3f07:b0:abc:b96:7bd2 with SMTP id a640c23a62f3a-ac20d84475bmr570813566b.11.1741215008944; Wed, 05 Mar 2025 14:50:08 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 05/18] qemu: Add mapped-ram migration capability Date: Wed, 5 Mar 2025 15:48:14 -0700 Message-ID: <20250305224957.5369-6-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: DG2PK4LID7DIM7Z3UKIAY5IWYKG7X3K2 X-Message-ID-Hash: DG2PK4LID7DIM7Z3UKIAY5IWYKG7X3K2 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 CC: farosas@suse.de 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: 1741215164816019000 Content-Type: text/plain; charset="utf-8" Add the mapped-ram migration capability introduced in QEMU 9.0. Reviewed-by: Daniel P. Berrang=C3=A9 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 939d9f01e4..4fc9199f1c 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -106,6 +106,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, "zero-copy-send", "postcopy-preempt", "switchover-ack", + "mapped-ram", ); =20 =20 diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index fb2cfd9fad..2379950ce9 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -42,6 +42,7 @@ typedef enum { QEMU_MIGRATION_CAP_ZERO_COPY_SEND, QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT, QEMU_MIGRATION_CAP_SWITCHOVER_ACK, + QEMU_MIGRATION_CAP_MAPPED_RAM, =20 QEMU_MIGRATION_CAP_LAST } qemuMigrationCapability; --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215187; cv=none; d=zohomail.com; s=zohoarc; b=gloyMEF/dKPsAIXdHxmzZ28DGdtwNEb6k4gpOwPNEFhjMRIAV5gOfDX4IDMwI+KBFpclyyg9skRvmEEqsSZ7RsjKpFFrFdanB2mLtPrj0WmMbnlKbhBaA9rlYOrNN3ny7Udc5xV6a0lQsSqQWzv2/zb2Qcr5S7haAlqPXRnoVeM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215187; h=Content-Type:Content-Transfer-Encoding:Cc:Cc: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; bh=llIES2+y3hsJA6ViI3nqu/iPgie595QugF5YAdcAFhY=; b=FPvQ0BcNpmAZSvqdUZT5ObaPw1jOLhSdHJiy1aOVZOwkiHHd3CmxD1kDZ/uJIl3kdr/G+oNkRaNaP7CZOc0QpXuARWL4wtnoAPkJhpifKJXB9sSp5ioOr9f1yt/UhUtmgAUadNbP1JobraTcg62b1wMvSdqMzNXEG1s1AnV0hr8= 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 1741215187461896.5962417928058; Wed, 5 Mar 2025 14:53:07 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 5E95914E8; Wed, 5 Mar 2025 17:53:06 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 14E5316FB; Wed, 5 Mar 2025 17:50:33 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 72B441555; Wed, 5 Mar 2025 17:50:28 -0500 (EST) Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (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 D2228162E for ; Wed, 5 Mar 2025 17:50:11 -0500 (EST) Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-5e53b3fa7daso6699631a12.2 for ; Wed, 05 Mar 2025 14:50:11 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id 41be03b00d2f7-aee7ddf2b0asm12556745a12.9.2025.03.05.14.50.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:10 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215011; x=1741819811; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Fh6SdXjmtp5cmhbl43dMX8xKhniM2ZKhsdDIFJMLMf8=; b=RXkVsGfVEEo5SIhy3AwiRgesyvm9EJHI+q/WVRTSXNsSh9LZtTWHfncRfusWl5iO2+ CZBnMUSWtMIq3/1QYpVe6WWR2+0RiKkY+LV8C12AeX6ohPLI+xLGUnZAqb+czbU2XIOL iaa6F1VvJLe1oy3tBFH60UvxlSR3Nd0CKGHeifcoJdLjyhaObpcC1iAfJh/Hfu4IJmop 8tXjWG8fafD3vY2Gjao6uXPJrkOyd/j1u0S/luWtdYNsrpAbZcQVIH47WMDZ9ER+OGfm SSPcaReIvx9fxoc8R6GEBwq0G1cZ1/84t7vbFhIQDo93wbP2r56kYFTuj5iog9pGxeVC QfEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215011; x=1741819811; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Fh6SdXjmtp5cmhbl43dMX8xKhniM2ZKhsdDIFJMLMf8=; b=EayY/yMl7j6B1RVNgL/4dJ27JvH0GlSeo1cwtW1x0gt48JvffCIcc2Ikvp8lsP+3NU frHdNkhgbgzeipIRlfGhs0IanzssmY6YlG75u6PqTx4Uz/nhilLalK3iZk16EY5Aqtgp Qa0qzrnd3hm04uIH0PV1aLOQI2il9vN4j8OuK0ZP9ebsyV5Fsf7BfugbuBhubd0Ae3fu iA2r9qlG6vKIs1++m2gIKGKUfOwntxtdb5Z2CHEDNAFJPfglz3oVN0CARsT6MF3pAML0 XtmtbG0yFQqPBro/+YoFqEhrKSLpkgOPr8jWBGcEt84f/QE7Q0CF9DBQdlEN093ulmsd +yDw== X-Gm-Message-State: AOJu0Yywqw2EYaeohIMZEa2pwTIlpLjp0sCistVKgeFYiPwf0tMPPNpn osMC9EQ8kJPbMj1D1sxRJnwKeK+4513PCnzp8iLBUhhCQkkL+novfzoCCg5fs3Egrkm8AfSKolC N X-Gm-Gg: ASbGncsBRTAH4H89kFP/7PeJOHqmKcuYrHmblgX3Uub3wwN3x/Hkoe84GpCGpGki8rE URhJ0LV16zS8s5dzzJHzdLHTXuUeoCO93zue0yYoYWY8JIkb9/ddy6RG/yY8/iQf9t2gWT30Bcf XFpueIolhORQqGlFn+YBOLLHwAYJkttva6SMl3Uq7f1T5wCuj69/3GqAilm1oWu2IKWjUiPlPC0 fLmyUs/l8Cz3FP+U1iKe0KubS678RSFBxUDEAeTt0xXfwX4b9IX/6/aknb580+MaileT4XsBGSq 77RfyO5Z8SXGKDiLE8WjtX0fVgQcdOtZLY9srEU44hRNUPHLwnyHJ1b8JpSuHeA= X-Google-Smtp-Source: AGHT+IFHOGb+iazn7Bhck0YszLCLkEXbm6wHFyh0iqHCUd0lJZ9q16T2pbM8edcA888u0cCR8bUSYA== X-Received: by 2002:a05:6402:90d:b0:5e0:60ed:f355 with SMTP id 4fb4d7f45d1cf-5e59f3eb5b9mr4982823a12.18.1741215010678; Wed, 05 Mar 2025 14:50:10 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 06/18] qemu: Add function to get migration params for save Date: Wed, 5 Mar 2025 15:48:15 -0700 Message-ID: <20250305224957.5369-7-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: OOYR4YG24MIMIWQF3NEOO4JKZ7DNGD7G X-Message-ID-Hash: OOYR4YG24MIMIWQF3NEOO4JKZ7DNGD7G 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 CC: farosas@suse.de 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: 1741215188874019100 Content-Type: text/plain; charset="utf-8" Introduce qemuMigrationParamsForSave() to create a qemuMigrationParams object initialized with appropriate migration capabilities and parameters for a save operation. Note that mapped-ram capability 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 to a user-specified value. Signed-off-by: Jim Fehlig Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_migration_params.c | 21 +++++++++++++++++++++ src/qemu/qemu_migration_params.h | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index e1399806d5..8753fb5358 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7139,7 +7139,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDoma= inObj *vm, =20 /* Increase migration bandwidth to unlimited since target is a file. * Failure to change migration speed is not fatal. */ - if (!(migParams =3D qemuMigrationParamsNew())) + if (!(migParams =3D qemuMigrationParamsForSave(false))) return -1; =20 if (qemuMigrationParamsSetULL(migParams, diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 4fc9199f1c..d48cdd5506 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -792,6 +792,27 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr para= ms, } =20 =20 +qemuMigrationParams * +qemuMigrationParamsForSave(bool sparse) +{ + g_autoptr(qemuMigrationParams) saveParams =3D NULL; + + if (!(saveParams =3D qemuMigrationParamsNew())) + return NULL; + + if (sparse) { + if (virBitmapSetBit(saveParams->caps, QEMU_MIGRATION_CAP_MAPPED_RA= M) < 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 2379950ce9..88a1bc1a66 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -87,6 +87,9 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, unsigned int flags, qemuMigrationParty party); =20 +qemuMigrationParams * +qemuMigrationParamsForSave(bool sparse); + int qemuMigrationParamsDump(qemuMigrationParams *migParams, virTypedParameterPtr *params, --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215211; cv=none; d=zohomail.com; s=zohoarc; b=BUQk9c69wfg6UyPxZSyKGz+pu0TfgHlwV4wZ1R/kBPzz+lvvZkAkkZw3gPOuD1B7hCYjzF6FPj8IwZnU+UKNSXG9UE9hVDj0Kg3r7RROYmKHD0FS/7o82lrqHBljBWgExaVN7VjMpxuau1FPcntGY27HQ0FJFranWcgIFukAP2Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215211; h=Content-Transfer-Encoding:Cc:Cc: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; bh=OEZbExuhgQbhPlw0q0CSJp75B1D1X2A6OD3LEoZ6vzo=; b=IkcNbbfZYJ/ztnp3Ys6VSKfTjfKN9oYF3XQxxgCQOeapzVHRZjzLDqbn/V0FUNZg3YoEak+MwMJ1eMQDN15eBNAYwEawYDpUtWZx4FMP8eJynHnuXTkfJ42kh6pToo5i7ZjaZs1gqBWA4URjS0qC6Acv3PpRyzNXW1BIVwMVxm8= 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 1741215211075997.439918771549; Wed, 5 Mar 2025 14:53:31 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 6D7D61569; Wed, 5 Mar 2025 17:53:30 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id D5A37170D; Wed, 5 Mar 2025 17:50:34 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 4B7D115C9; Wed, 5 Mar 2025 17:50:29 -0500 (EST) Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.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 AE8A11537 for ; Wed, 5 Mar 2025 17:50:13 -0500 (EST) Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-abf48293ad0so8269466b.0 for ; Wed, 05 Mar 2025 14:50:13 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2ff4e75ed7csm1861891a91.3.2025.03.05.14.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:11 -0800 (PST) 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_H3, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE 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=1741215012; x=1741819812; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lkqbBuVhPkplvxwkBbESCJvcvuTpUMT2fWq79X15JGA=; b=MLm6Apb/iLEgG49WthmTxEMLzR0C84G2zqkk2e+c9s7as1eRd+/2RuMxEYpKWKDRtg BJqwrHA6SVjMOgXHEqWvbRwPUMxM2JkTen+6l4jqPHwc0hLI5Q51NPnLCPRdr+QKjh1K 9Pj5LlvAu9LCn4MA4P7vsoDizCoTGZoVvh5elMadQ6I4vMe3rl+MIN7Kt4w0GOxIzJTZ vmr0Ag6NiXj5vtYgTCaJivDxpLIPZ8OsWR+fSC/6Po73xsbhIdmY95MuTkmW9cWPVq6V z/xv19wd+t57BxZLvxMydO6NHsXZ4dYBAWGuFRplyFZVOw+Y/GGIQwGo4nVIhQ/7QQe3 9spQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215012; x=1741819812; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lkqbBuVhPkplvxwkBbESCJvcvuTpUMT2fWq79X15JGA=; b=E9RuOks7GbENgcfgcmkhjZ825tnzeQM6CUa2eIzLceMJt904SR+dc6r3fcdBXHgOY6 O3GyQc1tYxmgk0Dk8qUMzjMD7idmm+oemo1h5ZDbwJEX2+TgQkKVJ4eFP9p97Jtb59Tu LBpYyR3rRnqG85Lg5Pv/Avp9npdhyWbPnQOPyTmPuzZqyDeL29H5+E739rYG8XLIxw92 spVv09PhzElmTiZLaEV+QdESTcWdczrKAzGEA4POjWxd50sjELZ1ICn8wsUfJzRxg0ZO z4Dm0U1ZzMeyZogpamjoJiZ7H3bEBZv3ASS50oBMHJRxGgcgELxcBqn7LL9rtss8oUub 78Vg== X-Gm-Message-State: AOJu0YzgIvjz6y2fsWHQmm0bS7fjQ/9K7t2WXLom7zayFr5cYoZW+cob 3QsiytdI3I83JU4QIos83BGplU8bwc0JVoFQy2XN/dLUD5qXDxNCpVxFQV0A9belZQnoTZRLu42 j X-Gm-Gg: ASbGncuChjQiEpVs9zo64CdW5l6CpxzQ0hG7Af4wCkb1j1BN7TWxPOmBVn3eNLnrQNy hQkBGFAyxA9uqzMnh4v/4rzvwTnqPPawL4XOZuSMr+QMhVEk/6DK22wxChQE2UWjXyedefJtURF pALMdcFmGqsZ11z1njHDH7xgknC07Qs19VslTv0RrZ6OOY7VetdmwU4S4fsxfM6Kgb0kLHk9dgs z6C0e0ZGC32ygNFBlXtXlBIvV9o0t91z8h4gJPDkKDkT8r+WJC/bnOk0pHAZWbobmx4G87hAciF AGbgOf/7v4zQjVRIDruapaTALUfK9n81qU79IA3xBYIRRxl6BnZJ0nh8/qlhEp8= X-Google-Smtp-Source: AGHT+IHPSIpQ2uIwkc59VXC0AXEmM5KoGxBZBMzpQgmKiFjbDetjSS//7FKKNpXMdIErcI20t1bGyg== X-Received: by 2002:a17:906:3896:b0:ac2:1c64:b26 with SMTP id a640c23a62f3a-ac21c641538mr261253866b.32.1741215012409; Wed, 05 Mar 2025 14:50:12 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 07/18] qemu_saveimage: add "sparse" to supported save image formats Date: Wed, 5 Mar 2025 15:48:16 -0700 Message-ID: <20250305224957.5369-8-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: RIDN46UXQDD6X7BYSLB4GTT73FVRMEUQ X-Message-ID-Hash: RIDN46UXQDD6X7BYSLB4GTT73FVRMEUQ 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 CC: farosas@suse.de 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: 1741215213061019000 Content-Type: text/plain; charset="utf-8" Extend the list of formats to include "sparse", which uses QEMU's mapped-ram stream format [1] to write guest memory blocks at fixed offsets in the save image file. [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.conf.in | 9 ++++++++- src/qemu/qemu_saveimage.c | 1 + src/qemu/qemu_saveimage.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in index 31172303dc..44ff658ad6 100644 --- a/src/qemu/qemu.conf.in +++ b/src/qemu/qemu.conf.in @@ -588,11 +588,18 @@ # disk space when saving large memory guests. Various compression formats = are # available for specifying a save image compressed by the named algorithm. # Supported compression formats are "zstd", "lzop", "gzip", "bzip2", and "= xz". +# The "sparse" format uses QEMU's mapped-ram stream format to write guest = memory +# blocks at fixed offsets in the save image file. =20 # save_image_format can be used to select the desired save format. "raw" is # the traditional format used by libvirt and is also the default. The # compression formats can be used to save disk space, although this typica= lly -# results in longer save and restore times. +# results in longer save and restore times. The "sparse" format results in= a +# save image file that is roughly the logical size of the guest's memory, +# although on-disk size is a function of guest memory usage. The "sparse" +# format is useful when a predictable maximum save image file size is +# needed. The other formats can result in a save image file much larger +# than guest memory if the guest runs a memory intensive workload. # # save_image_format is used with 'virsh save' or 'virsh managedsave'. It is # an error if the specified save_image_format is not valid, or cannot be diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index d940bfb5c3..29b4e39879 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -45,6 +45,7 @@ VIR_ENUM_IMPL(qemuSaveFormat, "xz", "lzop", "zstd", + "sparse", ); =20 static inline void diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 58f8252c8a..0411f3140a 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -42,6 +42,7 @@ typedef enum { QEMU_SAVE_FORMAT_XZ =3D 3, QEMU_SAVE_FORMAT_LZOP =3D 4, QEMU_SAVE_FORMAT_ZSTD =3D 5, + QEMU_SAVE_FORMAT_SPARSE =3D 6, /* Note: add new members only at the end. These values are used in the on-disk format. Do not change or re-use numbers. */ --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215239; cv=none; d=zohomail.com; s=zohoarc; b=LkKObwXp0a602k3eU7HEXShdhtU3iEVrB+OzqWZjadch6Q3BABHpc8bUINtfmXB23hKcaER+synl/xm9RGvAYhEdaXvtt7/An+LO4Wh1eLpRgQDQm2gcxkMguR3KY+ar3w58JdZExjgtql3qSBbywy/zg7K39QNIDWZAlHEg3rE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215239; h=Content-Transfer-Encoding:Cc:Cc: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; bh=9JdJsHD4aLkRxhKM2tzasji0EgACov5AcQoixD5JJio=; b=G7gjvcc2X+YgLB1W0UCoWYkYEj6LAOqHhD8kwsfPg8WGD+nQQrnDXuK3USrMobOKq9KPpSg6BjpOgYIJeZtpz43XekUc5BqruKHrujXhwhjDJRy4NQnFT0OBw4hHr7RCscGqb2pYRGrsXyBMSRduAPhXNXNvvY2U+GUboxNAnBI= 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 1741215239226476.28610292994233; Wed, 5 Mar 2025 14:53:59 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 989A21605; Wed, 5 Mar 2025 17:53:58 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 565FC1561; Wed, 5 Mar 2025 17:50:43 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 6B8C21526; Wed, 5 Mar 2025 17:50:38 -0500 (EST) Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 605DD1526 for ; Wed, 5 Mar 2025 17:50:15 -0500 (EST) Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-aaec61d0f65so10020666b.1 for ; Wed, 05 Mar 2025 14:50:15 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2ff4e773693sm1874838a91.14.2025.03.05.14.50.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:13 -0800 (PST) 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_H3, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE 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=1741215014; x=1741819814; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Dn5U5pKSkIQIae1N9FSU+zw0xydbcPuMiofaZ8s/Kdg=; b=UXbeUnZMri/SuBz68CBkzizs/wZL+02pxSZgCKM7BOvB2SZAlxbpfmE8ogYh4vyEpy e79exjezyKO9A1GlL6x48mpswOpM1T6X50kkzioDlZGP/bPxd8lv5uGyta0xjAIfJ7p3 zDHH0JehtkNaYIj+5tpgAXR3Him//a/cZ2v+Z+zgOBahnCByIWj5WTp37uatcMk7ZruB botE5ou+17X7pRvn0Ox4q+9hU/bh/mNRmTh2KIRrp8TgVCW3Tgiv98szxjTI92nSgsSm tX2udxRGyp9py/M94/d9vPYhfqdhqpibmO5r6HK0Z8c7f37UwvST0+Y+WPAgE8zaSuON Rr+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215014; x=1741819814; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Dn5U5pKSkIQIae1N9FSU+zw0xydbcPuMiofaZ8s/Kdg=; b=KcQikerInpQNfMS6HpkRwtkXEMYQHnvUbkewI3J2Z9lBXDE2uHtDUVdGuSqegbamAf I80vzShA3EhaJrTrAI3V8nz7CT41vSPPdb4BuhLYsw8VzoVK8OgsGfICPge4/ZiupZXq dcGEoaED1SYozp+ET1Y8q3EAMFL+RsCUlHNIQydmDNra/h5p3qZLNFX5DIy8otpvgwDf kIbcWV6gqBq8Ko75ZJPi292+H+YvN/e390wpCS/Kw+Ot3pji9UZxhIAxou+pGnkH7zgw X3xPZDzuLwmZJhmucgey7L1FA14uSCk7wt92uMXCvD/mJBS/Y423dPN2DLuPJK0s9EKN fWyg== X-Gm-Message-State: AOJu0YwN02zBfTft/RN87AV1lfkLYYc1YYzxF2NKCDI4A2I9kj1kk9ST Fyj7UtnYyWVaID4vb4hDVP12eYlx6mSUji7y0usBX7tAbgGYk5YrtCM7c8/O+rbprasWqtzB/2l V X-Gm-Gg: ASbGnctg1F5WFas9G1jGNjh2K7jDZv9Pz1LC1J4V7hcGkBWQ9wADCLZSIKAA00q94YT mAbqL+uyN1SFBPXOV+WnW8lo0dY8m9bfFYSsIIeRYf9NC5An0KHVjIIK6eCvSzkt3nTeC3E7lkE Wrl4oGcGXxSn0ZEw1QXbINbg6I5HazNJ4XCApaVsRp5dXkGzDFPCuYEu2//IVBTmJ22R/k/6GsH lxYa+eoCi73Aad9IGo4owlo3NRNFGyBGJG+PK0H4haKtvdx4qhE5WS/klVBVScL/O3MwCD+xJzR kJk/Y4HW5Ll0C45c3cyvIY7InvM0zMbM2TO4Pf9AzPdfGi71RUaTyqYIySnu1oE= X-Google-Smtp-Source: AGHT+IH3dl/amA73LuR4ZbExfxDpJJrdiJBEXwTUfFpv6IQlyjAS0p7A5zVkTw4p/dbP7P1x6fgvSg== X-Received: by 2002:a17:907:944b:b0:ac1:f19a:c0b8 with SMTP id a640c23a62f3a-ac20d911f1cmr522118966b.24.1741215014177; Wed, 05 Mar 2025 14:50:14 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 08/18] qemu: Add helper function for creating save image fd Date: Wed, 5 Mar 2025 15:48:17 -0700 Message-ID: <20250305224957.5369-9-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SHWLCEFWTDLEJSRFITDILF4VPTLE5RI6 X-Message-ID-Hash: SHWLCEFWTDLEJSRFITDILF4VPTLE5RI6 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 CC: farosas@suse.de 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: 1741215241151019000 Content-Type: text/plain; charset="utf-8" Move the code in qemuSaveImageCreate that opens, labels, and wraps the save image fd to a helper function, providing more flexibility for upcoming mapped-ram support. Signed-off-by: Jim Fehlig --- src/qemu/qemu_saveimage.c | 65 +++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 29b4e39879..e3f6a0ad0f 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -425,6 +425,50 @@ qemuSaveImageDecompressionStop(virCommand *cmd, } =20 =20 +static int +qemuSaveImageCreateFd(virQEMUDriver *driver, + virDomainObj *vm, + const char *path, + virFileWrapperFd *wrapperFd, + bool *needUnlink, + unsigned int flags) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + int ret =3D -1; + VIR_AUTOCLOSE fd =3D -1; + int directFlag =3D 0; + unsigned int wrapperFlags =3D VIR_FILE_WRAPPER_NON_BLOCKING; + + 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", + _("bypass cache unsupported by this system")); + return -1; + } + } + + fd =3D virQEMUFileOpenAs(cfg->user, cfg->group, false, path, + O_WRONLY | O_TRUNC | O_CREAT | directFlag, + needUnlink); + + if (fd < 0) + return -1; + + if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) = < 0) + return -1; + + if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) + return -1; + + ret =3D fd; + fd =3D -1; + + return ret; +} + + /* 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 */ @@ -441,33 +485,14 @@ qemuSaveImageCreate(virQEMUDriver *driver, bool needUnlink =3D false; 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", - _("bypass cache unsupported by this system")); - goto cleanup; - } - } + fd =3D qemuSaveImageCreateFd(driver, vm, path, wrapperFd, &needUnlink,= flags); =20 - fd =3D virQEMUFileOpenAs(cfg->user, cfg->group, false, path, - O_WRONLY | O_TRUNC | O_CREAT | directFlag, - &needUnlink); if (fd < 0) goto cleanup; =20 - if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) = < 0) - goto cleanup; - - if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) - goto cleanup; - if (virQEMUSaveDataWrite(data, fd, path) < 0) goto cleanup; =20 --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215315; cv=none; d=zohomail.com; s=zohoarc; b=MWtIOxwQZ8x0WuBNKphvUNpMWLI+Yqzy4wkvFEQYUkh4ADvLvEDueAwSkayslngXEgHZSIcUebaLicD55GvBLU1ZtTEPRhXURmxG0TQsxvsLPn20FI+u6YAFQXaRUJlAKq9YmisnfOs83CVBD7SVgMAsvRdAsD6OWSQIIMFE7t8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215315; h=Content-Transfer-Encoding:Cc:Cc: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; bh=wsyccqziO58siWm1JjO+8imjEZnsYtjqBFaYDAMszhA=; b=UQhVjJVOPdOgzZ0zgfEb5rIllhwCf/6VDuJri4T1ClIg3RiBxyw1i8ER7Oitt4oeubqNJFKCKDsGFxfP1cKsBn19SqBxJoqsWL5zj6REdooRWQQ3Yt77Aymopk5GpeQj8scjKzNU/8xSrU0NNR8t6IvCd1VkLh9zdJ9kgzjK/y4= 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 1741215315749194.87825059485237; Wed, 5 Mar 2025 14:55:15 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 0273F1730; Wed, 5 Mar 2025 17:55:14 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id DB9F515FE; Wed, 5 Mar 2025 17:50:47 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 0FDA81504; Wed, 5 Mar 2025 17:50:40 -0500 (EST) Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (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 373DA1634 for ; Wed, 5 Mar 2025 17:50:17 -0500 (EST) Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-390e3b3d3bcso1471f8f.3 for ; Wed, 05 Mar 2025 14:50:17 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-736560f5e6esm6815203b3a.104.2025.03.05.14.50.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:15 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215016; x=1741819816; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+gpIRt2ehGhrqSLFU4TJ1ICodKxYXSDUDYmD9VIr61w=; b=LLJs+1JI6gcVnkUCt/wziLabJSUFcFDvkeZnb+n5CIMyiC4HgC+Tf+JWSfmYKPMwF4 XvFr7thCLWBDeHiKsT2i6OTx52MF31Byl5DjKz1FuWPVFA6fDv/pHDQ4KpCB4UTXVKkr 3f0HeVKPPQM4wNj+SnO9Qi8y3yWS1kL6f+nYMuf+roGsMJ4ggoL6IXpy6nDJvKNI8fyU JlRB72w1GBmuKMt0veGj04HylQSCRWHwTUeP9cJ2d6vSOKoZ3N0bdJI4rmOkwGABtGMG zpRNzZt+Ma8x4M9dViYYnNSRb6bwjYnPk2Zt4uqCNBbBj60i6VphBwtJ172LwRu7NahN HJWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215016; x=1741819816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+gpIRt2ehGhrqSLFU4TJ1ICodKxYXSDUDYmD9VIr61w=; b=Enq/K9PDSWQ9sPfNteZZOqcWBqXrERPuhVLXv7xSPMoS7W39jzky4dj9uPsPSALsyR zpPZxD0YokrTufBH4iPskbZp9ZZWdW6fb4SOtEEtsCRdRRrz/MWn997tiF1MQ43vwn2E gCNugTM+BbBKt7s0yEXva0mZUMRhmAXI9ZwtNuX/NpHFAe3oc+Q0UVp8TSsT2KzFutbJ bKg9ZUvDlp7/Cb7wI3Eh4va34Fgi9Mm0X2MQfpGzsoCGBeUUsZXpUYhifIx4SsN4WPEI hiwXy7cmI/wtkSBVUyWyUuWe2+b/KjnvFisAX6+emS4qEGnwki1hDLQ9gm89VIrYUwhA B+FQ== X-Gm-Message-State: AOJu0Yylw1slXgsC0TwMyVb1yCWfP9EodolAdjwRaFCQEs/sMCQY6lfe UKWX+9ypNSGC3OhECjLfiFX+CeuWLfCrujOLROnHdaEHBzIXLhVEAxqVgkkEKJ+LbV2j/GYztsY 8 X-Gm-Gg: ASbGnctjy6Lu+PDf6R6ZmPmmfusHFakBKd+TKkUgM9cUveY2wUljJWjh1XHlVaPPj0Y 0XTv8SM+Yzcybw4o/YolZYyiiPcTDNa0ruegerPpTRL73r8b8pm0PNr1EVGqf84RvMLCpOMFaJH S4CfZFO927YMx/OmlxwqdbjMBnIcwf8VyzObu4Lf0VySNXQKah5LCeQllQ/j2AC0iBCVk2kNNsh Oh0YoXu8+VdC9Dj7eMw89xcXusd/XDFmSsDtK9rvugU9956aIOiYm5DkUHgCPpkQ5qE2OigMw2W OFH1pu38Ys3Qcyshv3bGerlSQ35Zd1a8WiveUEQbeSo3TNs/Jxhj/VKmdxIjQyc= X-Google-Smtp-Source: AGHT+IHoGaIfPmuH46tFnIeJH7H7O7Zwq74FTwxei00H568EZmyGHVACgmJx12p8gOqK7Y2PSvWc0A== X-Received: by 2002:a05:6000:4026:b0:391:a43:8bbd with SMTP id ffacd0b85a97d-3911f7403bemr5126960f8f.21.1741215015932; Wed, 05 Mar 2025 14:50:15 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 09/18] qemu: Add support for mapped-ram on save Date: Wed, 5 Mar 2025 15:48:18 -0700 Message-ID: <20250305224957.5369-10-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JRDPDG4ZQR4XT5D6GUJNYGKKHU2TEOAR X-Message-ID-Hash: JRDPDG4ZQR4XT5D6GUJNYGKKHU2TEOAR 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 CC: farosas@suse.de 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: 1741215317597019000 Content-Type: text/plain; charset="utf-8" Introduce support for QEMU's new mapped-ram stream format [1]. mapped-ram can be enabled by setting the 'save_image_format' setting in qemu.conf to 'sparse'. To use mapped-ram with QEMU: - The 'mapped-ram' migration capability must be set to true - The 'multifd' migration capability must be set to true and the 'multifd-channels' migration parameter must set to 1 - QEMU must be provided an fdset containing the migration fd - The 'migrate' qmp command is invoked with a URI referencing the fdset and an offset where to start reading or writing the data stream, e.g. {"execute":"migrate", "arguments":{"detach":true,"resume":false, "uri":"file:/dev/fdset/0,offset=3D0x11921"}} The mapped-ram stream, in conjunction with direct IO and multifd support provided by subsequent patches, can significantly improve the time required to save VM memory state. The following tables compare mapped-ram with the existing, sequential save stream. In all cases, the save and restore operations are to/from a block device comprised of two NVMe disks in RAID0 configuration with xfs (~8600MiB/s). The values in the 'save time' and 'restore time' columns were scraped from the 'real' time reported by time(1). The 'Size' and 'Blocks' columns were provided by the corresponding outputs of stat(1). VM: 32G RAM, 1 vcpu, idle (shortly after boot) | save | restore | | time | time | Size | Blocks -----------------------+---------+---------+--------------+-------- legacy | 6.193s | 4.399s | 985744812 | 1925288 -----------------------+---------+---------+--------------+-------- mapped-ram | 5.109s | 1.176s | 34368554354 | 1774472 -----------------------+---------+---------+--------------+-------- legacy + direct IO | 5.725s | 4.512s | 985765251 | 1925328 -----------------------+---------+---------+--------------+-------- mapped-ram + direct IO | 4.627s | 1.490s | 34368554354 | 1774304 -----------------------+---------+---------+--------------+-------- mapped-ram + direct IO | | | | + multifd-channels=3D8 | 4.421s | 0.845s | 34368554318 | 1774312 ------------------------------------------------------------------- VM: 32G RAM, 30G dirty, 1 vcpu in tight loop dirtying memory | save | restore | | time | time | Size | Blocks -----------------------+---------+---------+--------------+--------- legacy | 25.800s | 14.332s | 33154309983 | 64754512 -----------------------+---------+---------+--------------+--------- mapped-ram | 18.742s | 15.027s | 34368559228 | 64617160 -----------------------+---------+---------+--------------+--------- legacy + direct IO | 13.115s | 18.050s | 33154310496 | 64754520 -----------------------+---------+---------+--------------+--------- mapped-ram + direct IO | 13.623s | 15.959s | 34368557392 | 64662040 -----------------------+-------- +---------+--------------+--------- mapped-ram + direct IO | | | | + multifd-channels=3D8 | 6.994s | 6.470s | 34368554980 | 64665776 -------------------------------------------------------------------- As can be seen from the tables, one caveat of mapped-ram is the logical file size of a saved image is basically equivalent to the VM memory size. Note however that mapped-ram typically uses fewer blocks on disk, hence the name 'sparse' for 'save_image_format'. Also note the mapped-ram stream is incompatible with the existing stream format, hence mapped-ram cannot be used to restore an image saved with the existing format and vice versa. [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_driver.c | 23 +++++- src/qemu/qemu_migration.c | 149 ++++++++++++++++++++++++++------------ src/qemu/qemu_migration.h | 4 +- src/qemu/qemu_monitor.c | 34 +++++++++ src/qemu/qemu_monitor.h | 4 + src/qemu/qemu_saveimage.c | 31 +++++--- src/qemu/qemu_saveimage.h | 1 + src/qemu/qemu_snapshot.c | 7 +- 8 files changed, 191 insertions(+), 62 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 53bdae402a..2b2dda9d26 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2599,6 +2599,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver, qemuDomainObjPrivate *priv =3D vm->privateData; virQEMUSaveData *data =3D NULL; g_autoptr(qemuDomainSaveCookie) cookie =3D NULL; + g_autoptr(qemuMigrationParams) saveParams =3D NULL; =20 if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SAVE, VIR_DOMAIN_JOB_OPERATION_SAVE, flags) < = 0) @@ -2607,6 +2608,14 @@ qemuDomainSaveInternal(virQEMUDriver *driver, if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SAVE, 0)) goto endjob; =20 + if (format =3D=3D QEMU_SAVE_FORMAT_SPARSE && + !qemuMigrationCapsGet(vm, QEMU_MIGRATION_CAP_MAPPED_RAM)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("save image format %1$s is not supported by this = QEMU binary"), + qemuSaveFormatTypeToString(format)); + goto endjob; + } + if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("guest unexpectedly quit")); @@ -2670,8 +2679,11 @@ qemuDomainSaveInternal(virQEMUDriver *driver, goto endjob; xml =3D NULL; =20 + if (!(saveParams =3D qemuMigrationParamsForSave(format =3D=3D QEMU_SAV= E_FORMAT_SPARSE))) + goto endjob; + ret =3D qemuSaveImageCreate(driver, vm, path, data, compressor, - flags, VIR_ASYNC_JOB_SAVE); + saveParams, flags, VIR_ASYNC_JOB_SAVE); if (ret < 0) goto endjob; =20 @@ -3103,6 +3115,8 @@ doCoreDump(virQEMUDriver *driver, memory_dump_format) < 0) goto cleanup; } else { + g_autoptr(qemuMigrationParams) dump_params =3D NULL; + if (dumpformat !=3D VIR_DOMAIN_CORE_DUMP_FORMAT_RAW) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("kdump-compressed format is only supported wi= th memory-only dump")); @@ -3112,8 +3126,11 @@ doCoreDump(virQEMUDriver *driver, if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_DUMP, 0)) goto cleanup; =20 - if (qemuMigrationSrcToFile(driver, vm, fd, compressor, - VIR_ASYNC_JOB_DUMP) < 0) + if (!(dump_params =3D qemuMigrationParamsNew())) + goto cleanup; + + if (qemuMigrationSrcToFile(driver, vm, &fd, compressor, + dump_params, dump_flags, VIR_ASYNC_JOB_= DUMP) < 0) goto cleanup; } =20 diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 8753fb5358..f692986056 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7118,46 +7118,17 @@ qemuMigrationProcessUnattended(virQEMUDriver *drive= r, } =20 =20 -/* Helper function called while vm is active. */ -int -qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, - int fd, - virCommand *compressor, - virDomainAsyncJob asyncJob) +static int +qemuMigrationSrcToLegacyFile(virQEMUDriver *driver, + virDomainObj *vm, + int fd, + virCommand *compressor, + virDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv =3D vm->privateData; - int rc; int ret =3D -1; int pipeFD[2] =3D { -1, -1 }; - unsigned long saveMigBandwidth =3D priv->migMaxBandwidth; char *errbuf =3D NULL; - virErrorPtr orig_err =3D NULL; - g_autoptr(qemuMigrationParams) migParams =3D NULL; - - if (qemuMigrationSetDBusVMState(driver, vm) < 0) - return -1; - - /* Increase migration bandwidth to unlimited since target is a file. - * Failure to change migration speed is not fatal. */ - if (!(migParams =3D qemuMigrationParamsForSave(false))) - return -1; - - if (qemuMigrationParamsSetULL(migParams, - QEMU_MIGRATION_PARAM_MAX_BANDWIDTH, - QEMU_DOMAIN_MIG_BANDWIDTH_MAX * 1024 * 1= 024) < 0) - return -1; - - if (qemuMigrationParamsApply(vm, asyncJob, migParams, 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; - } =20 if (compressor && virPipe(pipeFD) < 0) return -1; @@ -7174,7 +7145,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDoma= inObj *vm, goto cleanup; =20 if (!compressor) { - rc =3D qemuMonitorMigrateToFd(priv->mon, 0, fd); + ret =3D qemuMonitorMigrateToFd(priv->mon, 0, fd); } else { virCommandSetInputFD(compressor, pipeFD[0]); virCommandSetOutputFD(compressor, &fd); @@ -7190,12 +7161,98 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDo= mainObj *vm, qemuDomainObjExitMonitor(vm); goto cleanup; } - rc =3D qemuMonitorMigrateToFd(priv->mon, 0, pipeFD[1]); + ret =3D qemuMonitorMigrateToFd(priv->mon, 0, pipeFD[1]); if (VIR_CLOSE(pipeFD[0]) < 0 || VIR_CLOSE(pipeFD[1]) < 0) VIR_WARN("failed to close intermediate pipe"); } qemuDomainObjExitMonitor(vm); + + cleanup: + VIR_FORCE_CLOSE(pipeFD[0]); + VIR_FORCE_CLOSE(pipeFD[1]); + + if (errbuf) { + VIR_DEBUG("Compression binary stderr: %s", NULLSTR(errbuf)); + VIR_FREE(errbuf); + } + + return ret; +} + + +static int +qemuMigrationSrcToSparseFile(virQEMUDriver *driver, + virDomainObj *vm, + int *fd, + unsigned int flags, + virDomainAsyncJob asyncJob) +{ + int ret; + + /* 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 (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, *fd)= < 0) + return -1; + + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) + return -1; + + ret =3D qemuMonitorMigrateToFdSet(vm, 0, fd); + qemuDomainObjExitMonitor(vm); + return ret; +} + + +/* Helper function called while vm is active. */ +int +qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, + int *fd, + virCommand *compressor, + qemuMigrationParams *migParams, + unsigned int flags, + virDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + int rc; + int ret =3D -1; + unsigned long saveMigBandwidth =3D priv->migMaxBandwidth; + virErrorPtr orig_err =3D NULL; + + if (qemuMigrationSetDBusVMState(driver, vm) < 0) + return -1; + + /* Increase migration bandwidth to unlimited since target is a file. + * Failure to change migration speed is not fatal. */ + if (migParams && + qemuMigrationParamsSetULL(migParams, + QEMU_MIGRATION_PARAM_MAX_BANDWIDTH, + QEMU_DOMAIN_MIG_BANDWIDTH_MAX * 1024 * 1= 024) < 0) + return -1; + + if (qemuMigrationParamsApply(vm, asyncJob, migParams, 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 (migParams && + qemuMigrationParamsCapEnabled(migParams, QEMU_MIGRATION_CAP_MAPPED= _RAM)) + rc =3D qemuMigrationSrcToSparseFile(driver, vm, fd, flags, asyncJo= b); + else + rc =3D qemuMigrationSrcToLegacyFile(driver, vm, *fd, compressor, a= syncJob); + if (rc < 0) goto cleanup; =20 @@ -7221,8 +7278,17 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDom= ainObj *vm, if (ret < 0 && !orig_err) virErrorPreserveLast(&orig_err); =20 - /* Restore max migration bandwidth */ + /* Remove fdset passed to qemu and restore max migration bandwidth */ if (qemuDomainObjIsActive(vm)) { + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) =3D=3D 0) { + qemuFDPass *fdPass =3D + qemuFDPassNewFromMonitor("libvirt-outgoing-migrate", priv-= >mon); + + if (fdPass) + qemuFDPassTransferMonitorRollback(fdPass, priv->mon); + qemuDomainObjExitMonitor(vm); + } + if (qemuMigrationParamsSetULL(migParams, QEMU_MIGRATION_PARAM_MAX_BANDWIDTH, saveMigBandwidth * 1024 * 1024) =3D= =3D 0) @@ -7231,13 +7297,6 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDom= ainObj *vm, priv->migMaxBandwidth =3D saveMigBandwidth; } =20 - VIR_FORCE_CLOSE(pipeFD[0]); - VIR_FORCE_CLOSE(pipeFD[1]); - if (errbuf) { - VIR_DEBUG("Compression binary stderr: %s", NULLSTR(errbuf)); - VIR_FREE(errbuf); - } - virErrorRestore(&orig_err); =20 return ret; diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index efe1b9e88a..9fa007b949 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -238,8 +238,10 @@ qemuMigrationSrcIsAllowed(virDomainObj *vm, int qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, - int fd, + int *fd, virCommand *compressor, + qemuMigrationParams *migParams, + unsigned int flags, 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 c069d17265..8d244c6f4a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2232,6 +2232,40 @@ 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; + g_autofree char *uri =3D NULL; + int ret; + + 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) { + virReportSystemError(errno, + "%s", _("failed to seek on file descriptor")); + return -1; + } + + fdPassMigrate =3D qemuFDPassNew("libvirt-outgoing-migrate", priv); + qemuFDPassAddFD(fdPassMigrate, fd, "-fd"); + qemuFDPassTransferMonitor(fdPassMigrate, mon); + + uri =3D g_strdup_printf("file:%s,offset=3D%#lx", + qemuFDPassGetPath(fdPassMigrate), offset); + ret =3D qemuMonitorJSONMigrate(mon, flags, uri); + + return ret; +} + + int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f7b9263b64..4022bc3c7b 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -859,6 +859,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 e3f6a0ad0f..cad982f450 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -430,6 +430,7 @@ qemuSaveImageCreateFd(virQEMUDriver *driver, virDomainObj *vm, const char *path, virFileWrapperFd *wrapperFd, + bool sparse, bool *needUnlink, unsigned int flags) { @@ -439,7 +440,7 @@ qemuSaveImageCreateFd(virQEMUDriver *driver, int directFlag =3D 0; unsigned int wrapperFlags =3D VIR_FILE_WRAPPER_NON_BLOCKING; =20 - if (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) { + if (!sparse && flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) { wrapperFlags |=3D VIR_FILE_WRAPPER_BYPASS_CACHE; directFlag =3D virFileDirectFdFlag(); if (directFlag < 0) { @@ -459,7 +460,7 @@ qemuSaveImageCreateFd(virQEMUDriver *driver, if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) = < 0) return -1; =20 - if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) + if (!sparse && !(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperF= lags))) return -1; =20 ret =3D fd; @@ -478,6 +479,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, const char *path, virQEMUSaveData *data, virCommand *compressor, + qemuMigrationParams *saveParams, unsigned int flags, virDomainAsyncJob asyncJob) { @@ -486,9 +488,10 @@ qemuSaveImageCreate(virQEMUDriver *driver, int ret =3D -1; int fd =3D -1; virFileWrapperFd *wrapperFd =3D NULL; + bool sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; =20 /* Obtain the file handle. */ - fd =3D qemuSaveImageCreateFd(driver, vm, path, wrapperFd, &needUnlink,= flags); + fd =3D qemuSaveImageCreateFd(driver, vm, path, wrapperFd, sparse, &nee= dUnlink, flags); =20 if (fd < 0) goto cleanup; @@ -497,7 +500,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, goto cleanup; =20 /* Perform the migration */ - if (qemuMigrationSrcToFile(driver, vm, fd, compressor, asyncJob) < 0) + if (qemuMigrationSrcToFile(driver, vm, &fd, compressor, saveParams, fl= ags, asyncJob) < 0) goto cleanup; =20 /* Touch up file header to mark image complete. */ @@ -505,14 +508,18 @@ qemuSaveImageCreate(virQEMUDriver *driver, /* Reopen the file to touch up the header, since we aren't set * 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; - } + * that's acceptable. + * If using mapped-ram, the fd was passed to qemu, so no need + * to close it. */ + if (!sparse) { + if (VIR_CLOSE(fd) < 0) { + virReportSystemError(errno, _("unable to close %1$s"), path); + goto cleanup; + } =20 - if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) - goto cleanup; + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) + goto cleanup; + } =20 if ((fd =3D qemuDomainOpenFile(cfg, vm->def, path, O_WRONLY, NULL)) < = 0 || virQEMUSaveDataFinish(data, &fd, path) < 0) @@ -552,7 +559,7 @@ qemuSaveImageGetCompressionProgram(int format, =20 *compressor =3D NULL; =20 - if (format =3D=3D QEMU_SAVE_FORMAT_RAW) + if (format =3D=3D QEMU_SAVE_FORMAT_RAW || format =3D=3D QEMU_SAVE_FORM= AT_SPARSE) return 0; =20 if (!(prog =3D virFindFileInPath(imageFormat))) { diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 0411f3140a..495d773ea5 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -136,6 +136,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, const char *path, virQEMUSaveData *data, virCommand *compressor, + qemuMigrationParams *saveParams, unsigned int flags, virDomainAsyncJob asyncJob); =20 diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 891e67e98b..fa814e051c 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1661,6 +1661,8 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *drive= r, =20 /* do the memory snapshot if necessary */ if (memory) { + g_autoptr(qemuMigrationParams) snap_params =3D NULL; + /* check if migration is possible */ if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, = 0)) goto cleanup; @@ -1691,8 +1693,11 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driv= er, =20 memory_existing =3D virFileExists(snapdef->memorysnapshotfile); =20 + if (!(snap_params =3D qemuMigrationParamsNew())) + goto cleanup; + if ((ret =3D qemuSaveImageCreate(driver, vm, snapdef->memorysnapsh= otfile, - data, compressor, 0, + data, compressor, snap_params, 0, VIR_ASYNC_JOB_SNAPSHOT)) < 0) goto cleanup; =20 --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215265; cv=none; d=zohomail.com; s=zohoarc; b=Y5OhR4xHlVEH/y/g9UmpNQGjltFgKxkJ5YLx3qhiwYLQfnxLuSC3Vi37QmGfG9QTKdaPcU3iLwILslHlFr1WuBt2Zqd4n0qoIY+pnMzRz2f6SE+nooUZHgjU+Qns+1Wwck1PhBHQfBuv2o88TvoqN28lLJJ4cc361kIKLaCxfRA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215265; h=Content-Transfer-Encoding:Cc:Cc: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; bh=uvP7++f2OhizJE3+o0F6GkDMwxrtHBRks+e1Sroj3no=; b=J1c4PC1O0Sf6lSY16A2dHf7HHNz12lgDesk0jrczauLJUmIDgBx8PzoTnIDmI4R+CgKNAtUG8sT3/xB3xQXYfCDlYyHfKYor+4zdmpuk1ojh8jbu/w9c2CrFtsGE0gDnoCP1SvJQT+qLH96HuoOKGEuNTZDxFbfAHHvciJlDKzE= 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 1741215265033582.7972743606354; Wed, 5 Mar 2025 14:54:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id E1AE817AB; Wed, 5 Mar 2025 17:54:23 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 30F04150B; Wed, 5 Mar 2025 17:50:46 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 70A501663; Wed, 5 Mar 2025 17:50:39 -0500 (EST) Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (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 E481915EE for ; Wed, 5 Mar 2025 17:50:18 -0500 (EST) Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5dca468c5e4so1660083a12.1 for ; Wed, 05 Mar 2025 14:50:18 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73667e0c9e5sm5368517b3a.14.2025.03.05.14.50.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:17 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215018; x=1741819818; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YG0g6lqgq9wciHPpT9sKF8kcKwbDko6uwyFN5XmDZCQ=; b=CDgkqt9edICs+/bdjX56rXp8tDALguEVQn/lNqDvStSxwReEaMEAlNwJrg6VOmTO6H cNre1xwXPKu4vCOh6ehjok5x2hvhMXsQPuyMRnA/B82zy/Re0zC+R7MsJ9nWxHexNgUW +BWXFcJMRHnrJmMJBMM+9cpsWRkI9/kc9pG/Yj/mVNnavuspYu29DlGAHG/T+h1HtalY CsNVGPLXm1R1BskF4oTyBzklZULt8t30KitAxEalNlFvHnf2aa0Nn1wnRdPoeU2/q5I3 epNdhnBGKy2abXMuVbSjy/ebZa5tYwGMcFdQlLslhM+ilxXpR9oQhb3EgQlWRBlIjKBK 68Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215018; x=1741819818; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YG0g6lqgq9wciHPpT9sKF8kcKwbDko6uwyFN5XmDZCQ=; b=csf7cpt5mRir0qZ+tandFCvb8WNGvpY7lcwkOdEUrwjqGPmMtErpfwBqnFBviJXjl0 /f0lN8ZQpZ7ptVHqYxlwAQvoUuDUewHYfuWzFfB57lIqRDjmQxFqITHTraaPLN0TD3V9 SU3zWbWwvVclj2KW8GCvn0rKMY6VUfJzyyCnSIQorNkGqT71y7LfLV6KsgtGWzu5PGae IROR3H85fVwXvdi4pzuLh3WbIFxAcIrI7LWWmL9GlaoMvL3pq/RSlutO3M7j4vr2iKR+ oRP15VvHsxcYRJdWyKX2Zv3FfXg4ziyUJE/q8lxtZ6KyxZV8XqKAEEPaphgkGbJaSgMa ecMw== X-Gm-Message-State: AOJu0YzUoDYnrd5zH8ywnUsImdmnTsZdgbKp4B3VqZhhY4wdrqTq7pxU YDdz7XpsUdpsYNm1kjpTcKNK31ijjTpp1Rvsc2urjeSrRQBRLyUtI2cx1hjcY/7W4bGDUnLDFUN K X-Gm-Gg: ASbGncsUGO+3CUl+yNkKylacUhYamTL2bYp9dL3RYdS02/LvAzr6phYmoD+x9lBC+Jv VLj4bp35AB4LwNVayItT8Y+TzPC5VeqbSzFHSNT9BBzYC50PuBcs/4TdPDDT7/ruGcAO03461LU kT8ool5PJVBGUimOjHC73gyCK3dEELJo537FgNV7OkP7P2sQo6TOvl7ZHbWhkUuL3rfbSEDOa/Q f0vPvaecwLmPPUNU8j2//u+0WVZz9jm9tjXDBJIRv6Wc5jdAvfewT1z5CQuuOZ6DzR2Rl8Eqo2D RNVQ2wAJEYOibscJ8n+RdjtUiMM5CpjKEBZuO91cbKMYA8kc03uEsQSfkpaglEc= X-Google-Smtp-Source: AGHT+IHNp/7+U/8nkFR25NstDz/ERTItpy69hcyWTXUiIhul5U1z/2PVFQiw0Ze0oc0f+XU7zwCJ2w== X-Received: by 2002:a05:6402:4305:b0:5dc:63d:b0c1 with SMTP id 4fb4d7f45d1cf-5e59f486e1fmr5127954a12.29.1741215017665; Wed, 05 Mar 2025 14:50:17 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 10/18] qemu: Move creation of qemuProcessIncomingDef struct Date: Wed, 5 Mar 2025 15:48:19 -0700 Message-ID: <20250305224957.5369-11-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: J22MET7M6BAHCIZNUIF6NZU2COINNVYI X-Message-ID-Hash: J22MET7M6BAHCIZNUIF6NZU2COINNVYI 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 CC: farosas@suse.de 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: 1741215267128019100 Content-Type: text/plain; charset="utf-8" qemuProcessStartWithMemoryState() is the only caller of qemuProcessStart() that uses the qemuProcessIncomingDef struct. Move creation of the struct to qemuProcessStartWithMemoryState(). Signed-off-by: Jim Fehlig --- src/qemu/qemu_process.c | 42 ++++++++++++++++++++--------------------- src/qemu/qemu_process.h | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 7b7b5c17e3..cf99e4461d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8347,7 +8347,7 @@ qemuProcessStart(virConnectPtr conn, virDomainObj *vm, virCPUDef *updatedCPU, virDomainAsyncJob asyncJob, - const char *migrateFrom, + qemuProcessIncomingDef *incoming, int migrateFd, const char *migratePath, virDomainMomentObj *snapshot, @@ -8355,7 +8355,6 @@ qemuProcessStart(virConnectPtr conn, unsigned int flags) { qemuDomainObjPrivate *priv =3D vm->privateData; - qemuProcessIncomingDef *incoming =3D NULL; unsigned int stopFlags; bool relabel =3D false; bool relabelSavedState =3D false; @@ -8363,11 +8362,11 @@ qemuProcessStart(virConnectPtr conn, int rv; =20 VIR_DEBUG("conn=3D%p driver=3D%p vm=3D%p name=3D%s id=3D%d asyncJob=3D= %s " - "migrateFrom=3D%s migrateFd=3D%d migratePath=3D%s " + "incoming=3D%p migrateFd=3D%d migratePath=3D%s " "snapshot=3D%p vmop=3D%d flags=3D0x%x", conn, driver, vm, vm->def->name, vm->def->id, virDomainAsyncJobTypeToString(asyncJob), - NULLSTR(migrateFrom), migrateFd, NULLSTR(migratePath), + incoming, migrateFd, NULLSTR(migratePath), snapshot, vmop, flags); =20 virCheckFlagsGoto(VIR_QEMU_PROCESS_START_COLD | @@ -8376,20 +8375,13 @@ qemuProcessStart(virConnectPtr conn, VIR_QEMU_PROCESS_START_GEN_VMID | VIR_QEMU_PROCESS_START_RESET_NVRAM, cleanup); =20 - if (!migrateFrom && !snapshot) + if (!incoming && !snapshot) flags |=3D VIR_QEMU_PROCESS_START_NEW; =20 if (qemuProcessInit(driver, vm, updatedCPU, - asyncJob, !!migrateFrom, flags) < 0) + asyncJob, !!incoming, flags) < 0) goto cleanup; =20 - if (migrateFrom) { - incoming =3D qemuProcessIncomingDefNew(priv->qemuCaps, NULL, migra= teFrom, - migrateFd, migratePath); - if (!incoming) - goto stop; - } - if (qemuProcessPrepareDomain(driver, vm, flags) < 0) goto stop; =20 @@ -8442,14 +8434,13 @@ qemuProcessStart(virConnectPtr conn, qemuSecurityRestoreSavedStateLabel(driver->securityManager, vm->def, migratePath) < 0) VIR_WARN("failed to restore save state label on %s", migratePath); - qemuProcessIncomingDefFree(incoming); return ret; =20 stop: stopFlags =3D 0; if (!relabel) stopFlags |=3D VIR_QEMU_PROCESS_STOP_NO_RELABEL; - if (migrateFrom) + if (incoming) stopFlags |=3D VIR_QEMU_PROCESS_STOP_MIGRATED; if (priv->mon) qemuMonitorSetDomainLog(priv->mon, NULL, NULL, NULL); @@ -8503,8 +8494,9 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, VIR_AUTOCLOSE intermediatefd =3D -1; g_autoptr(virCommand) cmd =3D NULL; g_autofree char *errbuf =3D NULL; - const char *migrateFrom =3D NULL; + qemuProcessIncomingDef *incoming =3D NULL; int rc =3D 0; + int ret =3D -1; =20 if (data) { if (virSaveCookieParseString(data->cookie, (virObject **)&cookie, @@ -8515,10 +8507,15 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, &errbuf, &cmd) < 0) { return -1; } - - migrateFrom =3D "stdio"; } =20 + /* The fd passed to qemuProcessIncomingDefNew is used to create the mi= gration + * URI, so it must be called after starting the decompression program. + */ + incoming =3D qemuProcessIncomingDefNew(priv->qemuCaps, NULL, "stdio", = *fd, path); + if (!incoming) + return -1; + /* No cookie means libvirt which saved the domain was too old to mess = up * the CPU definitions. */ @@ -8529,7 +8526,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, priv->disableSlirp =3D true; =20 if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, - asyncJob, migrateFrom, *fd, path, snapshot, + asyncJob, incoming, *fd, path, snapshot, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, start_flags) =3D=3D 0) *started =3D true; @@ -8541,14 +8538,17 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, =20 virDomainAuditStart(vm, reason, *started); if (!*started || rc < 0) - return -1; + goto cleanup; =20 /* qemuProcessStart doesn't unset the qemu error reporting infrastruct= ure * in case of migration (which is used in this case) so we need to res= et it * so that the handle to virtlogd is not held open unnecessarily */ qemuMonitorSetDomainLog(qemuDomainGetMonitor(vm), NULL, NULL, NULL); + ret =3D 0; =20 - return 0; + cleanup: + qemuProcessIncomingDefFree(incoming); + return ret; } =20 =20 diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index fee00ce53b..a9e0a03a21 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -83,7 +83,7 @@ int qemuProcessStart(virConnectPtr conn, virDomainObj *vm, virCPUDef *updatedCPU, virDomainAsyncJob asyncJob, - const char *migrateFrom, + qemuProcessIncomingDef *incoming, int stdin_fd, const char *stdin_path, virDomainMomentObj *snapshot, --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215348; cv=none; d=zohomail.com; s=zohoarc; b=kxXRdZWgXID7TMmdmnJIqtcE/gafcK1chu/kKR2SW+li9O+R5zp+OkR2yuw3QMMRE1AB1uVz7IdQcHnW5EGxwi8rC34WttmFwJvGZOyiRcLrmVMV/pzRIhsTt2EM+E82C0ObQpbRI7EmIgtTt+qOVpfiK/D+PBwz7Dhqki41Pdg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215348; h=Content-Transfer-Encoding:Cc:Cc: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; bh=WnwP0d4F8ak64CABMsh+iQnMmU+IupPy18ywFSD3kpc=; b=Ck87lKukAe3AWZedUorL6y60qURndgbabrDxjNNsnhZJ/7cajH/+px8MpTJkQDGKJIA4+mUxZK+9umvELJ/d65PG6l/br5+GaDo8AhPX53nokhnaOoRWUz87J8bKU/nEANGnG81aWPFGNBYAYzST0dkijTdXieyyUGNd45pc7Z4= 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 1741215348890206.02366728916672; Wed, 5 Mar 2025 14:55:48 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 3DA0016D6; Wed, 5 Mar 2025 17:55:48 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 824A4177A; Wed, 5 Mar 2025 17:50:51 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id B503A1524; Wed, 5 Mar 2025 17:50:41 -0500 (EST) Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.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 824461502 for ; Wed, 5 Mar 2025 17:50:20 -0500 (EST) Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-aaf900cc7fbso6842966b.3 for ; Wed, 05 Mar 2025 14:50:20 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73645459adcsm8074703b3a.141.2025.03.05.14.50.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:18 -0800 (PST) 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_H3, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE 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=1741215019; x=1741819819; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sHaSnVJGahW2SBkZFBEmNpemRYDlJEZ6HWbziQkkMV0=; b=GrhwTOvmMWjakUlInW4OfSjO8lOpy8/JkbLfgAfZePn911obwrOQmZIhShpjWCmTvX bCrFVlKpcinO/DuG2NlCKLq7Bhg2yiQBRqtDRdUY2wpyMiqvyCoNsNHM4IH4hfQ14rqi PdE20mDQUwQStcR7eJeVsvNydvk8AxWp692GAnEMQVSBDD4hDPK2opnRwDdmQR6Gb6bY UTc72Jhkk7kOGMHhza440ikFqAWGgUJkx8BZ2+eBPsG8z27U1So3ZJmp8MzTc2UROftn g3CRFbZs3VtkhVirsjtZ1i3FfJHIbd1CH2a3aqDlDxH+Rqb0N3bs+PQudW2W6tv/yLxm xa6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215019; x=1741819819; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sHaSnVJGahW2SBkZFBEmNpemRYDlJEZ6HWbziQkkMV0=; b=AEZSLDWLUPp5wUEkAGnO/rnWRj3FTWWrEK9RWREO44kv05fqQ78ns5od31kRcqzR9o OVI3prCy+aM3Ng91dR4It/dvNi9xvif8EMe611ut185V8eKmADFM+hHWIDmtS1eiV2x9 qDzP2ub2Rd3m/3AfQVY/agpAljLzqvCo4UdtrLu8PKR1miYDSfkZuD/3LpOxi61wG4Ky WT1oCHi2muFxz075ZW3lFrE39yYUYR+7nubl6XM+yp0IufJJn+pof031zj5JhujVgm9X LEMurwEkaK5SBL7u+q2Af6ORmsY8SKYcCezbk1ANinBl3TJZ89R+sweUbNbshTkk2Z3N OAfw== X-Gm-Message-State: AOJu0YzbcbwcKouznNZMv5BO3ZQqPRA1zwVU5Rjc5+03UHDDna7P1s21 dU5k0v5pheK4W4Gkj7mpA6TKebjyGsjJ2w+z4Jk2OKPxAtXgsXeE5OQXHxEznVSf5oCyKin5zUZ h X-Gm-Gg: ASbGncupnvXLhp4VNMVr8V4bI6n6GhEmPJgZPUV9uy7Bpt4c6kaZXOzz5JYXNPI4oZx 1tgteKxGa4NSifE8t0wZtiXyycVFINJNoDxGG8SMVMEVo5J9IjyMVTr4IN7vL8IG7FNK2LGbk99 vY37grDGNw35WjBzVOES6KDCeAbL1gdGCtgwmzgvCnlQOWzq+k1MKq/32JtmAmdFlu1p8zVag/6 lGAt1Plz0TWA1gXwIUNXYSHjo5ND1v4iE6FqIhF1Zn8RVpcWxBqVLDEYGGJP0og61ZNCdPCeIIK uiKo+yIfNZsxbrldmRIxrHC2RQb4608ypz4S+rZjyCUHvaHMHSMmsQf4LEAqaU8= X-Google-Smtp-Source: AGHT+IFVtFpybbtSUfxb888whmTCEPDW0Tp5ao5a8HXFh2/FMfnriS5Q3hbUIxl/cFDk7RrK1z3zwA== X-Received: by 2002:a17:906:4fcb:b0:abf:7a26:c486 with SMTP id a640c23a62f3a-ac20da862cdmr488142466b.40.1741215019385; Wed, 05 Mar 2025 14:50:19 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 11/18] qemu: Apply migration parameters in qemuMigrationDstRun Date: Wed, 5 Mar 2025 15:48:20 -0700 Message-ID: <20250305224957.5369-12-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: CKYDRMLECVSRNL3C4BSJT55J3PDXZ53O X-Message-ID-Hash: CKYDRMLECVSRNL3C4BSJT55J3PDXZ53O 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 CC: farosas@suse.de 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: 1741215349817019000 Content-Type: text/plain; charset="utf-8" Similar to qemuMigrationSrcRun, apply migration parameters in qemuMigrationDstRun. This allows callers to create customized migration parameters, but delegates their application to the function performing the migration. Signed-off-by: Jim Fehlig --- src/qemu/qemu_migration.c | 16 ++++++++++------ src/qemu/qemu_migration.h | 5 ++++- src/qemu/qemu_process.c | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index f692986056..329b5f61d4 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2427,7 +2427,10 @@ qemuMigrationDstGetURI(const char *migrateFrom, int qemuMigrationDstRun(virDomainObj *vm, const char *uri, - virDomainAsyncJob asyncJob) + virDomainAsyncJob asyncJob, + qemuMigrationParams *migParams, + unsigned int flags) + { virTristateBool exitOnError =3D VIR_TRISTATE_BOOL_ABSENT; qemuDomainObjPrivate *priv =3D vm->privateData; @@ -2435,6 +2438,10 @@ qemuMigrationDstRun(virDomainObj *vm, =20 VIR_DEBUG("Setting up incoming migration with URI %s", uri); =20 + if (migParams && qemuMigrationParamsApply(vm, asyncJob, + migParams, flags) < 0) + return -1; + /* Ask QEMU not to exit on failure during incoming migration (if suppo= rted) * so that we can properly check and report error during Finish phase. */ @@ -3368,10 +3375,6 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, goto error; } =20 - if (qemuMigrationParamsApply(vm, VIR_ASYNC_JOB_MIGRATION_IN, - migParams, flags) < 0) - goto error; - if (mig->nbd && flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC)= ) { const char *nbdTLSAlias =3D NULL; @@ -3403,7 +3406,8 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, } =20 if (qemuMigrationDstRun(vm, incoming->uri, - VIR_ASYNC_JOB_MIGRATION_IN) < 0) + VIR_ASYNC_JOB_MIGRATION_IN, + migParams, flags) < 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 9fa007b949..71a9974753 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -283,7 +283,10 @@ qemuMigrationDstGetURI(const char *migrateFrom, int qemuMigrationDstRun(virDomainObj *vm, const char *uri, - virDomainAsyncJob asyncJob); + virDomainAsyncJob asyncJob, + qemuMigrationParams *migParams, + unsigned int flags); + =20 void qemuMigrationSrcPostcopyFailed(virDomainObj *vm); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cf99e4461d..23b2d4a7b6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8404,7 +8404,7 @@ qemuProcessStart(virConnectPtr conn, relabel =3D true; =20 if (incoming) { - if (qemuMigrationDstRun(vm, incoming->uri, asyncJob) < 0) + if (qemuMigrationDstRun(vm, incoming->uri, asyncJob, NULL, 0) < 0) goto stop; } else { /* Refresh state of devices from QEMU. During migration this happe= ns --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215427; cv=none; d=zohomail.com; s=zohoarc; b=QS0iZjkGCc4N19YNWF7RLNsFtqq+GqC7i9tthIuHXvMJNkHk5H9lp+iFmMXmc7qE8HtphoY7GEDTqF6gO4DTis1dqFCe5lQHNxhyEIhKc4yCaBzc7fkz6MnFVgLdgbW0qrM9gegtTaAjE17geI94Al/IKQN9zFW7ukmCpRRVASo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215427; h=Content-Transfer-Encoding:Cc:Cc: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; bh=Ko6KQoel4tkx9S98eP0PHjINZE0+h9Q/VkTtl2wzo9k=; b=Z3TI1J0ZyQ1JWrW9z36HUVTnjHBrBzkfC4uNYDYg4hrG45tLe0eba6Y+zAt7rroH6Tw9eyZ2Bbmk7FnWqYNGuvzZ+Flg+w0//UERxsHzyDU6sIQ9dHXXij6OM1yqP04V4NNCiOcPnqOQaZRAHnWB9MFil3qHPmnRraptAyUDljU= 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 1741215427056481.300153649354; Wed, 5 Mar 2025 14:57:07 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id F1D2314E6; Wed, 5 Mar 2025 17:57:05 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5824A1554; Wed, 5 Mar 2025 17:50:55 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id B182415D2; Wed, 5 Mar 2025 17:50:43 -0500 (EST) Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) (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 8C65D15F7 for ; Wed, 5 Mar 2025 17:50:22 -0500 (EST) Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-ac0b6e8d96cso7871966b.0 for ; Wed, 05 Mar 2025 14:50:22 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-2235050d76bsm118582585ad.204.2025.03.05.14.50.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:20 -0800 (PST) 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_MSPIKE_H3,RCVD_IN_MSPIKE_WL, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215021; x=1741819821; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/7aQYtvhxxoePnwcQ9wxqMZ0cypXhpOZuZkOLXDGcMU=; b=NFUSj0qYxhM+TSOoFDJXXrMENQ1a782Kd3kFVO8ySvtkX0juHNZkamF46H9oIXExAo fSse6BFMqlQyCh++uKDC9jve6W3qwO+t2eWKNPHwFoicsPzkTpfQgV1hOjab2ah7zUeu 2GfDM6CKwOTdR0F2e0A0kkh4bPJ9i58akpqjZzG7GlSqTLMLNRhenFgIWbLdAlzxgQZr s73vy831OyraWQBtPl7g9fxZMyIABE0F8Ku+a2KK3KbEzU+2GrkCpT/AMQxPXjJjv9et W1ZNuWqJ4Aq1AXuSfhoW9FBNczy6dJL9mcd2wKQ3baq2XZJdYNh1jhHDaAweuTlyJLbk sVtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215021; x=1741819821; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/7aQYtvhxxoePnwcQ9wxqMZ0cypXhpOZuZkOLXDGcMU=; b=TLStU/W6P7gEyt559WH4kHSzlx2ipj7xKDxLHWwyP7patmR6J19Y2UDEGQib4sQj8p EeeVW4m1U0ATfCQcXYDZJ1pRPKSU3r7U4QbHn0/q5chPAvuCmeGWig0v9KsoXzGE11BX Gdi9nzGUu1wqkhJsqCc1ourT+m+EsXoy1iNatnHW3zC+H61PfG4FALLmr7vR0Y9OVtav nmM7lIDWVWgIParngD5L9hWsqD+T6sdzVW59j5oECpp+3d+mR9fDpw6uI7FyvRR65kfl L9/6Z5oNIXaNzXKTSdZQGCMd+ZTQi/sQ+1epqeAm1aD+1RXngLF/Dx8wmyAaoNYWj+UM 1hiA== X-Gm-Message-State: AOJu0YwzMTXFbwcfzygZSUmkHnfzEY1BAfs7WaIQaksTPwTdd+J0HF28 TOzyfjYb2thkmh+V6oorzPfLT0jS92nebf++/CjRqJCgELMKL97aGJ4QYzKMBzJublv0X3rlCY+ n X-Gm-Gg: ASbGncsNs4u9yowCLijOUXy2CkgmyRN9bO97QSfUdabkR8BDLEbe1GOMhh5KMLM9xWh IUcsI8I43SjuFb76BqZmiaMtLZSAkBtiGVVzTsTyRQhbcJpvrSECzYN12KesOhI2YHI3ASCD1as zTK9h0DbAbjEJ25KAqColIV0AasP10mbXMgwxvKIN9ow/zRt1Gm7UQIHP+U77xK7iBLgwbjjmsX mtrrGoyzK+vekwNHk92g1Rr7JffFQxpXf22h/9T6yCY3Z4eqqMly9t9zzIYemyUIRM9/Ti0T6zY Ov89X6Qup220jYN53Me1+WqsxEMp0B7qgSc00rD3u0O+T1Xz/pBiZJMvkCRQtt8= X-Google-Smtp-Source: AGHT+IHTC85oL2l25Y4Egla0Iz1yaUpDge8+0RXm3B4hLWK1EpEw2dEz2nwfZNYq4HFa8rg8oSPzpg== X-Received: by 2002:a17:907:96a4:b0:abf:6f87:c732 with SMTP id a640c23a62f3a-ac20d8bc98bmr445185066b.20.1741215021209; Wed, 05 Mar 2025 14:50:21 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 12/18] qemu: Add support for mapped-ram on restore Date: Wed, 5 Mar 2025 15:48:21 -0700 Message-ID: <20250305224957.5369-13-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JXWCW2M235FT2UJ6MCH7DYDZWGVFDUVY X-Message-ID-Hash: JXWCW2M235FT2UJ6MCH7DYDZWGVFDUVY 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 CC: farosas@suse.de 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: 1741215429702019100 Content-Type: text/plain; charset="utf-8" Add support for the mapped-ram migration capability on restore. Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 27 +++++++++++++++++++------- src/qemu/qemu_migration.c | 12 ++++++------ src/qemu/qemu_process.c | 41 ++++++++++++++++++++++++++++----------- src/qemu/qemu_process.h | 15 +++++++++----- src/qemu/qemu_saveimage.c | 29 ++++++++++++++++----------- src/qemu/qemu_saveimage.h | 2 ++ src/qemu/qemu_snapshot.c | 8 ++++---- 7 files changed, 90 insertions(+), 44 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2b2dda9d26..11a67fab57 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1593,7 +1593,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, } =20 if (qemuProcessStart(conn, driver, vm, NULL, VIR_ASYNC_JOB_START, - NULL, -1, NULL, NULL, + NULL, -1, NULL, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); @@ -5758,6 +5758,8 @@ qemuDomainRestoreInternal(virConnectPtr conn, virFileWrapperFd *wrapperFd =3D NULL; bool hook_taint =3D false; bool reset_nvram =3D false; + bool sparse =3D false; + g_autoptr(qemuMigrationParams) restoreParams =3D NULL; =20 virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | VIR_DOMAIN_SAVE_RUNNING | @@ -5770,9 +5772,13 @@ qemuDomainRestoreInternal(virConnectPtr conn, if (qemuSaveImageGetMetadata(driver, NULL, path, &def, &data) < 0) goto cleanup; =20 + sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; + if (!(restoreParams =3D qemuMigrationParamsForSave(sparse))) + goto cleanup; + fd =3D qemuSaveImageOpen(driver, path, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, - &wrapperFd, false); + sparse, &wrapperFd, false); if (fd < 0) goto cleanup; =20 @@ -5826,7 +5832,7 @@ 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, data, path, restor= eParams, false, reset_nvram, VIR_ASYNC_JOB_START); =20 qemuProcessEndJob(vm); @@ -5941,7 +5947,8 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, if (qemuSaveImageGetMetadata(driver, NULL, path, &def, &data) < 0) goto cleanup; =20 - fd =3D qemuSaveImageOpen(driver, path, false, NULL, true); + fd =3D qemuSaveImageOpen(driver, path, false, false, NULL, false); + if (fd < 0) goto cleanup; =20 @@ -6080,6 +6087,8 @@ qemuDomainObjRestore(virConnectPtr conn, g_autofree char *xmlout =3D NULL; virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; + bool sparse =3D false; + g_autoptr(qemuMigrationParams) restoreParams =3D NULL; =20 ret =3D qemuSaveImageGetMetadata(driver, NULL, path, &def, &data); if (ret < 0) { @@ -6097,7 +6106,11 @@ qemuDomainObjRestore(virConnectPtr conn, goto cleanup; } =20 - fd =3D qemuSaveImageOpen(driver, path, bypass_cache, &wrapperFd, false= ); + sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; + if (!(restoreParams =3D qemuMigrationParamsForSave(sparse))) + return -1; + + fd =3D qemuSaveImageOpen(driver, path, bypass_cache, sparse, &wrapperF= d, false); if (fd < 0) goto cleanup; =20 @@ -6139,7 +6152,7 @@ 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, data, path, restor= eParams, start_paused, reset_nvram, asyncJob); =20 cleanup: @@ -6345,7 +6358,7 @@ qemuDomainObjStart(virConnectPtr conn, } =20 ret =3D qemuProcessStart(conn, driver, vm, NULL, asyncJob, - NULL, -1, NULL, NULL, + NULL, -1, NULL, 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 329b5f61d4..1a85ec1c51 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3115,9 +3115,8 @@ qemuMigrationDstPrepare(virDomainObj *vm, const char *protocol, const char *listenAddress, unsigned short port, - int fd) + int *fd) { - qemuDomainObjPrivate *priv =3D vm->privateData; g_autofree char *migrateFrom =3D NULL; =20 if (tunnel) { @@ -3171,8 +3170,9 @@ 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, NULL); } =20 =20 @@ -3314,7 +3314,7 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, =20 if (!(incoming =3D qemuMigrationDstPrepare(vm, tunnel, protocol, listenAddress, port, - dataFD[0]))) + &dataFD[0]))) goto error; =20 qemuMigrationDstPrepareDiskSeclabels(vm, migrate_disks, flags); @@ -3685,7 +3685,7 @@ qemuMigrationDstPrepareResume(virQEMUDriver *driver, priv->origname =3D g_strdup(origname); =20 if (!(incoming =3D qemuMigrationDstPrepare(vm, false, protocol, - listenAddress, port, -1))) + listenAddress, port, NULL))) goto cleanup; =20 if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_MIGRATION_IN) < 0) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 23b2d4a7b6..cba44ec5c2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4827,6 +4827,7 @@ qemuProcessIncomingDefFree(qemuProcessIncomingDef *in= c) =20 g_free(inc->address); g_free(inc->uri); + qemuFDPassFree(inc->fdPassMigrate); g_free(inc); } =20 @@ -4840,26 +4841,38 @@ 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) + int *fd, + const char *path, + virQEMUSaveData *data) { + 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); =20 - inc->uri =3D qemuMigrationDstGetURI(migrateFrom, fd); + if (data && data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE) { + size_t offset =3D sizeof(virQEMUSaveHeader) + data->header.data_le= n; + + inc->fdPassMigrate =3D qemuFDPassNew("libvirt-incoming-migrate", p= riv); + qemuFDPassAddFD(inc->fdPassMigrate, fd, "-fd"); + inc->uri =3D g_strdup_printf("file:%s,offset=3D%#lx", + qemuFDPassGetPath(inc->fdPassMigrate), = offset); + } else { + inc->uri =3D qemuMigrationDstGetURI(migrateFrom, *fd); + } + if (!inc->uri) goto error; =20 - inc->fd =3D fd; + inc->fd =3D *fd; inc->path =3D path; =20 return inc; @@ -7931,8 +7944,11 @@ qemuProcessLaunch(virConnectPtr conn, &nnicindexes, &nicindexes))) goto cleanup; =20 - if (incoming && incoming->fd !=3D -1) - virCommandPassFD(cmd, incoming->fd, 0); + if (incoming) { + if (incoming->fd !=3D -1) + virCommandPassFD(cmd, incoming->fd, 0); + qemuFDPassTransferCommand(incoming->fdPassMigrate, cmd); + } =20 /* now that we know it is about to start call the hook if present */ if (qemuProcessStartHook(driver, vm, @@ -8351,6 +8367,7 @@ qemuProcessStart(virConnectPtr conn, int migrateFd, const char *migratePath, virDomainMomentObj *snapshot, + qemuMigrationParams *migParams, virNetDevVPortProfileOp vmop, unsigned int flags) { @@ -8404,7 +8421,7 @@ qemuProcessStart(virConnectPtr conn, relabel =3D true; =20 if (incoming) { - if (qemuMigrationDstRun(vm, incoming->uri, asyncJob, NULL, 0) < 0) + if (qemuMigrationDstRun(vm, incoming->uri, asyncJob, migParams, 0)= < 0) goto stop; } else { /* Refresh state of devices from QEMU. During migration this happe= ns @@ -8458,6 +8475,7 @@ qemuProcessStart(virConnectPtr conn, * @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 + * @migParams: Migration params to use on restore or NULL * @asyncJob: type of asynchronous job * @start_flags: flags to start QEMU process with * @reason: audit log reason @@ -8484,6 +8502,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, + qemuMigrationParams *migParams, virDomainAsyncJob asyncJob, unsigned int start_flags, const char *reason, @@ -8512,7 +8531,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, /* The fd passed to qemuProcessIncomingDefNew is used to create the mi= gration * URI, so it must be called after starting the decompression program. */ - incoming =3D qemuProcessIncomingDefNew(priv->qemuCaps, NULL, "stdio", = *fd, path); + incoming =3D qemuProcessIncomingDefNew(vm, NULL, "stdio", fd, path, da= ta); if (!incoming) return -1; =20 @@ -8527,7 +8546,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, =20 if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, asyncJob, incoming, *fd, path, snapshot, - VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, + migParams, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, start_flags) =3D=3D 0) *started =3D true; =20 diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index a9e0a03a21..c51335ad7a 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -53,14 +53,17 @@ 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, + virQEMUSaveData *data); + void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc); =20 int qemuProcessBeginJob(virDomainObj *vm, @@ -87,6 +90,7 @@ int qemuProcessStart(virConnectPtr conn, int stdin_fd, const char *stdin_path, virDomainMomentObj *snapshot, + qemuMigrationParams *migParams, virNetDevVPortProfileOp vmop, unsigned int flags); =20 @@ -97,6 +101,7 @@ int qemuProcessStartWithMemoryState(virConnectPtr conn, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, + qemuMigrationParams *migParams, virDomainAsyncJob asyncJob, unsigned int start_flags, const char *reason, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index cad982f450..f00078bfcf 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -348,7 +348,8 @@ qemuSaveImageDecompressionStart(virQEMUSaveData *data, if (header->version !=3D 2) return 0; =20 - if (header->format =3D=3D QEMU_SAVE_FORMAT_RAW) + if (header->format =3D=3D QEMU_SAVE_FORMAT_RAW || + header->format =3D=3D QEMU_SAVE_FORMAT_SPARSE) return 0; =20 if (!(cmd =3D qemuSaveImageGetCompressionCommand(header->format))) @@ -656,6 +657,7 @@ qemuSaveImageGetMetadata(virQEMUDriver *driver, * @driver: qemu driver data * @path: path of the save image * @bypass_cache: bypass cache when opening the file + * @sparse: Image contains mapped-ram save format * @wrapperFd: returns the file wrapper structure * @open_write: open the file for writing (for updates) * @@ -665,6 +667,7 @@ int qemuSaveImageOpen(virQEMUDriver *driver, const char *path, bool bypass_cache, + bool sparse, virFileWrapperFd **wrapperFd, bool open_write) { @@ -686,15 +689,18 @@ 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; + /* If sparse, no need for the iohelper or positioning the file pointer= . */ + if (!sparse) { + if (bypass_cache && + !(*wrapperFd =3D virFileWrapperFdNew(&fd, path, + VIR_FILE_WRAPPER_BYPASS_CAC= HE))) + return -1; =20 - /* Read the header to position the file pointer for QEMU. Unfortunatel= y we - * can't use lseek with virFileWrapperFD. */ - if (qemuSaveImageReadHeader(fd, NULL) < 0) - return -1; + /* Read the header to position the file pointer for QEMU. Unfortun= ately we + * can't use lseek with virFileWrapperFD. */ + if (qemuSaveImageReadHeader(fd, NULL) < 0) + return -1; + } =20 ret =3D fd; fd =3D -1; @@ -710,6 +716,7 @@ qemuSaveImageStartVM(virConnectPtr conn, int *fd, virQEMUSaveData *data, const char *path, + qemuMigrationParams *restoreParams, bool start_paused, bool reset_nvram, virDomainAsyncJob asyncJob) @@ -726,8 +733,8 @@ qemuSaveImageStartVM(virConnectPtr conn, start_flags |=3D VIR_QEMU_PROCESS_START_RESET_NVRAM; =20 if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, path, NULL, = data, - asyncJob, start_flags, "restored", - &started) < 0) { + restoreParams, asyncJob, start_fla= gs, + "restored", &started) < 0) { goto cleanup; } =20 diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 495d773ea5..89c6941385 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -83,6 +83,7 @@ qemuSaveImageStartVM(virConnectPtr conn, int *fd, virQEMUSaveData *data, const char *path, + qemuMigrationParams *restoreParams, bool start_paused, bool reset_nvram, virDomainAsyncJob asyncJob) @@ -105,6 +106,7 @@ int qemuSaveImageOpen(virQEMUDriver *driver, const char *path, bool bypass_cache, + bool sparse, virFileWrapperFd **wrapperFd, bool open_write) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index fa814e051c..6b6a387d22 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2413,7 +2413,7 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, return -1; =20 memdata->fd =3D qemuSaveImageOpen(driver, memdata->path, - false, NULL, false); + false, false, NULL, false); if (memdata->fd < 0) return -1; =20 @@ -2653,7 +2653,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, =20 if (qemuProcessStartWithMemoryState(snapshot->domain->conn, driver, vm, &memdata.fd, memdata.path, loadSna= p, - memdata.data, VIR_ASYNC_JOB_SNAPSH= OT, + memdata.data, NULL, VIR_ASYNC_JOB_= SNAPSHOT, start_flags, "from-snapshot", &started) < 0) { if (started) { @@ -2807,7 +2807,7 @@ qemuSnapshotRevertInactive(virDomainObj *vm, =20 rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NULL, VIR_ASYNC_JOB_SNAPSHOT, NULL, -1, NULL, NULL, - VIR_NETDEV_VPORT_PROFILE_OP_CREATE, + NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); if (rc < 0) { @@ -3283,7 +3283,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, NULL, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, VIR_QEMU_PROCESS_START_PAUSED) < 0) { return -1; --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215384; cv=none; d=zohomail.com; s=zohoarc; b=ctt4w73QXxso8Y3E8JMMLAZzjWy3r2+6AoXHigYZdZTp32GMbbYr0dYeX0mxenLqi2h11fCnVtLTDSuk3R/N4kZ6Z7aO7wOI/IEnisotoE0UiPaetbeVPV7jT6k1Us8sXRNEv4eEWbLzPkoToEIYkk0hMsASiG3Ja1kffdbDbKM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215384; h=Content-Transfer-Encoding:Cc:Cc: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; bh=P5FZ0LeU5ZO1gL8jbOOoZlf1WMB+XDJMOd05Z5fAkhg=; b=Rzn/Ck/l754HaGSZlnnkdZKjo9ZatWEo+/OqRTcdc5XG2TmB3pEdFrLf785X71i7kJFsvqct9ceAdB054ASGtH2QF2JE6QskFoCsd0FlDhJspXN45ymy4/LoQnFTuM9USBbMLH3vAQRpUAcZMZABNsIwQVYLGq/IS8sSendR8i4= 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 1741215384249288.55626430834786; Wed, 5 Mar 2025 14:56:24 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 8263C15D0; Wed, 5 Mar 2025 17:56:23 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 827571648; Wed, 5 Mar 2025 17:50:53 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 665B915D2; Wed, 5 Mar 2025 17:50:43 -0500 (EST) 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 4173016E8 for ; Wed, 5 Mar 2025 17:50:24 -0500 (EST) Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-390e3b3d3bcso1518f8f.3 for ; Wed, 05 Mar 2025 14:50:24 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-734a003ec9csm13981988b3a.146.2025.03.05.14.50.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:22 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215023; x=1741819823; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oMX2NWWASV24LCXTcVgFNm0/xfawCDIUCNmwPVEmWgk=; b=LyzNCuipw9Yrx6N9rpXu16yGDO1Qw5CYb70L/WCp7apkOlGNmiFpSvaWqyltrDN11l w3Hg7xESxzf6i/ot01uttY1Ik9AE2vKlzOukdkQTETlCsviwuQN9pR6bQGuIsjASU5h2 X731Hi0oakL2NbCY46IY/SmuMeoabUeOq9VpNpHhfIvfDcuBM3xBS4oTZo71V9OytNvR LpuTxs1muhU9r6JjY5JDU4Kdr8AVShZ+878lg8Euxc0mfViR6CaCSbn4UWrD97ayfFkm PE2lwx4BJKVITwm7k9b2tWjTzduQ8nC6UeXSQwKSPJZMMfd3M6WUsNm1VhpZAhWFGcut RgtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215023; x=1741819823; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oMX2NWWASV24LCXTcVgFNm0/xfawCDIUCNmwPVEmWgk=; b=mvbyzNeVvX2uNRs2YlJvLFw3rXmiHNP9K9j/SengBUsu8mP00jzUdi40RvVOQAnl2y GCMbK9wuTE12iej0HgR+fGvTbkBPZruFu/emoKZA/6W5FPi83tOAe1iOQPhYnhbunQnL Q7GEeLqEb+bTSgAjjAlfApc5KvAsn8bhuuagqoQai82RhY/gek9gIdOOZviv+8O8hg3c HRmsZloUMcYaxAV7tUvDCh/B5Z75hJ7+vcGJMu33gqEJ00g7up98BWR8LIp5DLA8zg/F e44fdipPiFamJuplny+16RaSAfjkzcIt1Awmt9r3bKKqBFjVBmK1/wsQ8xIe2O6c0PYC haJQ== X-Gm-Message-State: AOJu0Yxtql/4XhSSa6r1gm/4F2LyGopNwY5fQCvlza9ho6Se1Oi42JHf KjeEvA+566yuoCHTzQSpYk0LmnR3aC6bPkezcyPjwAdzr2fYjh3XfybwpPYu5oSBRk52RQGi9cU 2 X-Gm-Gg: ASbGnctWhbJWRmPbmiZnEQ0uVqYxttclILW9Jy9J+Vc2wbJmjXSKtCw5z2dn3eqlw5B l7HAy4emAA6mv/8CZKTuAduh7zPx8ZFxaacEzPoOUZirl6b3rop8YUUhCdD2G0hf/GppLV0ij+c HdX89pJjdwnGRGcDzBDT4dUwHWi4tvTS6KEUPQXBvrPrS5oJfwZ1tQNDeMrtn4gogG1vkyx8YVx 4da3kuk/cTQEjAIlu022BWMjJO/JHpcccmgIASRkQbCt33OWZ2UyLpbnVf/uv4n1ZmD2O8Wyc9O jxHXtI9jq6med4cWvuKE24pCuS/sNoASAq7As/qXJNglJerCz/xF/pdML0HXMYY= X-Google-Smtp-Source: AGHT+IGFVmhlMhK7AHVSPl+pwWVEX2FhRqpMYRWWnFORx+AOccDrx6u5XelJEqTqVo633T8EDtER/g== X-Received: by 2002:a05:6000:4189:b0:390:d82d:6d4f with SMTP id ffacd0b85a97d-3911f7bf98dmr3387511f8f.52.1741215022944; Wed, 05 Mar 2025 14:50:22 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 13/18] qemu: Support O_DIRECT with mapped-ram on save Date: Wed, 5 Mar 2025 15:48:22 -0700 Message-ID: <20250305224957.5369-14-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: YOTPHE6OZCMK3UQQWW3Q7JBK26DA4JXX X-Message-ID-Hash: YOTPHE6OZCMK3UQQWW3Q7JBK26DA4JXX 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 CC: farosas@suse.de 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: 1741215385989019000 Content-Type: text/plain; charset="utf-8" When using the mapped-ram migration capability, direct IO is enabled by setting the "direct-io" migration parameter to "true" and passing QEMU an additional fd with O_DIRECT set. Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 10 ++++++---- src/qemu/qemu_migration.c | 32 ++++++++++++++++++++++++++------ src/qemu/qemu_migration.h | 1 + src/qemu/qemu_migration_params.c | 11 ++++++++++- src/qemu/qemu_migration_params.h | 3 ++- src/qemu/qemu_monitor.c | 7 +++++-- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_saveimage.c | 2 +- 8 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 11a67fab57..e098a96a4e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2679,7 +2679,8 @@ qemuDomainSaveInternal(virQEMUDriver *driver, goto endjob; xml =3D NULL; =20 - if (!(saveParams =3D qemuMigrationParamsForSave(format =3D=3D QEMU_SAV= E_FORMAT_SPARSE))) + if (!(saveParams =3D qemuMigrationParamsForSave(format =3D=3D QEMU_SAV= E_FORMAT_SPARSE, + flags))) goto endjob; =20 ret =3D qemuSaveImageCreate(driver, vm, path, data, compressor, @@ -3129,7 +3130,7 @@ doCoreDump(virQEMUDriver *driver, if (!(dump_params =3D qemuMigrationParamsNew())) goto cleanup; =20 - if (qemuMigrationSrcToFile(driver, vm, &fd, compressor, + if (qemuMigrationSrcToFile(driver, vm, path, &fd, compressor, dump_params, dump_flags, VIR_ASYNC_JOB_= DUMP) < 0) goto cleanup; } @@ -5773,7 +5774,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, goto cleanup; =20 sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; - if (!(restoreParams =3D qemuMigrationParamsForSave(sparse))) + if (!(restoreParams =3D qemuMigrationParamsForSave(sparse, flags))) goto cleanup; =20 fd =3D qemuSaveImageOpen(driver, path, @@ -6107,7 +6108,8 @@ qemuDomainObjRestore(virConnectPtr conn, } =20 sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; - if (!(restoreParams =3D qemuMigrationParamsForSave(sparse))) + if (!(restoreParams =3D qemuMigrationParamsForSave(sparse, + bypass_cache ? VIR_DO= MAIN_SAVE_BYPASS_CACHE : 0))) return -1; =20 fd =3D qemuSaveImageOpen(driver, path, bypass_cache, sparse, &wrapperF= d, false); diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 1a85ec1c51..4554a52165 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7188,17 +7188,36 @@ qemuMigrationSrcToLegacyFile(virQEMUDriver *driver, static int qemuMigrationSrcToSparseFile(virQEMUDriver *driver, virDomainObj *vm, + const char *path, int *fd, unsigned int flags, virDomainAsyncJob asyncJob) { + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE directFd =3D -1; + int directFlag =3D 0; + bool needUnlink =3D false; int ret; =20 - /* mapped-ram does not support directIO */ + /* When using directio with mapped-ram, qemu needs two fds. One with + * O_DIRECT set writing the memory, and another without it set for + * writing small bits of unaligned state. */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("bypass cache unsupported by this system")); - return -1; + directFlag =3D virFileDirectFdFlag(); + if (directFlag < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("bypass cache unsupported by this system")); + return -1; + } + directFd =3D virQEMUFileOpenAs(cfg->user, cfg->group, false, path, + O_WRONLY | directFlag, &needUnlink); + + if (directFd < 0) + return -1; + + if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, = directFd) < 0) + return -1; + } =20 if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, *fd)= < 0) @@ -7207,7 +7226,7 @@ qemuMigrationSrcToSparseFile(virQEMUDriver *driver, if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) return -1; =20 - ret =3D qemuMonitorMigrateToFdSet(vm, 0, fd); + ret =3D qemuMonitorMigrateToFdSet(vm, 0, fd, &directFd); qemuDomainObjExitMonitor(vm); return ret; } @@ -7216,6 +7235,7 @@ qemuMigrationSrcToSparseFile(virQEMUDriver *driver, /* Helper function called while vm is active. */ int qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, + const char *path, int *fd, virCommand *compressor, qemuMigrationParams *migParams, @@ -7253,7 +7273,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDoma= inObj *vm, =20 if (migParams && qemuMigrationParamsCapEnabled(migParams, QEMU_MIGRATION_CAP_MAPPED= _RAM)) - rc =3D qemuMigrationSrcToSparseFile(driver, vm, fd, flags, asyncJo= b); + rc =3D qemuMigrationSrcToSparseFile(driver, vm, path, fd, flags, a= syncJob); else rc =3D qemuMigrationSrcToLegacyFile(driver, vm, *fd, compressor, a= syncJob); =20 diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index 71a9974753..beb888160a 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -238,6 +238,7 @@ qemuMigrationSrcIsAllowed(virDomainObj *vm, int qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, + const char *path, int *fd, virCommand *compressor, qemuMigrationParams *migParams, diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index d48cdd5506..16e93f27d6 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -130,6 +130,7 @@ VIR_ENUM_IMPL(qemuMigrationParam, "multifd-zlib-level", "multifd-zstd-level", "avail-switchover-bandwidth", + "direct-io", ); =20 typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysO= nItem; @@ -328,6 +329,9 @@ static const qemuMigrationParamInfoItem qemuMigrationPa= ramInfo[] =3D { [QEMU_MIGRATION_PARAM_AVAIL_SWITCHOVER_BANDWIDTH] =3D { .type =3D QEMU_MIGRATION_PARAM_TYPE_ULL, }, + [QEMU_MIGRATION_PARAM_DIRECT_IO] =3D { + .type =3D QEMU_MIGRATION_PARAM_TYPE_BOOL, + }, }; G_STATIC_ASSERT(G_N_ELEMENTS(qemuMigrationParamInfo) =3D=3D QEMU_MIGRATION= _PARAM_LAST); =20 @@ -793,7 +797,7 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr param= s, =20 =20 qemuMigrationParams * -qemuMigrationParamsForSave(bool sparse) +qemuMigrationParamsForSave(bool sparse, unsigned int flags) { g_autoptr(qemuMigrationParams) saveParams =3D NULL; =20 @@ -807,6 +811,11 @@ qemuMigrationParamsForSave(bool sparse) return NULL; saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].value.i = =3D 1; saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].set =3D = true; + + if (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) { + saveParams->params[QEMU_MIGRATION_PARAM_DIRECT_IO].value.b =3D= true; + saveParams->params[QEMU_MIGRATION_PARAM_DIRECT_IO].set =3D tru= e; + } } =20 return g_steal_pointer(&saveParams); diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index 88a1bc1a66..87822332d3 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -66,6 +66,7 @@ typedef enum { QEMU_MIGRATION_PARAM_MULTIFD_ZLIB_LEVEL, QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL, QEMU_MIGRATION_PARAM_AVAIL_SWITCHOVER_BANDWIDTH, + QEMU_MIGRATION_PARAM_DIRECT_IO, =20 QEMU_MIGRATION_PARAM_LAST } qemuMigrationParam; @@ -88,7 +89,7 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, qemuMigrationParty party); =20 qemuMigrationParams * -qemuMigrationParamsForSave(bool sparse); +qemuMigrationParamsForSave(bool sparse, unsigned int flags); =20 int qemuMigrationParamsDump(qemuMigrationParams *migParams, diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 8d244c6f4a..3b26fab90d 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2235,7 +2235,8 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int *fd) + int *fd, + int *directFd) { qemuDomainObjPrivate *priv =3D vm->privateData; qemuMonitor *mon =3D priv->mon; @@ -2244,7 +2245,7 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, g_autofree char *uri =3D NULL; int ret; =20 - VIR_DEBUG("fd=3D%d flags=3D0x%x", *fd, flags); + VIR_DEBUG("fd=3D%d directFd=3D%d flags=3D0x%x", *fd, *directFd, flags); =20 QEMU_CHECK_MONITOR(mon); =20 @@ -2256,6 +2257,8 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, =20 fdPassMigrate =3D qemuFDPassNew("libvirt-outgoing-migrate", priv); qemuFDPassAddFD(fdPassMigrate, fd, "-fd"); + if (*directFd !=3D -1) + qemuFDPassAddFD(fdPassMigrate, directFd, "-directio-fd"); qemuFDPassTransferMonitor(fdPassMigrate, mon); =20 uri =3D g_strdup_printf("file:%s,offset=3D%#lx", diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 4022bc3c7b..d5fa157696 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -861,7 +861,8 @@ int qemuMonitorMigrateToFd(qemuMonitor *mon, =20 int qemuMonitorMigrateToFdSet(virDomainObj *vm, unsigned int flags, - int *fd); + int *fd, + int *directFd); =20 int qemuMonitorMigrateToHost(qemuMonitor *mon, unsigned int flags, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index f00078bfcf..4c91c1be67 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -501,7 +501,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, goto cleanup; =20 /* Perform the migration */ - if (qemuMigrationSrcToFile(driver, vm, &fd, compressor, saveParams, fl= ags, asyncJob) < 0) + if (qemuMigrationSrcToFile(driver, vm, path, &fd, compressor, savePara= ms, flags, asyncJob) < 0) goto cleanup; =20 /* Touch up file header to mark image complete. */ --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215451; cv=none; d=zohomail.com; s=zohoarc; b=Dcgt0eIRVqNzpMDp3/Bfcv/Vk2iBw/znYNcJbqtECsB5m5CzqgkoTrm0PS4l2k0rezlT8mSz//pb4mSZqttkeVVR74QGbrYWF9mJd0b2vSVLZGKGxGIYc6HSB5terzr+akfHL+e58Jg3Lh2N2Ge4Gqc4LGrOCfGs5pLGgU/gzNY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215451; h=Content-Transfer-Encoding:Cc:Cc: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; bh=lU68cTxoD9sU6/n4EnPcfTBPRFRK1BcovknNFoddA04=; b=dRWUvhl+J0uAF27J/U/bbHyMOvZC7MNkMcBwuEpC9xFJYFEPWyspnVqrTGXBZr4fjnXPzLlgdz+EP66kqDKQ5weQw/1ZhhQHi5qHcFiA2Ub4ZSkr7lKfPSgVCYjDDHfgEC6j/4mrQDq1Ml0y8koquQuWmGWKhOqB/bKKqlzHyyE= 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 1741215451835185.32659541163935; Wed, 5 Mar 2025 14:57:31 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id BD290171B; Wed, 5 Mar 2025 17:57:30 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id DE2361531; Wed, 5 Mar 2025 17:50:57 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id F03C814E5; Wed, 5 Mar 2025 17:50:43 -0500 (EST) Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 F116C168D for ; Wed, 5 Mar 2025 17:50:25 -0500 (EST) Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-43bbb440520so44415985e9.2 for ; Wed, 05 Mar 2025 14:50:25 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2ff4e75f1f9sm1873459a91.6.2025.03.05.14.50.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:24 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215025; x=1741819825; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i1gseYQalvtfs9G82h4TbFUcqbcTtRc40fDePAttV5s=; b=MvCv5R+2PHRwnydR6YstUuXXmeEHWQkQC++RQN9BIW4dYbgyFqzA2y4S60jEjs6MoZ 6Ovgm4aeGlgK1yEow1YGW2Dg8ymdC3RWbzWfe3S+qOntH2LEND3uiIDHKYwbhMe45H0j NPQ1YboNJBLshIAde7iRjoY+U5cyewXWM6lMJsvEm20j3nTK7m6ansqmPhIe/s2pV53r 4g0H2zYCqbUo//9GxwNvMs6GAcsgfeXJEl82xX/BSob2OvM/ASotS/MvgXSKWxtgv1OK 8IXl0g9x6jB2hjlxPEg94S5gpEviuRqY5aB3bRagJDCzWGcGQyiXGWLKgmPY2fLSyKNf +DJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215025; x=1741819825; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=i1gseYQalvtfs9G82h4TbFUcqbcTtRc40fDePAttV5s=; b=E9bZlo7sMUXX/bss0Rq9xwwtda513DeBepcrhexlpxnvbGkLSi+icZBXA66zjw6pIP sU0muMXm51CGTHUmyFZATarULOEOAizMKpRC4qkd2xMZfBAbs9gBatZs76gtSNVaedt+ hj//mb492XDtqCXoRb1wbQyxjR0HVOAB7vKpj44WdQS/onfNZOfAfYlMn1QjoofYQ2Rh xVd61Sklbhq2cWgswE/wAoiFfWR8DFCzFK4QYzznualaLdNG66H10MGu0AHQ7eYfFC9i x1tHB6NmFGaxDVd4pd4SO/GfgoTSTNgXVZMkzAk6aCSk8+aS3TlJK00xHsm96Se6aAGX WvlQ== X-Gm-Message-State: AOJu0YwgLyP7rNuvGaBkrUkfDdyv/I1dQORv0GScUJ1xCR2cgzLPN8tt F1dE+t0Z5pqG2wBnVNN3iz4C4teO3miUXJYpha0lxvlO8ixUOMBSJkEaUiAclurhP6nD8E52i2M e X-Gm-Gg: ASbGncsxP+pEss9hfpss2kQwOA5YMKllZHboa+UcqyTfhiHpKyfFEoPs6xE1gLxbRlE yFJ03brGvQZ5vy2HFtr4w/yMN0w7m09bAmBvfSfkr5w/gE+mcrCon9bHy/HkOfqem0F4LQ12b2J zbPAJTE6PdL7Mb52lFLu88OfV/AFB2wFhv/FlExNHARrYVuxndS62O2T+w8rlTnOsChlAbvqcDa 9Bk5SfXs0I3ncSJRMNF/2036gZFiA/7z+8aoF2d0FTxtr5VHSfK6gYZpN9m3t11uGOxj0mH584z o2z9NR0lth9mAExy1qW3tNpaKkoEcCt5ZJQ0yJA7GyzpvZTfqY8CzEVgkdO9gg0= X-Google-Smtp-Source: AGHT+IHJYM1wbbcrAtU7VhiWenQNDPJ+inoArNjRDUwZJ+Gcg05l2Q2bfneZMs8+h/AF+Z8cLdI8nw== X-Received: by 2002:a5d:6d0e:0:b0:390:e9b5:d69c with SMTP id ffacd0b85a97d-3911f756966mr5081503f8f.25.1741215024797; Wed, 05 Mar 2025 14:50:24 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 14/18] qemu: Support O_DIRECT with mapped-ram on restore Date: Wed, 5 Mar 2025 15:48:23 -0700 Message-ID: <20250305224957.5369-15-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: HIRNTXGOYFKKGMCSUEDYNHTWVGAV4WR6 X-Message-ID-Hash: HIRNTXGOYFKKGMCSUEDYNHTWVGAV4WR6 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 CC: farosas@suse.de 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: 1741215453531019100 Content-Type: text/plain; charset="utf-8" When using the mapped-ram migration capability, direct IO is enabled by setting the "direct-io" migration parameter to "true" and passing QEMU an additional fd with O_DIRECT set. Signed-off-by: Jim Fehlig --- src/qemu/qemu_migration.c | 11 ++++++----- src/qemu/qemu_process.c | 27 +++++++++++++++++++++++---- src/qemu/qemu_process.h | 6 ++++-- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4554a52165..6c8098c65d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3110,7 +3110,8 @@ qemuMigrationDstPrepareCleanup(virQEMUDriver *driver, } =20 static qemuProcessIncomingDef * -qemuMigrationDstPrepare(virDomainObj *vm, +qemuMigrationDstPrepare(virQEMUDriver *driver, + virDomainObj *vm, bool tunnel, const char *protocol, const char *listenAddress, @@ -3170,9 +3171,9 @@ qemuMigrationDstPrepare(virDomainObj *vm, migrateFrom =3D g_strdup_printf(incFormat, protocol, listenAddress= , port); } =20 - return qemuProcessIncomingDefNew(vm, listenAddress, + return qemuProcessIncomingDefNew(driver, vm, listenAddress, migrateFrom, fd, - NULL, NULL); + NULL, NULL, NULL); } =20 =20 @@ -3312,7 +3313,7 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, goto error; stopProcess =3D true; =20 - if (!(incoming =3D qemuMigrationDstPrepare(vm, tunnel, protocol, + if (!(incoming =3D qemuMigrationDstPrepare(driver, vm, tunnel, protoco= l, listenAddress, port, &dataFD[0]))) goto error; @@ -3684,7 +3685,7 @@ qemuMigrationDstPrepareResume(virQEMUDriver *driver, =20 priv->origname =3D g_strdup(origname); =20 - if (!(incoming =3D qemuMigrationDstPrepare(vm, false, protocol, + if (!(incoming =3D qemuMigrationDstPrepare(driver, vm, false, protocol, listenAddress, port, NULL))) goto cleanup; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cba44ec5c2..16bb961485 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4841,13 +4841,16 @@ qemuProcessIncomingDefFree(qemuProcessIncomingDef *= inc) * qemuProcessIncomingDefFree will NOT close it. */ qemuProcessIncomingDef * -qemuProcessIncomingDefNew(virDomainObj *vm, +qemuProcessIncomingDefNew(virQEMUDriver *driver, + virDomainObj *vm, const char *listenAddress, const char *migrateFrom, int *fd, const char *path, - virQEMUSaveData *data) + virQEMUSaveData *data, + qemuMigrationParams *migParams) { + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); qemuDomainObjPrivate *priv =3D vm->privateData; qemuProcessIncomingDef *inc =3D NULL; =20 @@ -4860,9 +4863,25 @@ qemuProcessIncomingDefNew(virDomainObj *vm, =20 if (data && data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE) { size_t offset =3D sizeof(virQEMUSaveHeader) + data->header.data_le= n; + bool directio =3D false; =20 inc->fdPassMigrate =3D qemuFDPassNew("libvirt-incoming-migrate", p= riv); - qemuFDPassAddFD(inc->fdPassMigrate, fd, "-fd"); + /* When using directio with mapped-ram, qemu needs an fd without + * O_DIRECT set for reading small bits of unaligned state. */ + if (qemuMigrationParamsGetBool(migParams, QEMU_MIGRATION_PARAM_DIR= ECT_IO, &directio) < 0) + goto error; + + if (directio) { + VIR_AUTOCLOSE bufferedFd =3D -1; + + if ((bufferedFd =3D qemuDomainOpenFile(cfg, NULL, path, O_RDON= LY, NULL)) < 0) + goto error; + + qemuFDPassAddFD(inc->fdPassMigrate, &bufferedFd, "-buffered-fd= "); + qemuFDPassAddFD(inc->fdPassMigrate, fd, "direct-io-fd"); + } else { + qemuFDPassAddFD(inc->fdPassMigrate, fd, "-buffered-fd"); + } inc->uri =3D g_strdup_printf("file:%s,offset=3D%#lx", qemuFDPassGetPath(inc->fdPassMigrate), = offset); } else { @@ -8531,7 +8550,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, /* The fd passed to qemuProcessIncomingDefNew is used to create the mi= gration * URI, so it must be called after starting the decompression program. */ - incoming =3D qemuProcessIncomingDefNew(vm, NULL, "stdio", fd, path, da= ta); + incoming =3D qemuProcessIncomingDefNew(driver, vm, NULL, "stdio", fd, = path, data, migParams); if (!incoming) return -1; =20 diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index c51335ad7a..8f7b3f24c4 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -57,12 +57,14 @@ struct _qemuProcessIncomingDef { const char *path; /* path associated with fd */ }; =20 -qemuProcessIncomingDef *qemuProcessIncomingDefNew(virDomainObj *vm, +qemuProcessIncomingDef *qemuProcessIncomingDefNew(virQEMUDriver *driver, + virDomainObj *vm, const char *listenAddres= s, const char *migrateFrom, int *fd, const char *path, - virQEMUSaveData *data); + virQEMUSaveData *data, + qemuMigrationParams *mig= Params); =20 void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc); =20 --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215480; cv=none; d=zohomail.com; s=zohoarc; b=gi9RjscBKyUp99h782WHeU/jMPTOm05fHptYan7KsRQC4sodOVyEHMkIVMjpq6Y4BnLSdn+r9w26ATof1xvxO0BSwO7dpkc3OlVzv7jSL47LoH3srcQ7s6U1aDarSTgw/ccO0Dl7rklIa4uGAf/IhZRiX/TCTAhhZBfI/uYQaWM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215480; h=Content-Transfer-Encoding:Cc:Cc: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; bh=LFNQ0gmYqf6JMK2y/f/Fob8WGOq0ililgRkTdSbnCVc=; b=Gddygd3xiv5c5ayDFOPzppPNWRQt7jBegEkw8TqIsQCQ1E6qo58yJuFN20tb3PkW6m77tYSYkTYZ2aVf3JSZ0+j/1D9p1KwTF5c5H6HQ7L66ZdX3i95Dic9AEHBwyGjMq7qLCBMIdQfH/0l00/NhIprBK3mj5L8yB2hy2HzcdN8= 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 1741215480219586.6678996602863; Wed, 5 Mar 2025 14:58:00 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 239F517DA; Wed, 5 Mar 2025 17:57:59 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 6AD2315A3; Wed, 5 Mar 2025 17:51:01 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 9C0561755; Wed, 5 Mar 2025 17:50:45 -0500 (EST) Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (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 CE84E14F8 for ; Wed, 5 Mar 2025 17:50:27 -0500 (EST) Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-5e5b572e45cso1595770a12.0 for ; Wed, 05 Mar 2025 14:50:27 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7365ff1668dsm6230524b3a.59.2025.03.05.14.50.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:26 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215027; x=1741819827; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MDOxbYy+285ueS60uvUl2NwtlZxHafRwl+/HUUSirQ8=; b=F6ZaIGYjTZy6vlmVFTERmRqfq41A+DQaaG/3K4eQKXn0DlBSszuejldBXcgZ3kmKZk r8lzy18IaBwehg8UNTmj55UbcYj4/sJ/olliADU3Zi/eOXqf/VOaGbsAXP/PXMcyRMgH SCTvpYAONqc147WzjHxKMq2JQNlh5lCFFBV3i52uc5vCduYHGKMfvVAh4oYdRr7A5yeO GNh3G/9FvV4AEMwK0/wAGsUdHDOT5U5LRmSe+EUkBifKRTZRsjt0+WczHFDtbC4/Qlam KjNwWLyNR8QgkjNe9lgBK95IiU6feh8X2zUArxcJxFyFYMfzR3fJJjWTS3vGPxdiE1tN zvxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215027; x=1741819827; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MDOxbYy+285ueS60uvUl2NwtlZxHafRwl+/HUUSirQ8=; b=VFkHENPnMy5CLFWY2FPB6r+OVbnc5uHvPMSWIw2idI55FEOr6Sk/wuxHjSCMSa7d62 cXgkfKO1A8ZTNyXAFIs2xaIOK6BD1u9oa4XGVXdmhy5K/2/i/ZXqCcHHjlUaYW8yzyXo LbRIvCSRjZU0PeEKZuugvmwNF0629tkxyRJuGYQkPP/kwkoxlxlcHXYItPDDLuJ0cIop u/fIG2b35BKoa+KCyTbs/DDL9tUi7rzaiEK98yRhD+Ko0JdEx6HR1Wji0agRY7zYaq48 8wy6hcRguxIpi42BCAL+qZ23x3rlUWEq8c9vhQe8qtskTug3aDY/7dGnTNVeZreEgNTo o4Ig== X-Gm-Message-State: AOJu0YwMAAH7MfwSBMGPAv0nX0MYTvYYopbMxLPLRRY+/+AG0GojFgYD pbWSUZszcGrAohZAVdJn+j2LDICb0v25vYflZp5GTIn+xD58ttKNqZsu2txcNNrCbsBFfgvAd0a H X-Gm-Gg: ASbGnctMKG9VvjJjYhmw09VqdUphrz/TtcFMhm5RC862QR0o4SOJzBp+G1FwMV7KjAI gTzFgB+U48k69r6vgZXOSz5hpdVslRWhgAz30C8/uGsUbSAt4kEXU6bLhPCLYYej5zvy8YFPhzw yx/KO7yKdWQgD9PnFEn3UklYpQaoAbzJ1Vm71WNAocttlu8om5zSTpBAZJtxwpZKv4bVUsaTLkG uM2OPf61w18OlflSeyRDUySdDzqisxtNhtwN2QTpwMpmokBuamIFrTHlOeez+0YLDFvahjAgNtQ 0Nk+daA1TGCydq72wqylwxp1toXn8IGPHVRBp9lPXYqOliXxi3pONQhH5q5YPo0= X-Google-Smtp-Source: AGHT+IEcJUJFY3xmGpRpdYe9Ou1v4e1OpkB+auxFs+oBuHOinDPzZR+eIKsTylBk4pYa9Hyd5894/A== X-Received: by 2002:a05:6402:4305:b0:5dc:63d:b0c1 with SMTP id 4fb4d7f45d1cf-5e59f486e1fmr5128287a12.29.1741215026649; Wed, 05 Mar 2025 14:50:26 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 15/18] include: Define constants for parallel save/restore Date: Wed, 5 Mar 2025 15:48:24 -0700 Message-ID: <20250305224957.5369-16-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 72JPQCZJIB5EYTXSSNBWHUDPBG56ZHSV X-Message-ID-Hash: 72JPQCZJIB5EYTXSSNBWHUDPBG56ZHSV 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 CC: farosas@suse.de, Claudio Fontana 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: 1741215481840019100 Content-Type: text/plain; charset="utf-8" From: Claudio Fontana Add a new VIR_DOMAIN_SAVE_PARALLEL flag to the save and restore APIs, which can be used to specify the use of multiple, parallel channels for saving and restoring a domain. The number of parallel channels can be set using the VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS typed parameter. Signed-off-by: Claudio Fontana Signed-off-by: Jim Fehlig --- include/libvirt/libvirt-domain.h | 11 +++++++++++ src/libvirt-domain.c | 3 +++ 2 files changed, 14 insertions(+) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 0121620e9c..7f1a2003c0 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1655,6 +1655,7 @@ typedef enum { VIR_DOMAIN_SAVE_RUNNING =3D 1 << 1, /* Favor running over paused = (Since: 0.9.5) */ VIR_DOMAIN_SAVE_PAUSED =3D 1 << 2, /* Favor paused over running = (Since: 0.9.5) */ VIR_DOMAIN_SAVE_RESET_NVRAM =3D 1 << 3, /* Re-initialize NVRAM from t= emplate (Since: 8.1.0) */ + VIR_DOMAIN_SAVE_PARALLEL =3D 1 << 4, /* Save and restore using par= allel channels (Since: 10.6.0) */ } virDomainSaveRestoreFlags; =20 int virDomainSave (virDomainPtr domain, @@ -1712,6 +1713,16 @@ int virDomainRestoreParams (vir= ConnectPtr conn, */ # define VIR_DOMAIN_SAVE_PARAM_IMAGE_FORMAT "image_format" =20 +/* + * VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS: + * + * an optional parameter used to specify the number of IO channels to use + * during parallel save. As VIR_TYPED_PARAM_INT. + * + * Since: 11.2.0 + */ +# define VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS "parallel.channels" + =20 /* See below for virDomainSaveImageXMLFlags */ char * virDomainSaveImageGetXMLDesc (virConnectPtr conn, diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 0ee7c6f45b..d0c1b6c037 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -1225,6 +1225,9 @@ virDomainRestoreFlags(virConnectPtr conn, const char = *from, const char *dxml, * now, VIR_DOMAIN_SAVE_PARAM_FILE is required but this requirement may * be lifted in the future. * + * See VIR_DOMAIN_SAVE_PARAM_* for detailed description of accepted + * restore parameters. + * * Returns 0 in case of success and -1 in case of failure. * * Since: 8.4.0 --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215529; cv=none; d=zohomail.com; s=zohoarc; b=YRAzHvObCaD53ZYw1AID9Zup3RVfaB787EADugYfLLq1gldUF+GBf2vsBz7VydNcXjvimSojNz6GbKMq14jlejVdQhRYjFkf6SYdTj3XY6NnkvnDk9wUuMx9dqkxhnRihWNCvng6wVM02BU2JoWquyXvcJKE8IBH1mEbXmoalVo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215529; h=Content-Transfer-Encoding:Cc:Cc: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; bh=sNOVeMkybhOGprdgF3/Ebk5O+kQFnIFc+Qnajpozjhk=; b=XC6qJkmYXMmZ/vqCTMFuyzr9Ibc50fyopjBAjavtmSoqx9Zm+4CbVl1Q9fBn6jFJdArAUwLVVgJvH62MndDQkBHJYf1NSAb6wRhA4PLipTr7TXgOGQHto8ofs7ZXuBiMXHHOZ1ZixUi7tQhqhzPHesI8XyKzNS7hkEc7tSd6KLM= 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 1741215529209536.974705515287; Wed, 5 Mar 2025 14:58:49 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 9A31716DE; Wed, 5 Mar 2025 17:58:48 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 4F9BB179D; Wed, 5 Mar 2025 17:51:04 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id CE99C14E3; Wed, 5 Mar 2025 17:50:53 -0500 (EST) Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 BB84816F9 for ; Wed, 5 Mar 2025 17:50:29 -0500 (EST) Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-5dee07e51aaso13799248a12.3 for ; Wed, 05 Mar 2025 14:50:29 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-736387b2c1dsm9514420b3a.64.2025.03.05.14.50.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:27 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215028; x=1741819828; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=o6gea5KoaU5eeFmjQsJwYNS/D5C6GW51Dty8Ho7443o=; b=fz3l1eeFuEnx7vpL6zveB5KXxSZv8kWiIUkJ/wAl0PzS7cEfFlw2fxdU6a46W2Xnaq eI0l/hWnNda8glMGBqkppuLblPLfWWKIjn0lpuRRRD4KB3QgQ6Fjwg/uYxw9e1+W4BFC bieU3UqY285KzdAD36ZyFU9Z16ikK8tHv7yL8HiWno5pA1PdkI2g6nZEVHmFI0Wcr6Uu uU9IHGWHog8Sq83AYQsmQkbYXhewPKdLyrLm8h5iCNXC7jKGhQXFGGXbgBwSNC0QIL37 Kq24lJVoQv8XWLp++jIWuf+364AaUxdMJhMUGw0+jmJdH1/U+3Ncnt36RwZD82YuwJx/ SgOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215028; x=1741819828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o6gea5KoaU5eeFmjQsJwYNS/D5C6GW51Dty8Ho7443o=; b=uUr+EBlc5rGmeOnrZ+HHmsK7/TxfBJBj5kTyAWhqJY4438A4+eu8lg3XlyH8A36SKe FcN/8/pyMVg4vNh60N0yU72bcVJUqyq+M2zB2vAJ6QyZa2xDaEbGI2UxQ6rfxC3SicNT AoAy2iHut39dVujn1gpiyF2RmdO+DJEmqnNUutyivpJWWNgGvb+NKBF9ErUNfaRAGyjO HTDB8aOVcv6otNJ5dDLx2nIg1ESH3h5KkwpjLslBceyTunvgmY2nE03zN0QQ3Nw+JUXa /PSP58aEdf0tQ48C4mtDiNB27KeM68E5y5QHA8ulEc0t7M2+pIOfeyTGVarv+WzagLsZ estA== X-Gm-Message-State: AOJu0YzwFG6NaVcH/7HzNwVcbfy9NUO6c1tfxbcZUuTyauBRmUN3auGf vnFexPkLunzK3VxtA0ptsUizVy4oFLaccJUxI2JOron38vGwHSlCG8Hv7y+/7Mw2pZRHAROOgc6 L X-Gm-Gg: ASbGnctEaN1VHhHtRf1kepGXyevkrWHRYVyYdIcq09jU4qkMuel/kcHFI2Qrc1mX9W3 GxRL6TYgZYoaADunvs8uG/yoAyFhshIvjAz4k9ijhqftQCuD7+H7BabiHlX8yFAg+lKlQlqjx7V 83OZrLEAwVGY9Ouj/oq1LXyFxPhjm5LopejqxWNtTGKFAvJwi7QMRKVKZb8MW3DpxGZ61BK+3ac LJzPD1DGIvlk1m63HktgfIICtf+IKZBn3PHokBYfhHHJivh462iy1/RQihSrdqISywKxR/2yFGX /LJd6vmz6hCY8OTP7GHBczvP9r5H0hE8qz/lkLoYInfqfjknSS7wafYod9rKKds= X-Google-Smtp-Source: AGHT+IEmjtG2YLq+ppKqkP8VviA7nS4RECi538hf3zuFjBy+HWnR+uZVBQr6dOjM06ExuKbq4VTY7Q== X-Received: by 2002:a05:6402:2811:b0:5e5:35d1:87d with SMTP id 4fb4d7f45d1cf-5e59f4cc3a0mr4696108a12.20.1741215028538; Wed, 05 Mar 2025 14:50:28 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 16/18] qemu: Add support for parallel save and restore Date: Wed, 5 Mar 2025 15:48:25 -0700 Message-ID: <20250305224957.5369-17-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: CV5R744LRQY2WYGUBTDRPFEHJCV3XCVO X-Message-ID-Hash: CV5R744LRQY2WYGUBTDRPFEHJCV3XCVO 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 CC: farosas@suse.de 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: 1741215530276019000 Content-Type: text/plain; charset="utf-8" Add support for parallel save and restore by mapping libvirt's "parallel-channels" parameter to QEMU's "multifd-channels" migration parameter. Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 32 +++++++++++++++++++++----------- src/qemu/qemu_migration_params.c | 31 +++++++++++++++++++++++++++++-- src/qemu/qemu_migration_params.h | 5 ++++- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e098a96a4e..bbabc714d3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2590,6 +2590,8 @@ qemuDomainSaveInternal(virQEMUDriver *driver, int format, virCommand *compressor, const char *xmlin, + virTypedParameterPtr params, + int nparams, unsigned int flags) { g_autofree char *xml =3D NULL; @@ -2679,7 +2681,8 @@ qemuDomainSaveInternal(virQEMUDriver *driver, goto endjob; xml =3D NULL; =20 - if (!(saveParams =3D qemuMigrationParamsForSave(format =3D=3D QEMU_SAV= E_FORMAT_SPARSE, + if (!(saveParams =3D qemuMigrationParamsForSave(params, nparams, + format =3D=3D QEMU_SAVE_= FORMAT_SPARSE, flags))) goto endjob; =20 @@ -2763,7 +2766,7 @@ qemuDomainManagedSaveHelper(virQEMUDriver *driver, VIR_INFO("Saving state of domain '%s' to '%s'", vm->def->name, path); =20 if (qemuDomainSaveInternal(driver, vm, path, cfg->saveImageFormat, - compressor, dxml, flags) < 0) + compressor, dxml, NULL, 0, flags) < 0) return -1; =20 vm->hasManagedSave =3D true; @@ -2799,7 +2802,7 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *pat= h, const char *dxml, goto cleanup; =20 ret =3D qemuDomainSaveInternal(driver, vm, path, cfg->saveImageFormat, - compressor, dxml, flags); + compressor, dxml, NULL, 0, flags); =20 cleanup: virDomainObjEndAPI(&vm); @@ -2830,7 +2833,8 @@ qemuDomainSaveParams(virDomainPtr dom, =20 virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | VIR_DOMAIN_SAVE_RUNNING | - VIR_DOMAIN_SAVE_PAUSED, -1); + VIR_DOMAIN_SAVE_PAUSED | + VIR_DOMAIN_SAVE_PARALLEL, -1); =20 if (virTypedParamsValidate(params, nparams, VIR_DOMAIN_SAVE_PARAM_FILE, @@ -2839,6 +2843,8 @@ qemuDomainSaveParams(virDomainPtr dom, VIR_TYPED_PARAM_STRING, VIR_DOMAIN_SAVE_PARAM_IMAGE_FORMAT, VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS, + VIR_TYPED_PARAM_INT, NULL) < 0) return -1; =20 @@ -2876,7 +2882,7 @@ qemuDomainSaveParams(virDomainPtr dom, goto cleanup; =20 ret =3D qemuDomainSaveInternal(driver, vm, to, format, - compressor, dxml, flags); + compressor, dxml, params, nparams, flags); =20 cleanup: virDomainObjEndAPI(&vm); @@ -5744,6 +5750,8 @@ static int qemuDomainRestoreInternal(virConnectPtr conn, const char *path, const char *dxml, + virTypedParameterPtr params, + int nparams, unsigned int flags, int (*ensureACL)(virConnectPtr, virDomainDef *)) { @@ -5765,7 +5773,8 @@ qemuDomainRestoreInternal(virConnectPtr conn, virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | VIR_DOMAIN_SAVE_RUNNING | VIR_DOMAIN_SAVE_PAUSED | - VIR_DOMAIN_SAVE_RESET_NVRAM, -1); + VIR_DOMAIN_SAVE_RESET_NVRAM | + VIR_DOMAIN_SAVE_PARALLEL, -1); =20 if (flags & VIR_DOMAIN_SAVE_RESET_NVRAM) reset_nvram =3D true; @@ -5774,7 +5783,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, goto cleanup; =20 sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; - if (!(restoreParams =3D qemuMigrationParamsForSave(sparse, flags))) + if (!(restoreParams =3D qemuMigrationParamsForSave(params, nparams, sp= arse, flags))) goto cleanup; =20 fd =3D qemuSaveImageOpen(driver, path, @@ -5856,7 +5865,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, const char *dxml, unsigned int flags) { - return qemuDomainRestoreInternal(conn, path, dxml, flags, + return qemuDomainRestoreInternal(conn, path, dxml, NULL, 0, flags, virDomainRestoreFlagsEnsureACL); } =20 @@ -5864,7 +5873,7 @@ static int qemuDomainRestore(virConnectPtr conn, const char *path) { - return qemuDomainRestoreInternal(conn, path, NULL, 0, + return qemuDomainRestoreInternal(conn, path, NULL, NULL, 0, 0, virDomainRestoreEnsureACL); } =20 @@ -5880,6 +5889,7 @@ qemuDomainRestoreParams(virConnectPtr conn, if (virTypedParamsValidate(params, nparams, VIR_DOMAIN_SAVE_PARAM_FILE, VIR_TYPED_PARAM= _STRING, VIR_DOMAIN_SAVE_PARAM_DXML, VIR_TYPED_PARAM= _STRING, + VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS, VI= R_TYPED_PARAM_INT, NULL) < 0) return -1; =20 @@ -5896,7 +5906,7 @@ qemuDomainRestoreParams(virConnectPtr conn, return -1; } =20 - ret =3D qemuDomainRestoreInternal(conn, path, dxml, flags, + ret =3D qemuDomainRestoreInternal(conn, path, dxml, params, nparams, f= lags, virDomainRestoreParamsEnsureACL); return ret; } @@ -6108,7 +6118,7 @@ qemuDomainObjRestore(virConnectPtr conn, } =20 sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; - if (!(restoreParams =3D qemuMigrationParamsForSave(sparse, + if (!(restoreParams =3D qemuMigrationParamsForSave(NULL, 0, sparse, bypass_cache ? VIR_DO= MAIN_SAVE_BYPASS_CACHE : 0))) return -1; =20 diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index 16e93f27d6..b696b0d13e 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -797,10 +797,19 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr par= ams, =20 =20 qemuMigrationParams * -qemuMigrationParamsForSave(bool sparse, unsigned int flags) +qemuMigrationParamsForSave(virTypedParameterPtr params, + int nparams, + bool sparse, + unsigned int flags) { g_autoptr(qemuMigrationParams) saveParams =3D NULL; =20 + if (flags & VIR_DOMAIN_SAVE_PARALLEL && !sparse) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Parallel save is only supported with the 'sparse= ' save image format")); + return NULL; + } + if (!(saveParams =3D qemuMigrationParamsNew())) return NULL; =20 @@ -809,7 +818,25 @@ qemuMigrationParamsForSave(bool sparse, unsigned int f= lags) return NULL; if (virBitmapSetBit(saveParams->caps, QEMU_MIGRATION_CAP_MULTIFD) = < 0) return NULL; - saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].value.i = =3D 1; + + if (flags & VIR_DOMAIN_SAVE_PARALLEL) { + int nchannels; + + if (params && virTypedParamsGetInt(params, nparams, + VIR_DOMAIN_SAVE_PARAM_PARAL= LEL_CHANNELS, + &nchannels) < 0) + return NULL; + + if (nchannels < 1) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("number of parallel save channels cannot = be less than 1")); + return NULL; + } + + saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].valu= e.i =3D nchannels; + } else { + saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].valu= e.i =3D 1; + } saveParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].set =3D = true; =20 if (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) { diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_par= ams.h index 87822332d3..9d771d519d 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -89,7 +89,10 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, qemuMigrationParty party); =20 qemuMigrationParams * -qemuMigrationParamsForSave(bool sparse, unsigned int flags); +qemuMigrationParamsForSave(virTypedParameterPtr params, + int nparams, + bool sparse, + unsigned int flags); =20 int qemuMigrationParamsDump(qemuMigrationParams *migParams, --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215503; cv=none; d=zohomail.com; s=zohoarc; b=dB0VPuw0AlO5a/EvD4F5cxgsDCa8At/ZQ+k+grk9TmsUW7QJFgae5iJzRPRi98KXSFmSbwyOiiFUct7kDi9ES82gBChba1G8JQLoz7FwoF/q4SMJYtm4d4qJAw7BvdHUxM5doaPYopj+hho4aQ39T3HrylqX0MeWre3QGAbY3ng= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215503; h=Content-Transfer-Encoding:Cc:Cc: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; bh=nfUgy3sFbeg/MRZ5E+xPTKHwEYCcf+cBAR1xzkw+XVQ=; b=esLtSGrVP27+dQstKo2zXBryWTMOkMqpdMjvDdNYlJCUdcP5v2ybHrYasS8GygAa7sBPMYYohwjsrECGA4TDIy8XuSqTxitbH+qFK4n1qlD/ohwsinZBqha+gbwE61ucxK9B4U3ZVmHDhBdc8479GfJRSpCZu/r0DOuQv/Tr+84= 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 1741215503309209.970140689372; Wed, 5 Mar 2025 14:58:23 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 495A31777; Wed, 5 Mar 2025 17:58:22 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id F22EB15BE; Wed, 5 Mar 2025 17:51:02 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id C83081563; Wed, 5 Mar 2025 17:50:53 -0500 (EST) Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 7086A14E3 for ; Wed, 5 Mar 2025 17:50:31 -0500 (EST) Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-abf4d756135so7825566b.1 for ; Wed, 05 Mar 2025 14:50:31 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-22350510ec6sm118964015ad.220.2025.03.05.14.50.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:29 -0800 (PST) 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_H3, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE 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=1741215030; x=1741819830; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=przOf+IzmKk2oqAYkCVi9FaX9u9K6zSrbyhO0JytQvk=; b=bKAXwjUdfYwtKyApKvVEAg2sV0hzXkhthFxJ4XIeFH4P9xmNcTfB65jdGIY9vNe27h DZYoUGO2Vof5xuV0i2Mzpg421HWESFiJFJ9azyz6udhCs2OjxBwyhnlXnx0iJixTE0P+ G6rhmetJFdn9062IifD0JBZUEHfADokBg/5hZM7UN6ztVuvXV4guoLeWNMUSHelVnB9Z FgoOBhFLl4fdJGrIwth0llILt53Vm55ju9Vkh3RJtsJuvK1OkpceimSWC1LWyS7/TT9m ClSOM+sOXwpNFE90TizhDojexHCBF6t7O8ocCeCB1ZNKG3/c4CSa9W26SBNZ/Ay2WSU+ 1kBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215030; x=1741819830; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=przOf+IzmKk2oqAYkCVi9FaX9u9K6zSrbyhO0JytQvk=; b=woiMN5KT1Hp/2lOuWrqAJHUWxV2HLRzVAkztUTEonZzxARyN3mLr7JcdqMe8bc7X+V mdQHzJUeNPvvtm3a5lTShWv61K5kfEzWGkGggJ4/51QWpe8WeytDHo89Kxyn5S2KgOAC k5j0tfkd/n6yJbE76hfHsuyMY16rSCYCQXnqRKa2eN0p0pmg/u3B8WiKrtJW6n2N+Lp2 i3epGS2sC4wPO4qQvzv+JHsR+qWPnFVKKFK3k73mlLXB4zd4EDaH56pbNoKULrzlUrFw gAqKPspbQgHXqzbOQ/W+yf/LZmoThXYpcifO4jKR0r9InI//E9jWeNdfaUROznxauAjb 49Kw== X-Gm-Message-State: AOJu0YzthDqq8rp4e5gNKEjTlRlFXReozj/9jCUZPOg9prkj02BQFNIL WJ4VJn5WHJPyAR6ydcIivyXdexE9/mXibYyDEpUeIOAOcicF57BvmFKzSaYZ+cHxlj3n7kM33Z8 6 X-Gm-Gg: ASbGncuowa+Hb4n0WtR9u2ODwIsGBce+5AU4qlXswibsUWZyGcYa/AIQcTUHR9LE9bj nOdfCS+Gde1pwFh+XoXgBCDrOSEgic3TrAN/OSm8d9zcBbNJ2RxDxSfdzDB/UH66/NQDVEHWl8Y BsQ7XfuO8YzyU22UTUcma/fnBPvVcfClaRTB5CZvqUUrZxRHWDYyVUyae87hNol5zgnNUkqsDJo SRvxMwjlqzDkurlO+4DasOUgINqaztjexZZVYjMDtJA/7unb4zQR8jWncms0kzWgPM5Q070KvD7 Obq+gXp9WiY2uIhK8qbpmCz1U0C5TU/p6UNbDlazBhmWg2942c/lmUwSpJqwP9I= X-Google-Smtp-Source: AGHT+IFD+rmNaN1ch5LRynos08shmrC2RfHL3KTh+GKojTO7+ymYbAvQu57+D+qy0TCWlaTwaaCZVg== X-Received: by 2002:a17:906:7950:b0:abf:4521:eb2a with SMTP id a640c23a62f3a-ac20db09298mr560917366b.49.1741215030326; Wed, 05 Mar 2025 14:50:30 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 17/18] tools: add parallel parameter to virsh save command Date: Wed, 5 Mar 2025 15:48:26 -0700 Message-ID: <20250305224957.5369-18-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: A2BOEHK2W2LOQWVXEPHMEGMGYLSJUWPV X-Message-ID-Hash: A2BOEHK2W2LOQWVXEPHMEGMGYLSJUWPV 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 CC: farosas@suse.de, Claudio Fontana 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: 1741215505764019100 Content-Type: text/plain; charset="utf-8" From: Claudio Fontana Signed-off-by: Claudio Fontana Signed-off-by: Jim Fehlig --- docs/manpages/virsh.rst | 12 +++++++++++- tools/virsh-domain.c | 42 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index baced15dec..5d4a77bdf4 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -4015,6 +4015,7 @@ save :: =20 save domain state-file [--bypass-cache] [--xml file] + [--parallel] [--parallel-channels channels] [{--running | --paused}] [--verbose] =20 Saves a running domain (RAM, but not disk state) to a state file so that @@ -4022,8 +4023,11 @@ it can be restored later. Once saved, the domain will no longer be running on the system, thus the memory allocated for the domain will be free for other domains to use. ``virsh restore`` restores from this state file. + If *--bypass-cache* is specified, the save will avoid the file system -cache, although this may slow down the operation. +cache. Depending on the specific scenario this may slow down or speed up +the operation. + =20 The progress may be monitored using ``domjobinfo`` virsh command and cance= led with ``domjobabort`` command (sent by another virsh instance). Another opt= ion @@ -4045,6 +4049,12 @@ based on the state the domain was in when the save w= as done; passing either the *--running* or *--paused* flag will allow overriding which state the ``restore`` should use. =20 +*--parallel* option will cause the save data to be written to file +over multiple parallel IO channels. The number of channels can be +specified using *--parallel-channels*. Using parallel IO channels +requires the use of ``sparse`` image save format. Parallel save may +significantly reduce the time required to save large memory domains. + Domain saved state files assume that disk images will be unchanged between the creation and restore point. For a more complete system restore point, where the disk state is saved alongside the memory diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 93c34c4971..797df48d9d 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -4145,6 +4145,14 @@ static const vshCmdOptDef opts_save[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("avoid file system cache when saving") }, + {.name =3D "parallel", + .type =3D VSH_OT_BOOL, + .help =3D N_("enable parallel save") + }, + {.name =3D "parallel-channels", + .type =3D VSH_OT_INT, + .help =3D N_("number of extra IO channels to use for parallel save") + }, {.name =3D "xml", .type =3D VSH_OT_STRING, .unwanted_positional =3D true, @@ -4175,6 +4183,11 @@ doSave(void *opaque) g_autoptr(virshDomain) dom =3D NULL; const char *name =3D NULL; const char *to =3D NULL; + virTypedParameterPtr params =3D NULL; + int nparams =3D 0; + int maxparams =3D 0; + int nchannels =3D 1; + int rv =3D -1; unsigned int flags =3D 0; const char *xmlfile =3D NULL; g_autofree char *xml =3D NULL; @@ -4188,15 +4201,30 @@ doSave(void *opaque) goto out_sig; #endif /* !WIN32 */ =20 - if (vshCommandOptString(ctl, cmd, "file", &to) < 0) - goto out; - if (vshCommandOptBool(cmd, "bypass-cache")) flags |=3D VIR_DOMAIN_SAVE_BYPASS_CACHE; if (vshCommandOptBool(cmd, "running")) flags |=3D VIR_DOMAIN_SAVE_RUNNING; if (vshCommandOptBool(cmd, "paused")) flags |=3D VIR_DOMAIN_SAVE_PAUSED; + if (vshCommandOptBool(cmd, "parallel")) + flags |=3D VIR_DOMAIN_SAVE_PARALLEL; + + if (vshCommandOptString(ctl, cmd, "file", &to) < 0) + goto out; + if (to && + virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_FILE, to) < 0) + goto out; + + if (flags & VIR_DOMAIN_SAVE_PARALLEL) { + if ((rv =3D vshCommandOptInt(ctl, cmd, "parallel-channels", &nchan= nels)) < 0) + goto out; + + if (virTypedParamsAddInt(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS, = nchannels) < 0) + goto out; + } =20 if (vshCommandOptString(ctl, cmd, "xml", &xmlfile) < 0) goto out; @@ -4209,9 +4237,13 @@ doSave(void *opaque) vshReportError(ctl); goto out; } + if (xml && + virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_DXML, xml) < 0) + goto out; =20 if (flags || xml) { - rc =3D virDomainSaveFlags(dom, to, xml, flags); + rc =3D virDomainSaveParams(dom, params, nparams, flags); } else { rc =3D virDomainSave(dom, to); } @@ -4224,6 +4256,8 @@ doSave(void *opaque) data->ret =3D 0; =20 out: + virTypedParamsFree(params, nparams); + #ifndef WIN32 pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL); out_sig: --=20 2.43.0 From nobody Wed Mar 12 12:44:55 2025 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=1741215551; cv=none; d=zohomail.com; s=zohoarc; b=NVpHudx4Gq3AW2gvlcaCGDUAdRZaskijo2ecOR6UKCGczvsbesftS1SIDkIlTgvJCKwnKysFKiC4kQ2aHTCEJED23xgaga8K8igiFEmc9tOySi3HV+pBIHJo6hiHEeSJLO7vCEQerrI60uaD1gVrQs4L0PGyMIkxNzMI96k9PvE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741215551; h=Content-Transfer-Encoding:Cc:Cc: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; bh=MAAXy99+U21it50PASUDCbH88MyzGF5TsR/ZjnxRUYU=; b=eMMtVgDdPu2Hp2PCA+kpxrojJH+flZEO1vITAzsm1DKut/JSzv6rjTxzX6vImILt0BRATbeSQr4aRYrST7w27Lr3hLDfEB7ltQ17nLqtenilxPhqScYpuvuqvVIQFeOBJy7J22PN3nQ7E1gtniz3LqMpLs9XEk5zjdA7wSWUikw= 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 1741215551371567.5822765723635; Wed, 5 Mar 2025 14:59:11 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id CE529B25; Wed, 5 Mar 2025 17:59:10 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id C7BC117A9; Wed, 5 Mar 2025 17:51:05 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 57F7414EA; Wed, 5 Mar 2025 17:50:55 -0500 (EST) Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 5D6571706 for ; Wed, 5 Mar 2025 17:50:33 -0500 (EST) Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-5e0b70fb1daso12988347a12.1 for ; Wed, 05 Mar 2025 14:50:33 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-223501f9e46sm118607575ad.53.2025.03.05.14.50.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 14:50:31 -0800 (PST) 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, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE 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=1741215032; x=1741819832; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ffylRG6SOT94eHgEY8mCpl3hMeLcaxD6CkO5GYNRJrE=; b=cFXkGenAlNkAHC5ak78XiD8gniXlDSlLVdv09AUapBPeJE1t1beqyWo46vI3AmKW83 OpWXoRsSAeslDJ1dHNCj8vWKAFwFGtFFFhMg830LurZjafOlP0ty0cJLfBq0T8CyTVfN tUbxdCHLiv5re1FpzT22HRb69l2KkdKa6y0gg6RvMo/HN/PdPYUhJ12Htn1Pu1p/IsjP k53A/i4RKAJwTrzWVcCg3iOoX96QgHwoj+iYNpUUvkz3HWPKWAwxP4veLF1FD3oANrbo 9z068roxsCSTWFdmHoDTgnGosYXsnhoLtjIuKE0NEApukVASDHnHpkogbz4/guM41fZv Ztjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741215032; x=1741819832; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ffylRG6SOT94eHgEY8mCpl3hMeLcaxD6CkO5GYNRJrE=; b=JqrLhmrNM0y+wKGuD/ZtD+1bLp99IwM3J8HdObg0vjdOuywCI8tPFKauN23kVwDOyE 7IkC5UpKqOCEJPMpcJmUwA6WUh55SwU4iiBQQ3vLgdgLc2hB4i9XRWB+IQInUXTHF7kn ZGNrMWbAs+V0NMO7pqlSerWSAp0qZ8T/tdNBN31SWegOa9HSkxLLroZFTrAxGyftj7es HUo2tBI+SBId1nAVtFwUjyize51tJGKMogqsxr+gC/xYykSS2eCHDgeMJPnxagKjQeDL rX2YYrfUFTtlABPwYm7jAEwMQnZy7vre241erqqHJiaY+KP+byqMv8JtkjyBLmIMrWDW HdMg== X-Gm-Message-State: AOJu0YxDtpjD4P5tD0mUMme+KXDFa0B7ryFHLqH4F7WmruWbUYks1Buw kP1FoKJU5aUGWtkjHzDlPlkaWvslXR+pUyMsYEn43yiVuKjoFJYpxfoCiXYIyENqVAnB8mP6+1s n X-Gm-Gg: ASbGncuEveTFkQALhqIHNw9D1Da3vSsbZmOD6l0nDjFaQ0wpDtlVaURegAPQLQ9f+PB 4qwZYypwLKt0bwQ1DHlxNv0wshWDkbUy8EYKt/OhWBqK2Hviw0dtgJvyuMLjZ0U8kwtWaOp1hdp +3+lP0gtYB7c+Na9CSPY/HMNLfxvxjlT20J+zP2jpeF7KI5UWtvSMMp9UDaCEG8EPgNL6SAII8o O3PeyDsagmjtDTWQrTvYfn6KnQn/m8JH9RGlWX8FJ9FO7tEW8z+EqNT2CyrqmzLmIYY8K3vjrP3 /3Pbn8+8gag0LKgoEAxHSAnhgvlWTXvoIja8xqRgMKpr/lGFWqsv3LiZSamSFCk= X-Google-Smtp-Source: AGHT+IGSC2W8GPsEtS0zEqYPmxTw8JzicxtOjVEkaS0b/hryy7bwsd2fCiDmsZhtAOj/RpG86nyh+A== X-Received: by 2002:a05:6402:1e8c:b0:5d9:fc81:e197 with SMTP id 4fb4d7f45d1cf-5e59f3c2304mr4209402a12.8.1741215032101; Wed, 05 Mar 2025 14:50:32 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V4 18/18] tools: add parallel parameter to virsh restore command Date: Wed, 5 Mar 2025 15:48:27 -0700 Message-ID: <20250305224957.5369-19-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250305224957.5369-1-jfehlig@suse.com> References: <20250305224957.5369-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: KQE2FHIRYXWE3NIZP6CHFOFCTFUIE37V X-Message-ID-Hash: KQE2FHIRYXWE3NIZP6CHFOFCTFUIE37V 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 CC: farosas@suse.de, Claudio Fontana 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: 1741215552271019000 Content-Type: text/plain; charset="utf-8" From: Claudio Fontana Signed-off-by: Claudio Fontana Signed-off-by: Jim Fehlig --- docs/manpages/virsh.rst | 9 +++++++-- tools/virsh-domain.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 5d4a77bdf4..40a13993ed 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -3966,12 +3966,13 @@ restore :: =20 restore state-file [--bypass-cache] [--xml file] - [{--running | --paused}] [--reset-nvram] + [{--running | --paused}] [--reset-nvram] [--parallel] [--parallel-ch= annels] =20 Restores a domain from a ``virsh save`` state file. See *save* for more in= fo. =20 If *--bypass-cache* is specified, the restore will avoid the file system -cache, although this may slow down the operation. +cache. Depending on the specific scenario this may slow down or speed up +the operation. =20 *--xml* ``file`` is usually omitted, but can be used to supply an alternative XML file for use on the restored guest with changes only @@ -3987,6 +3988,10 @@ domain should be started in. If *--reset-nvram* is specified, any existing NVRAM file will be deleted and re-initialized from its pristine template. =20 +*--parallel* option will cause the save data to be loaded using the number +of parallel IO channels specified with *--parallel-channels*. Parallel +channels will help speed up large restore operations. + ``Note``: To avoid corrupting file system contents within the domain, you should not reuse the saved state file for a second ``restore`` unless you have also reverted all storage volumes back to the same contents as when diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 797df48d9d..acc3064983 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -5281,6 +5281,14 @@ static const vshCmdOptDef opts_restore[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("avoid file system cache when restoring") }, + {.name =3D "parallel", + .type =3D VSH_OT_BOOL, + .help =3D N_("enable parallel restore") + }, + {.name =3D "parallel-channels", + .type =3D VSH_OT_INT, + .help =3D N_("number of IO channels to use for parallel restore") + }, {.name =3D "xml", .type =3D VSH_OT_STRING, .unwanted_positional =3D true, @@ -5310,13 +5318,16 @@ cmdRestore(vshControl *ctl, const vshCmd *cmd) const char *xmlfile =3D NULL; g_autofree char *xml =3D NULL; virshControl *priv =3D ctl->privData; + virTypedParameterPtr params =3D NULL; + int nparams =3D 0; + int maxparams =3D 0; + int nchannels =3D 1; int rc; =20 - if (vshCommandOptString(ctl, cmd, "file", &from) < 0) - return false; - if (vshCommandOptBool(cmd, "bypass-cache")) flags |=3D VIR_DOMAIN_SAVE_BYPASS_CACHE; + if (vshCommandOptBool(cmd, "parallel")) + flags |=3D VIR_DOMAIN_SAVE_PARALLEL; if (vshCommandOptBool(cmd, "running")) flags |=3D VIR_DOMAIN_SAVE_RUNNING; if (vshCommandOptBool(cmd, "paused")) @@ -5324,15 +5335,35 @@ cmdRestore(vshControl *ctl, const vshCmd *cmd) if (vshCommandOptBool(cmd, "reset-nvram")) flags |=3D VIR_DOMAIN_SAVE_RESET_NVRAM; =20 + if (vshCommandOptString(ctl, cmd, "file", &from) < 0) + return false; + if (from && + virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_FILE, from) < 0) + return false; + if (vshCommandOptString(ctl, cmd, "xml", &xmlfile) < 0) return false; =20 if (xmlfile && virFileReadAll(xmlfile, VSH_MAX_XML_FILE, &xml) < 0) return false; + if (xml && + virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_DXML, xml) < 0) + return false; + + if (flags & VIR_DOMAIN_SAVE_PARALLEL) { + if ((rc =3D vshCommandOptInt(ctl, cmd, "parallel-channels", &nchan= nels)) < 0) + return false; + + if (virTypedParamsAddInt(¶ms, &nparams, &maxparams, + VIR_DOMAIN_SAVE_PARAM_PARALLEL_CHANNELS, = nchannels) < 0) + return false; + } =20 if (flags || xml) { - rc =3D virDomainRestoreFlags(priv->conn, from, xml, flags); + rc =3D virDomainRestoreParams(priv->conn, params, nparams, flags); } else { rc =3D virDomainRestore(priv->conn, from); } --=20 2.43.0