From nobody Wed Mar 12 17:19:33 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