From nobody Mon Mar 23 23:24:09 2026 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=1773853550; cv=none; d=zohomail.com; s=zohoarc; b=SIr/I9y3QiaA+mO0y+ctE8pOjun0J8TI+so17s9OxGGzAV7cnt1i7JbeTc183EmAGkTedi9QzrdmjfM2xEVRqHLpfxP/8hDvAzsooKCEmpo1QPFU0SxOpGZFRXRdmGXs7GMGTsUS2calIf8SUoTJue2unmUkaq2FvIfMR2jfLCI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853550; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=fYCQBkdk+Y7fuSfQizOH+TO3q5DCWNqhz/JMfBHdJQU=; b=MUJZ404mdyWhyzF3Bbdim+iRDa1rEalGzWdl4Idjy8JqYVQSrB3aqpwaYh6Z1XrdbCysuM9rLOKXXfP8gh6qS8c8R436VpQUz6V2mmY1n3YuEWYJadKazmPWrfyod5BSPy6fCuCkAeL3KpkI5N12rc+XYk9/kMCRrZM+uGnqX3Q= 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 1773853550699276.69137989021044; Wed, 18 Mar 2026 10:05:50 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 820504196A; Wed, 18 Mar 2026 13:05:49 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 2137C41A99; Wed, 18 Mar 2026 13:05:05 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B483C3F8A8; Wed, 18 Mar 2026 13:05:01 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 408443F31F for ; Wed, 18 Mar 2026 13:05:01 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-382-I0qkOPflN1iY1pXypN8Jhw-1; Wed, 18 Mar 2026 13:04:59 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id BFEE6195607B for ; Wed, 18 Mar 2026 17:04:58 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 04E3D30002C3 for ; Wed, 18 Mar 2026 17:04:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,PDS_OTHER_BAD_TLD, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853500; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fYCQBkdk+Y7fuSfQizOH+TO3q5DCWNqhz/JMfBHdJQU=; b=M82+mYUNLDs5FIcE3QoMIYyiMhCI+EW1zOUlknMEAZlvKzntFOBz1ranBsE9EVOgfgABlu 449i83Jdwl1Qu49T9piMrfCOqubD5YRg16QNK1mwvV0DWxV/U29PhmeDih3P/iYU3/W4nC IFyIsv60OcYjghsB4DK6pjqYDHJiIFE= X-MC-Unique: I0qkOPflN1iY1pXypN8Jhw-1 X-Mimecast-MFC-AGG-ID: I0qkOPflN1iY1pXypN8Jhw_1773853498 To: devel@lists.libvirt.org Subject: [PATCH 1/7] qemuMigrationSrcPerformTunnel: Remove 'migrate_disks' argument Date: Wed, 18 Mar 2026 18:04:49 +0100 Message-ID: <6a900d173861eaa8ea8d9d34dca0d2dafa705c95.1773853407.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: js_2-grO8POOwFVm2l673i984TgMbs8oMTFH8FRWexI_1773853498 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 4LRLSE5NZUSO7NQTZW5XKAHJ64OSERMF X-Message-ID-Hash: 4LRLSE5NZUSO7NQTZW5XKAHJ64OSERMF X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853558132154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Any QEMU we support requires use of NBD for disk migration which is not supported on tunnelled migration. This is validated in 'qemuMigrationSrcBeginPhase'. Passing the list of disks to migrate is thus pointless. Remove the argument. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_migration.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fec808ccfb..4d136e259b 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -5428,7 +5428,6 @@ qemuMigrationSrcPerformTunnel(virQEMUDriver *driver, unsigned long bandwidth, virConnectPtr dconn, const char *graphicsuri, - const char **migrate_disks, qemuMigrationParams *migParams) { int ret =3D -1; @@ -5437,10 +5436,10 @@ qemuMigrationSrcPerformTunnel(virQEMUDriver *driver, VIR_DEBUG("driver=3D%p, vm=3D%p, st=3D%p, cookiein=3D%s, cookieinlen= =3D%d, " "cookieout=3D%p, cookieoutlen=3D%p, flags=3D0x%x, bandwidth= =3D%lu, " - "graphicsuri=3D%s, migrate_disks=3D%p", + "graphicsuri=3D%s", driver, vm, st, NULLSTR(cookiein), cookieinlen, cookieout, cookieoutlen, flags, bandwidth, - NULLSTR(graphicsuri), migrate_disks); + NULLSTR(graphicsuri)); spec.fwdType =3D MIGRATION_FWD_STREAM; spec.fwd.stream =3D st; @@ -5464,11 +5463,11 @@ qemuMigrationSrcPerformTunnel(virQEMUDriver *driver, goto cleanup; } - /* Migration with NBD is not supported with _TUNNELLED, thus - * 'migrate_disks_detect_zeroes' is NULL here */ + /* Migration with NBD is not supported with _TUNNELLED, thus all corre= sponding + * parameters are NULL here */ ret =3D qemuMigrationSrcRun(driver, vm, persist_xml, cookiein, cookiei= nlen, cookieout, cookieoutlen, flags, bandwidth, &= spec, - dconn, graphicsuri, migrate_disks, NULL, + dconn, graphicsuri, NULL, NULL, migParams, NULL); cleanup: @@ -5610,7 +5609,7 @@ qemuMigrationSrcPerformPeer2Peer2(virQEMUDriver *driv= er, ret =3D qemuMigrationSrcPerformTunnel(driver, vm, st, NULL, NULL, 0, NULL, NULL, flags, bandwidth, dconn, - NULL, NULL, migParams); + NULL, migParams); else ret =3D qemuMigrationSrcPerformNative(driver, vm, NULL, uri_out, cookie, cookielen, @@ -5886,7 +5885,6 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driv= er, cookiein, cookieinlen, &cookieout, &cookieoutlen, flags, bandwidth, dconn, g= raphicsuri, - migrate_disks, migParams); } else { ret =3D qemuMigrationSrcPerformNative(driver, vm, persist_xml,= uri, --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853651; cv=none; d=zohomail.com; s=zohoarc; b=QQSn4yV+/aDN5vude4beq4D62eeBBI8QEWF2/y9EPeL+3q5vtEe1g21O2yn+TxAmwxDs6080VB4wLxVXIHVcG7XFmgVc1+O/DUUjWVoZd5eP24sF7hrb52tXwWolMiBNp8pWiqAMX7KDtT6/J3IBAzzsDqabwkK4ZFI9f6/Hid0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853651; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=S76/cVOCviR6Fdv//9hrer9SRtgDfSZTnaxHVgVfSZg=; b=RsMee5wE6aQ+P0VnbFrAwYyQrGley8nIMiEHE0BCPAm41jbpMrgiyfauYgtk524aF6el3zFDTr44AHCTzSNHR5dmshWmSE3eMPo9l1P9BfoATcjf+XeUfNYfYtZVfxCyY2FZfCsM5OlYomU0rr0QDFbAIkPj9KjZHr4UZR3c/DA= 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 1773853651461748.0664706084098; Wed, 18 Mar 2026 10:07:31 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8968741B6C; Wed, 18 Mar 2026 13:07:30 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 790D341BAE; Wed, 18 Mar 2026 13:05:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EEA1D3F31F; Wed, 18 Mar 2026 13:05:02 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 71B8D3F328 for ; Wed, 18 Mar 2026 13:05:02 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-99-juYxlY98PkCft7OA5NXdLA-1; Wed, 18 Mar 2026 13:05:00 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D857B1956048 for ; Wed, 18 Mar 2026 17:04:59 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 3334730002C3 for ; Wed, 18 Mar 2026 17:04:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853502; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S76/cVOCviR6Fdv//9hrer9SRtgDfSZTnaxHVgVfSZg=; b=Gk5msUQMp0V9xgQ3YL1jAm1kaQ1hrMIYFeKZxdbgOdOKp7y4KL3LiMAlqfvO3ij3zfXbuG hoICE+ZrDSc61lghcAHaLwmWHBXgd1woqoYh0jv6RkP8WLiysPE8CMoHfw3ENWuocfYd5D SsCKb90noY8vxTjilIhJa9nmMRoako8= X-MC-Unique: juYxlY98PkCft7OA5NXdLA-1 X-Mimecast-MFC-AGG-ID: juYxlY98PkCft7OA5NXdLA_1773853500 To: devel@lists.libvirt.org Subject: [PATCH 2/7] qemu: capabilities: Introduce QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO Date: Wed, 18 Mar 2026 18:04:50 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: US2ouPu_qXPhe6dbqaSNrMkkWNp-biEpFOR21o8Ne7I_1773853500 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SX4QCOINJ3AUFA7LOOY6HVNCRZRAXOZ5 X-Message-ID-Hash: SX4QCOINJ3AUFA7LOOY6HVNCRZRAXOZ5 X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853652875158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The 'target-is-zero' option of 'blockdev-mirror' allows telling qemu to skip zeroing the mirror target if the user certifies that it's empty. It was introduced in qemu-10.1. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml | 1 + tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml | 1 + 10 files changed, 15 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 65d8aac4fb..2911982678 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -764,6 +764,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "uefi-vars", /* QEMU_CAPS_DEVICE_UEFI_VARS */ "query-block-flat", /* QEMU_CAPS_QUERY_BLOCK_FLAT */ "amd-iommu.xtsup", /* QEMU_CAPS_AMD_IOMMU_XTSUP */ + + /* 495 */ + "blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRR= OR_TARGET_IS_ZERO */ ); @@ -1648,6 +1651,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSc= hemaQueries[] =3D { { "blockdev-add/arg-type/+nbd/tls-hostname", QEMU_CAPS_BLOCKDEV_NBD_TL= S_HOSTNAME }, { "blockdev-add/arg-type/+qcow2/discard-no-unref", QEMU_CAPS_QCOW2_DIS= CARD_NO_UNREF }, { "blockdev-add/arg-type/+virtio-blk-vhost-vdpa/$fdset", QEMU_CAPS_DEV= ICE_VIRTIO_BLK_VHOST_VDPA}, + { "blockdev-mirror/arg-type/target-is-zero", QEMU_CAPS_BLOCKDEV_MIRROR= _TARGET_IS_ZERO }, { "calc-dirty-rate/arg-type/mode", QEMU_CAPS_DIRTYRATE_MODE }, { "chardev-add/arg-type/backend/+socket/data/reconnect-ms", QEMU_CAPS_= CHARDEV_RECONNECT_MILISECONDS }, { "chardev-add/arg-type/backend/+qemu-vdagent", QEMU_CAPS_CHARDEV_QEMU= _VDAGENT }, diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index b93d1532ff..c26e06104d 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -739,6 +739,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_QUERY_BLOCK_FLAT, /* 'query-block' command supports 'flat' */ QEMU_CAPS_AMD_IOMMU_XTSUP, /* amd-iommu.xtsup */ + /* 495 */ + QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' support= s 'target-is-zero' */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml b/tests/qemuc= apabilitiesdata/caps_10.1.0_s390x.xml index f33b366db8..584a1b304c 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml @@ -143,6 +143,7 @@ + 10001000 39100286 v10.1.0 diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml b/t= ests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml index 05de206987..6dd00c360f 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml @@ -196,6 +196,7 @@ + 10001000 43100286 v10.1.0 diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml b/tests/qemu= capabilitiesdata/caps_10.1.0_x86_64.xml index 5a2bc0d66f..e7a0818697 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml @@ -218,6 +218,7 @@ + 10001000 43100286 v10.1.0 diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_10.2.0_aarch64.xml index ac8f50b984..df3e2a8275 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml @@ -185,6 +185,7 @@ + 10002000 61700287 v10.2.0 diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml b/tests= /qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml index 05a28f6ddc..54018639ad 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml @@ -206,6 +206,7 @@ + 10002000 43100287 v10.2.0 diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemu= capabilitiesdata/caps_10.2.0_x86_64.xml index 29ca620345..d5cc279e13 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml @@ -219,6 +219,7 @@ + 10002000 43100287 v10.2.0 diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_11.0.0_aarch64.xml index bca13980ce..28cd421f12 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml @@ -187,6 +187,7 @@ + 10002050 61700286 v10.2.0-2062-g084a6c6e73 diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml b/tests/qemu= capabilitiesdata/caps_11.0.0_x86_64.xml index 2e20a6f3b2..d8c39368d2 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml @@ -221,6 +221,7 @@ + 10002050 43100286 v10.2.0-2062-g084a6c6e73 --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853700; cv=none; d=zohomail.com; s=zohoarc; b=RIk2Oa2+Z0jNGPIJBNHAKalfKj+0uqgLyJU8CWaylOV0LuLlIy7ljdZyOCMJGFCzAQwKhBQDLAO0nb3J15O65xWgcTD3keCf7k0fKi7STtwfPBKaJ4xkkK7kHebsogOoXhZNfUPRdCYWDy6opO4j2uoMuOYXFtIB+fSAhmdEt3E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853700; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=/QUgbfYzLYn9A3PttJfeJYAFG3FxF++bYV0kfTtZgCg=; b=iwEdZxJbzb9wnCj2Wrcgtj+9JRbRZ8Hc/zZVMtp33PVNKde0GeICbOkm3Nx3d4cpIqfDv7VDSGM9KaLH+QAraIh03BU8fCvtU51JMk9H+KhuQLtVDb7VSJqoX5D1NMDVYIz3n/hTCrv6XugFagi2I3/vDOp9wbXsU7KDMd96ByA= 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 1773853700818100.57777398101632; Wed, 18 Mar 2026 10:08:20 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E754F3F831; Wed, 18 Mar 2026 13:08:19 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 28F2641BA9; Wed, 18 Mar 2026 13:05:10 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id CE62F3F31F; Wed, 18 Mar 2026 13:05:03 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 5A79C3F328 for ; Wed, 18 Mar 2026 13:05:03 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-540-_6yo5daPPlavZfzHbNjLDA-1; Wed, 18 Mar 2026 13:05:01 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id ED3811800281 for ; Wed, 18 Mar 2026 17:05:00 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 4858A30001A1 for ; Wed, 18 Mar 2026 17:05:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853503; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/QUgbfYzLYn9A3PttJfeJYAFG3FxF++bYV0kfTtZgCg=; b=dfiaew0QNFEXfm2F9eiCRcc6kTbUqaTyWbDPaPi7j/C2RqmWVc0sLLkq/qDQf1LZVu1sXG URWKI1NNag2zVZEB5RqRumrNlztyq7GYuV1zOS04Gj9Kvzl/gOvn90788xtFHBl/+HY2Os 60ePzd2OXGLJSI3LhznRfUjGFy4EXeI= X-MC-Unique: _6yo5daPPlavZfzHbNjLDA-1 X-Mimecast-MFC-AGG-ID: _6yo5daPPlavZfzHbNjLDA_1773853501 To: devel@lists.libvirt.org Subject: [PATCH 3/7] qemu: monitor: Add support for 'target-is-zero' option of 'blockdev-mirror' Date: Wed, 18 Mar 2026 18:04:51 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: B-ClZVwp0KiDM9RvMsTYy3-vMlwBrrNG0tAP7rgEsEw_1773853501 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: XU36MGBCENVLZLXH6Q7WGOSZQZQZBACC X-Message-ID-Hash: XU36MGBCENVLZLXH6Q7WGOSZQZQZBACC X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853703058158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_monitor.c | 9 +++++---- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 4 +++- src/qemu/qemu_monitor_json.h | 3 ++- tests/qemumonitorjsontest.c | 2 +- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8b148b33b4..0ba40e0665 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14535,7 +14535,7 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, qemuBlockStorageSourceGetEffectiveNode= name(disk->src), bandwidth, granularity, buf_size, mirror_shallow, - syncWrites); + syncWrites, false); virDomainAuditDisk(vm, NULL, mirror, "mirror", ret >=3D 0); qemuDomainObjExitMonitor(vm); diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4d136e259b..bb62b1d48c 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1173,7 +1173,7 @@ qemuMigrationSrcNBDStorageCopyBlockdev(virDomainObj *= vm, qemuBlockStorageSourceGetEffec= tiveNodename(copysrc), NULL, mirror_speed, 0, 0, mirror_sha= llow, - syncWrites); + syncWrites, false); if (mon_ret !=3D 0) qemuBlockStorageSourceAttachRollback(qemuDomainGetMonitor(vm), dat= a); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index b94aaf741b..ef83e7b69a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2845,18 +2845,19 @@ qemuMonitorBlockdevMirror(qemuMonitor *mon, unsigned int granularity, unsigned long long buf_size, bool shallow, - bool syncWrite) + bool syncWrite, + bool targetIsZero) { VIR_DEBUG("jobname=3D%s, persistjob=3D%d, device=3D%s, target=3D%s, re= places=3D%s, bandwidth=3D%lld, " - "granularity=3D%#x, buf_size=3D%lld, shallow=3D%d syncWrite= =3D%d", + "granularity=3D%#x, buf_size=3D%lld, shallow=3D%d syncWrite= =3D%d targetIsZero=3D%d", NULLSTR(jobname), persistjob, device, target, NULLSTR(replac= es), - bandwidth, granularity, buf_size, shallow, syncWrite); + bandwidth, granularity, buf_size, shallow, syncWrite, target= IsZero); QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockdevMirror(mon, jobname, persistjob, device,= target, replaces, bandwidth, granularity, buf_size,= shallow, - syncWrite); + syncWrite, targetIsZero); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index d3611d9713..dfa25fc7ba 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1245,7 +1245,8 @@ qemuMonitorBlockdevMirror(qemuMonitor *mon, unsigned int granularity, unsigned long long buf_size, bool shallow, - bool syncWrite) + bool syncWrite, + bool targetIsZero) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5); int diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index f9b0470ed4..532bb885a3 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4301,7 +4301,8 @@ qemuMonitorJSONBlockdevMirror(qemuMonitor *mon, unsigned int granularity, unsigned long long buf_size, bool shallow, - bool syncWrite) + bool syncWrite, + bool targetIsZero) { g_autoptr(virJSONValue) cmd =3D NULL; g_autoptr(virJSONValue) reply =3D NULL; @@ -4333,6 +4334,7 @@ qemuMonitorJSONBlockdevMirror(qemuMonitor *mon, "S:copy-mode", copymode, "T:auto-finalize", autofinalize, "T:auto-dismiss", autodismiss, + "B:target-is-zero", targetIsZero, NULL); if (!cmd) return -1; diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index cf9e341fe3..5034c8d23d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -273,7 +273,8 @@ qemuMonitorJSONBlockdevMirror(qemuMonitor *mon, unsigned int granularity, unsigned long long buf_size, bool shallow, - bool syncWrite) + bool syncWrite, + bool targetIsZero) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5); int diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 8911895c7e..e34dbad7cd 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1107,7 +1107,7 @@ GEN_TEST_FUNC(qemuMonitorJSONGraphicsRelocate, VIR_DO= MAIN_GRAPHICS_TYPE_SPICE, "localhost", 12345, 12346, "certsubjectval") GEN_TEST_FUNC(qemuMonitorJSONRemoveNetdev, "net0") GEN_TEST_FUNC(qemuMonitorJSONDelDevice, "ide0") -GEN_TEST_FUNC(qemuMonitorJSONBlockdevMirror, "jobname", true, "vdb", "targ= etnode", "replacenode", 1024, 1234, 31234, true, true) +GEN_TEST_FUNC(qemuMonitorJSONBlockdevMirror, "jobname", true, "vdb", "targ= etnode", "replacenode", 1024, 1234, 31234, true, true, true) GEN_TEST_FUNC(qemuMonitorJSONBlockStream, "vdb", "jobname", "backingnode",= "backingfilename", 1024) GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "jobname", "topnode", "ba= senode", "backingfilename", 1024, VIR_TRISTATE_BOOL_YES) GEN_TEST_FUNC(qemuMonitorJSONScreendump, "devicename", 1, NULL, "/foo/bar") --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853749; cv=none; d=zohomail.com; s=zohoarc; b=EIS9iVPmjniEPhHZaG0mWT+sL4i5lm5qb7AAkAhntKyjuYFFGLPK+TaFzz2qQiXKxmDUJ3G3OfgR8rGi+FBDuTj1CFT7X//uzaxXaVnZ4U+gf0leoBToGEdpQlElEcEbtK+PR1t5RMEdzntDiSPcP1ZQGba9DlCi7DkKldJ4g/U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853749; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=VGnbH5EzGgY5MBox9KieeE69ZbHW0+N0yOFEiGE41/c=; b=VAPELRBG/aVeig6gGnFXrpjsUyfbcxUEJCofpHe5S5FglE7w9l7hEiQSc2zLK67twW79gJrpSGyFltmqyEVBUpKFUHhDZVo2EiZRwAIVZJvZjZ4+51i3JKALLgFKRWPS4Lb3f3b29KVo7T20irTkq2WQ4RvOvQl938r/BOQuoVI= 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 1773853749799154.60889917035763; Wed, 18 Mar 2026 10:09:09 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 973FE41AF4; Wed, 18 Mar 2026 13:09:08 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 1DBD341CC4; Wed, 18 Mar 2026 13:05:17 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C5E9C41908; Wed, 18 Mar 2026 13:05:13 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 98A2C41908 for ; Wed, 18 Mar 2026 13:05:04 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-478-5IDYx_upPV65ANCqmPAnHg-1; Wed, 18 Mar 2026 13:05:03 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 3A7A918005BB for ; Wed, 18 Mar 2026 17:05:02 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6BBC330001A1 for ; Wed, 18 Mar 2026 17:05:01 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853504; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VGnbH5EzGgY5MBox9KieeE69ZbHW0+N0yOFEiGE41/c=; b=QbJwNNAWwQJ7dC+CqdNeMw5clhS+gEXu98YHmSKdHDZBKvmqL3/IH18LIcM6kdMo0zzn4v ZleJNZW3MdcOfUSnOtvNOhwfFFlUJ7grfzyUSC6JjENyRDVcoRF2pzui8beG1hAjj1O+9m zcoCDPShWi8I1wDF3U56mNIERRTqxhM= X-MC-Unique: 5IDYx_upPV65ANCqmPAnHg-1 X-Mimecast-MFC-AGG-ID: 5IDYx_upPV65ANCqmPAnHg_1773853502 To: devel@lists.libvirt.org Subject: [PATCH 4/7] qemu: Add VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED flag for virDomainBlockCopy Date: Wed, 18 Mar 2026 18:04:52 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: ubHrt8QcgYfO7-Ow6ZnJRvJu1TIRDe0fp6QqP23XNzw_1773853502 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: H2JKZQJBISXTQJSRK2WMQEJNQQFACCKA X-Message-ID-Hash: H2JKZQJBISXTQJSRK2WMQEJNQQFACCKA X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853751394158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Allow the hypervisor to assume that the user already passed a zeroed-out image to optimize the copy. Implement the feature for the qemu driver. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- include/libvirt/libvirt-domain.h | 7 +++++++ src/libvirt-domain.c | 4 ++++ src/qemu/qemu_driver.c | 16 +++++++++++++--- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index ccc2c87ea8..a0e0b84eb9 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -5004,6 +5004,13 @@ typedef enum { * Since: 8.0.0 */ VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES =3D 1 << 3, + + /* Destination of the copy is zeroed (any read returns only 0x00 bytes= ) so + * the hypervisor may optimize out clearing of the target image. + * + * Since: 12.2.0 */ + VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED =3D 1 << 4, + } virDomainBlockCopyFlags; /** diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 6b8783d57f..e1571cbda7 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -11261,6 +11261,10 @@ virDomainBlockRebase(virDomainPtr dom, const char = *disk, * the destination storage is slower. This may impact performance of writes * while the blockjob is running. * + * If @flags contains VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED the hypervisor m= ay + * assume that the target image was already zeroed out (any read will retu= rn + * 0x00 bytes) and thus may skip this step. + * * The @disk parameter is either an unambiguous source name of the * block device (the sub-element, such as * "/path/to/image"), or the device target shorthand (the diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 0ba40e0665..42d0f46405 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14285,13 +14285,15 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, virStorageSource *mirrorBacking =3D NULL; g_autoptr(GHashTable) blockNamedNodeData =3D NULL; bool syncWrites =3D !!(flags & VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITE= S); + bool targetIsZero =3D !!(flags & VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED); int rc =3D 0; /* Preliminaries: find the disk we are editing, sanity checks */ virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW | VIR_DOMAIN_BLOCK_COPY_REUSE_EXT | VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB | - VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES, -1); + VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES | + VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED, -1); if (virStorageSourceIsRelative(mirror)) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -14327,6 +14329,13 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, goto endjob; } + if (targetIsZero && + !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_I= S_ZERO)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this qemu doesn't support 'VIR_DOMAIN_BLOCK_COPY= _TARGET_ZEROED'")); + goto endjob; + } + if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_LUN && virDomainDiskDefSourceLUNValidate(mirror) < 0) goto endjob; @@ -14535,7 +14544,7 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, qemuBlockStorageSourceGetEffectiveNode= name(disk->src), bandwidth, granularity, buf_size, mirror_shallow, - syncWrites, false); + syncWrites, targetIsZero); virDomainAuditDisk(vm, NULL, mirror, "mirror", ret >=3D 0); qemuDomainObjExitMonitor(vm); @@ -14670,7 +14679,8 @@ qemuDomainBlockCopy(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW | VIR_DOMAIN_BLOCK_COPY_REUSE_EXT | VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB | - VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES, -1); + VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES | + VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED, -1); if (virTypedParamsValidate(params, nparams, VIR_DOMAIN_BLOCK_COPY_BANDWIDTH, --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853786; cv=none; d=zohomail.com; s=zohoarc; b=TflFBJ6zXthOCcHYY8dSESNAtD/z4+s9gsOdCiWO0+2K2zSGjkfE6mXC48Fy+IFZhvne0lbAZ3CSbyFfMjGGVOjnMrKDvYl0h/YFMidm8hSVLTcyJoey5fYr1eAmRUPaiKWe9KyelCQYioCmWJXrCoJf2y4/ReGRhZ3ohetMqdM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853786; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=0gR8Da1+7hI7/nBQ5+gnhp3c5a6/kvW4F2WDonMTwcM=; b=jmtRKAtD54ufPf6snbIEhvqZ1gs99dqi2VsvNJrimd0dIUTZWJ4Kdx3Z8YnwJ3DW24uG80Gxv7iwnNs+iC+NH3jS8I/sbAgvzLUOTwtTR2u/EE3HAFNUKB98IbIqe/HZrSeAxlX1vC4G5+GyQnB3T19vns5iQ4vXJz9WGCERPGs= 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 1773853786037935.956868734886; Wed, 18 Mar 2026 10:09:46 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9266541AAA; Wed, 18 Mar 2026 13:09:45 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id B2D8C41B4D; Wed, 18 Mar 2026 13:06:42 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D0FAD41ADD; Wed, 18 Mar 2026 13:06:38 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id C49A841AF9 for ; Wed, 18 Mar 2026 13:05:06 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-357-Lyv6PLhVPNOXlKbJ2X2VmQ-1; Wed, 18 Mar 2026 13:05:04 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id DAD1A1955EA1 for ; Wed, 18 Mar 2026 17:05:03 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2795B30001A1 for ; Wed, 18 Mar 2026 17:05:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853506; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0gR8Da1+7hI7/nBQ5+gnhp3c5a6/kvW4F2WDonMTwcM=; b=a2wFbbTzwd8aTj9ydz0fqCKoLmaRi4kQs7i7oDTdAyDT7w7SUaJ0F0yi0sp8xOLdTs15iH mjadm3GvFcJikrImYih8fhsyXQRDw2LXOTKDqbCdKDlYjL7cU6O/qnqR9yzMLcwCOCf0me yl2wpv5HbJxICOIkqceIzO0BFqby30M= X-MC-Unique: Lyv6PLhVPNOXlKbJ2X2VmQ-1 X-Mimecast-MFC-AGG-ID: Lyv6PLhVPNOXlKbJ2X2VmQ_1773853504 To: devel@lists.libvirt.org Subject: [PATCH 5/7] virsh: Add support for 'VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED' as '--dest-is-zero' Date: Wed, 18 Mar 2026 18:04:53 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 2ppVEC1d_whZWKcITh3rwj9_RzyTOEI0jZX0GUDhnn0_1773853504 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QWK3HVFUQKCTMOKYGEM2RBAI5LZVOGGP X-Message-ID-Hash: QWK3HVFUQKCTMOKYGEM2RBAI5LZVOGGP X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853787051154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Add the aforementioned flag for 'virsh blockcopy'. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- docs/manpages/virsh.rst | 6 +++++- tools/virsh-domain.c | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 591c47a7ce..da9e9f8658 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -1472,7 +1472,7 @@ blockcopy [--shallow] [--reuse-external] [bandwidth] [--wait [--async] [--verbose]] [{--pivot | --finish}] [--timeout seconds] [granularity] [buf-size] [--bytes] - [--transient-job] [--synchronous-writes] [--print-xml] + [--transient-job] [--synchronous-writes] [--dest-is-zero] [--print-x= ml] Copy a disk backing image chain to a destination. Either *dest* as the destination file name, or *--xml* with the name of an XML file contain= ing @@ -1537,6 +1537,10 @@ to be propagated both to the original image and to t= he destination of the copy so that it's guaranteed that the job converges if the destination storage = is slower. This may impact performance of writes while the blockjob is runnin= g. +If *--dest-is-zero* is specified the hypervisor may assume that the target +image was already cleared (any offset reads 0x00 bytes) and thus may skip +clearing it. + If *--print-xml* is specified, then the XML used to start the block copy j= ob is printed instead of starting the job. diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 5a2ae75379..1af7f9eb0e 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -2714,6 +2714,10 @@ static const vshCmdOptDef opts_blockcopy[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("print the XML used to start the copy job instead of sta= rting the job") }, + {.name =3D "dest-is-zero", + .type =3D VSH_OT_BOOL, + .help =3D N_("the destination image is already zeroed; hypervisor may= skip pre-zeroing") + }, {.name =3D NULL} }; @@ -2737,6 +2741,7 @@ cmdBlockcopy(vshControl *ctl, const vshCmd *cmd) bool bytes =3D vshCommandOptBool(cmd, "bytes"); bool transientjob =3D vshCommandOptBool(cmd, "transient-job"); bool syncWrites =3D vshCommandOptBool(cmd, "synchronous-writes"); + bool destIsZero =3D vshCommandOptBool(cmd, "dest-is-zero"); int timeout =3D 0; const char *path =3D NULL; int abort_flags =3D 0; @@ -2773,6 +2778,8 @@ cmdBlockcopy(vshControl *ctl, const vshCmd *cmd) flags |=3D VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES; if (vshCommandOptTimeoutToMs(ctl, cmd, &timeout) < 0) return false; + if (destIsZero) + flags |=3D VIR_DOMAIN_BLOCK_COPY_TARGET_ZEROED; if (timeout) blocking =3D true; @@ -2818,7 +2825,7 @@ cmdBlockcopy(vshControl *ctl, const vshCmd *cmd) } if (granularity || buf_size || (format && STRNEQ(format, "raw")) || xm= l || - transientjob || syncWrites || print_xml) { + transientjob || syncWrites || destIsZero || print_xml) { /* New API */ if (bandwidth || granularity || buf_size) { params =3D g_new0(virTypedParameter, 3); --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853868; cv=none; d=zohomail.com; s=zohoarc; b=CiUyJpqU4tvpUXHxb2fGPTd9M7i/nfOjB3oZswQRfx+0/sieWlInqZgJnkEfKraBrcBeu4wZ0VgYj5FtcRGXyCrs1E4G+APIfBb96cdLlKMDdDgJZao8ae+tHkoyDUkdzNLaq1/39kfrqz4Uuvrn4XgN7nqs/KJC27etyXtE1z0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853868; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=6aplR/JgpUHzMaRYIkjCyRRwtD30QGRjpoy3eJ+ATkE=; b=YAWNJLzdjEeoAOoBFzUEdBMr7lcxfKmq2HOtfm7SALo/3EyTFcuBwXr1WzItNOPp3U+2Tp0COsOkABkO5oe/9a0p1dDpsdPqkwS8nyRh9XKK5GkeTsLUxaSnG9yyzmqbzr3xZuvuAQYnM2zEY3v0r/Jq3WELcL6AByAwGQa712Y= 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 1773853868430636.1453437436918; Wed, 18 Mar 2026 10:11:08 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id BD5C641AC1; Wed, 18 Mar 2026 13:11:07 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 30AAF41BB7; Wed, 18 Mar 2026 13:07:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 3358641AF4; Wed, 18 Mar 2026 13:07:35 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id CE3EF41BB7 for ; Wed, 18 Mar 2026 13:05:08 -0400 (EDT) Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-628-4C17b69ANOiOpt-3_MDFag-1; Wed, 18 Mar 2026 13:05:06 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id DC126195608C for ; Wed, 18 Mar 2026 17:05:05 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CC92730002C3 for ; Wed, 18 Mar 2026 17:05:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853508; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6aplR/JgpUHzMaRYIkjCyRRwtD30QGRjpoy3eJ+ATkE=; b=cMq+utYkrNl9x0NP3/gPdl5Av0EsbVYlQiOOZwqfNwfll94DrzKF0tvbHgaDCfRc/iZBL7 K5t4k304bYqUkCSrJ78zA1a7wj9mrDaa1SHDOQOHZ2n0wS/on5a2/M6jXhJfA9NRzxsMdi Nj63nLWOG9nhRbf0by+1eOtMDTA0iqs= X-MC-Unique: 4C17b69ANOiOpt-3_MDFag-1 X-Mimecast-MFC-AGG-ID: 4C17b69ANOiOpt-3_MDFag_1773853506 To: devel@lists.libvirt.org Subject: [PATCH 6/7] qemu: migration: Introduce 'VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO' Date: Wed, 18 Mar 2026 18:04:54 +0100 Message-ID: <9621061309229f699cb682a38135e66a4198a206.1773853407.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 4weNp5kUe0M3vQOUg2SpiNkUfJCPfS25MKKlLaWVrkc_1773853506 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: DRJEXMSWPLUZTIQQHQGIJE5PEFPCD6R5 X-Message-ID-Hash: DRJEXMSWPLUZTIQQHQGIJE5PEFPCD6R5 X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853870427154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The migration parameter allows enumerating disks selected for migration where the hypervisor may assume that the user pre-cleared the destination images of the block copy so that all offsets read 0x00 and thus optimize clearing of such targets. This patch adds the 'VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO' parameter and also plumbs it for the qemu driver (mirrors plumbing for 'migrate_disks_detect_zeroes'). Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- include/libvirt/libvirt-domain.h | 12 ++++ src/qemu/qemu_driver.c | 22 +++++-- src/qemu/qemu_migration.c | 106 ++++++++++++++++++++++++------- src/qemu/qemu_migration.h | 4 ++ 4 files changed, 117 insertions(+), 27 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index a0e0b84eb9..09a797cab6 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1285,6 +1285,18 @@ typedef enum { */ # define VIR_MIGRATE_PARAM_MIGRATE_DISKS_DETECT_ZEROES "migrate_disks_d= etect_zeroes" +/** + * VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO: + * + * virDomainMigrate* params multiple field: The multiple values that list + * the block devices for which the hypervisor is allowed to assume that the + * destination image was zeroed out and thus may skip zeroing it beforehan= d. + * At the moment this is only supported by the QEMU driver. + * + * Since: 12.2.0 + */ +# define VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO "migrate_disks_target= _zero" + /** * VIR_MIGRATE_PARAM_DISKS_PORT: * diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 42d0f46405..6d333275b1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10913,7 +10913,7 @@ qemuDomainMigratePerform(virDomainPtr dom, * Consume any cookie we were able to decode though */ ret =3D qemuMigrationSrcPerform(driver, dom->conn, vm, NULL, - NULL, dconnuri, uri, NULL, NULL, NULL, N= ULL, 0, + NULL, dconnuri, uri, NULL, NULL, NULL, N= ULL, NULL, 0, NULL, migParams, cookie, cookielen, NULL, NULL, /* No output cookies in v2 */ @@ -10989,7 +10989,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain, } return qemuMigrationSrcBegin(domain->conn, vm, xmlin, dname, - cookieout, cookieoutlen, NULL, NULL, flag= s); + cookieout, cookieoutlen, NULL, NULL, NULL= , flags); } static char * @@ -11004,6 +11004,7 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain, const char *dname =3D NULL; g_autofree const char **migrate_disks =3D NULL; g_autofree const char **migrate_disks_detect_zeroes =3D NULL; + g_autofree const char **migrate_disks_target_zero =3D NULL; virDomainObj *vm; virCheckFlags(QEMU_MIGRATION_FLAGS, NULL); @@ -11025,6 +11026,10 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain, VIR_MIGRATE_PARAM_MIGRATE_DISKS_DETECT_ZER= OES, &migrate_disks_detect_zeroes); + virTypedParamsGetStringList(params, nparams, + VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZER= O, + &migrate_disks_target_zero); + if (!(vm =3D qemuDomainObjFromDomain(domain))) return NULL; @@ -11036,6 +11041,7 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain, return qemuMigrationSrcBegin(domain->conn, vm, xmlin, dname, cookieout, cookieoutlen, migrate_disks, migrate_disks_detect_zeroe= s, + migrate_disks_target_zero, flags); } @@ -11313,7 +11319,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, goto cleanup; ret =3D qemuMigrationSrcPerform(driver, dom->conn, vm, xmlin, NULL, - dconnuri, uri, NULL, NULL, NULL, NULL, 0, + dconnuri, uri, NULL, NULL, NULL, NULL, N= ULL, 0, NULL, migParams, cookiein, cookieinlen, cookieout, cookieoutlen, @@ -11345,6 +11351,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, const char *listenAddress =3D NULL; g_autofree const char **migrate_disks =3D NULL; g_autofree const char **migrate_disks_detect_zeroes =3D NULL; + g_autofree const char **migrate_disks_target_zero =3D NULL; unsigned long long bandwidth =3D 0; int nbdPort =3D 0; g_autoptr(qemuMigrationParams) migParams =3D NULL; @@ -11404,6 +11411,9 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, virTypedParamsGetStringList(params, nparams, VIR_MIGRATE_PARAM_MIGRATE_DISKS_DETECT_ZER= OES, &migrate_disks_detect_zeroes); + virTypedParamsGetStringList(params, nparams, + VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZER= O, + &migrate_disks_target_zero); if (flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC)= || migrate_disks) { @@ -11426,8 +11436,10 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, ret =3D qemuMigrationSrcPerform(driver, dom->conn, vm, dom_xml, persis= t_xml, dconnuri, uri, graphicsuri, listenAddres= s, - migrate_disks, migrate_disks_detect_zero= es, nbdPort, - nbdURI, migParams, + migrate_disks, + migrate_disks_detect_zeroes, + migrate_disks_target_zero, + nbdPort, nbdURI, migParams, cookiein, cookieinlen, cookieout, cookie= outlen, flags, dname, bandwidth, true); cleanup: diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index bb62b1d48c..09985779df 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1140,7 +1140,8 @@ qemuMigrationSrcNBDStorageCopyBlockdev(virDomainObj *= vm, const char *tlsAlias, const char *tlsHostname, bool syncWrites, - bool detect_zeroes) + bool detect_zeroes, + bool target_zeroed) { g_autoptr(qemuBlockStorageSourceAttachData) data =3D NULL; qemuDomainDiskPrivate *diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); @@ -1173,7 +1174,7 @@ qemuMigrationSrcNBDStorageCopyBlockdev(virDomainObj *= vm, qemuBlockStorageSourceGetEffec= tiveNodename(copysrc), NULL, mirror_speed, 0, 0, mirror_sha= llow, - syncWrites, false); + syncWrites, target_zeroed); if (mon_ret !=3D 0) qemuBlockStorageSourceAttachRollback(qemuDomainGetMonitor(vm), dat= a); @@ -1199,6 +1200,7 @@ qemuMigrationSrcNBDStorageCopyOne(virDomainObj *vm, const char *tlsAlias, const char *tlsHostname, bool detect_zeroes, + bool target_zeroed, unsigned int flags) { qemuDomainDiskPrivate *diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); @@ -1224,7 +1226,8 @@ qemuMigrationSrcNBDStorageCopyOne(virDomainObj *vm, tlsAlias, tlsHostname, syncWrites, - detect_zeroes); + detect_zeroes, + target_zeroed); if (rc =3D=3D 0) { diskPriv->migrating =3D true; @@ -1261,6 +1264,7 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriver *driver, unsigned long speed, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, virConnectPtr dconn, const char *tlsAlias, const char *tlsHostname, @@ -1333,6 +1337,7 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriver *driver, for (i =3D 0; i < vm->def->ndisks; i++) { virDomainDiskDef *disk =3D vm->def->disks[i]; bool detect_zeroes =3D false; + bool target_zero =3D false; /* check whether disk should be migrated */ if (!qemuMigrationAnyCopyDisk(disk, migrate_disks)) @@ -1341,11 +1346,14 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriver *drive= r, if (migrate_disks_detect_zeroes) detect_zeroes =3D g_strv_contains(migrate_disks_detect_zeroes,= disk->dst); + if (migrate_disks_target_zero) + target_zero =3D g_strv_contains(migrate_disks_target_zero, dis= k->dst); + if (qemuMigrationSrcNBDStorageCopyOne(vm, disk, host, port, socket, mirror_speed, mirror_shallow, tlsAlias, tlsHostname, detec= t_zeroes, - flags) < 0) + target_zero, flags) < 0) return -1; if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) { @@ -2760,6 +2768,7 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, int *cookieoutlen, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, unsigned int flags) { qemuDomainObjPrivate *priv =3D vm->privateData; @@ -2767,10 +2776,13 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, VIR_DEBUG("driver=3D%p, vm=3D%p, xmlin=3D%s, dname=3D%s," " cookieout=3D%p, cookieoutlen=3D%p," - " migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p, flag= s=3D0x%x", + " migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p," + " migrate_disks_target_zero=3D%p, flags=3D0x%x", driver, vm, NULLSTR(xmlin), NULLSTR(dname), cookieout, cookieoutlen, - migrate_disks, migrate_disks_detect_zeroes, flags); + migrate_disks, migrate_disks_detect_zeroes, + migrate_disks_target_zero, + flags); /* Only set the phase if we are inside VIR_ASYNC_JOB_MIGRATION_OUT. * Otherwise we will start the async job later in the perform phase lo= sing @@ -2841,6 +2853,17 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, qemuMigrationSrcBeginPhaseValidateDiskTargetList(vm, migrate_d= isks_detect_zeroes) < 0) return NULL; + if (migrate_disks_target_zero) { + if (qemuMigrationSrcBeginPhaseValidateDiskTargetList(vm, migra= te_disks_target_zero) < 0) + return NULL; + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_MIRROR_= TARGET_IS_ZERO)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("use of 'VIR_MIGRATE_PARAM_MIGRATE_DISKS_= TARGET_ZERO' is not supported by this QEMU")); + return NULL; + } + } + priv->nbdPort =3D 0; if (qemuMigrationHasAnyStorageMigrationDisks(vm->def, migrate_disk= s)) @@ -2858,6 +2881,11 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, return NULL; } + if (migrate_disks_target_zero) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("use of 'VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARG= ET_ZERO' requires use of 'VIR_MIGRATE_NON_SHARED_DISK' or 'VIR_MIGRATE_NON_= SHARED_INC' flag")); + return NULL; + } } if (virDomainDefHasMemoryHotplug(vm->def) || @@ -3010,6 +3038,7 @@ qemuMigrationSrcBegin(virConnectPtr conn, int *cookieoutlen, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, unsigned int flags) { virQEMUDriver *driver =3D conn->privateData; @@ -3051,6 +3080,7 @@ qemuMigrationSrcBegin(virConnectPtr conn, cookieout, cookieoutlen, migrate_disks, migrate_disks_detect_zeroes, + migrate_disks_target_zero, flags))) goto endjob; @@ -4909,6 +4939,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver, const char *graphicsuri, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, qemuMigrationParams *migParams, const char *nbdURI) { @@ -4934,11 +4965,13 @@ qemuMigrationSrcRun(virQEMUDriver *driver, VIR_DEBUG("driver=3D%p, vm=3D%p, cookiein=3D%s, cookieinlen=3D%d, " "cookieout=3D%p, cookieoutlen=3D%p, flags=3D0x%x, bandwidth= =3D%lu, " "spec=3D%p (dest=3D%d, fwd=3D%d), dconn=3D%p, graphicsuri=3D= %s, " - "migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p", + "migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p" + "migrate_disks_target_zero=3D%p", driver, vm, NULLSTR(cookiein), cookieinlen, cookieout, cookieoutlen, flags, bandwidth, spec, spec->destType, spec->fwdType, dconn, - NULLSTR(graphicsuri), migrate_disks, migrate_disks_detect_ze= roes); + NULLSTR(graphicsuri), migrate_disks, migrate_disks_detect_ze= roes, + migrate_disks_target_zero); if (storageMigration) storageMigration =3D qemuMigrationHasAnyStorageMigrationDisks(vm->= def, @@ -5063,6 +5096,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver, priv->migMaxBandwidth, migrate_disks, migrate_disks_detect_zeroes, + migrate_disks_target_zero, dconn, tlsAlias, tlsHostname, nbdURI, flags) < 0) { goto error; @@ -5331,6 +5365,7 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver, const char *graphicsuri, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, qemuMigrationParams *migParams, const char *nbdURI) { @@ -5340,10 +5375,12 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver, VIR_DEBUG("driver=3D%p, vm=3D%p, uri=3D%s, cookiein=3D%s, cookieinlen= =3D%d, " "cookieout=3D%p, cookieoutlen=3D%p, flags=3D0x%x, bandwidth= =3D%lu, " - "graphicsuri=3D%s, migrate_disks=3D%p, migrate_disks_detect_= zeroes=3D%p", + "graphicsuri=3D%s, migrate_disks=3D%p, migrate_disks_detect_= zeroes=3D%p " + "migrate_disks_target_zero=3D%p", driver, vm, uri, NULLSTR(cookiein), cookieinlen, cookieout, cookieoutlen, flags, bandwidth, - NULLSTR(graphicsuri), migrate_disks, migrate_disks_detect_ze= roes); + NULLSTR(graphicsuri), migrate_disks, migrate_disks_detect_ze= roes, + migrate_disks_target_zero); if (!(uribits =3D qemuMigrationAnyParseURI(uri, NULL))) return -1; @@ -5405,6 +5442,7 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver, cookieout, cookieoutlen, flags, bandwidt= h, &spec, dconn, graphicsuri, migrate_disks, migrate_disks_detect_zero= es, + migrate_disks_target_zero, migParams, nbdURI); } @@ -5467,7 +5505,7 @@ qemuMigrationSrcPerformTunnel(virQEMUDriver *driver, * parameters are NULL here */ ret =3D qemuMigrationSrcRun(driver, vm, persist_xml, cookiein, cookiei= nlen, cookieout, cookieoutlen, flags, bandwidth, &= spec, - dconn, graphicsuri, NULL, NULL, + dconn, graphicsuri, NULL, NULL, NULL, migParams, NULL); cleanup: @@ -5507,7 +5545,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver, ret =3D qemuMigrationSrcPerformNative(driver, vm, NULL, uri, cookiein, cookieinlen, cookieout, cookieoutlen, flags, - 0, NULL, NULL, NULL, NULL, migPara= ms, NULL); + 0, NULL, NULL, NULL, NULL, NULL, m= igParams, NULL); virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed); @@ -5614,7 +5652,7 @@ qemuMigrationSrcPerformPeer2Peer2(virQEMUDriver *driv= er, ret =3D qemuMigrationSrcPerformNative(driver, vm, NULL, uri_out, cookie, cookielen, NULL, NULL, /* No out cookie w= ith v2 migration */ - flags, bandwidth, dconn, NULL,= NULL, + flags, bandwidth, dconn, NULL,= NULL, NULL, NULL, migParams, NULL); /* Perform failed. Make sure Finish doesn't overwrite the error */ @@ -5679,6 +5717,7 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driv= er, const char *listenAddress, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, int nbdPort, const char *nbdURI, qemuMigrationParams *migParams, @@ -5705,11 +5744,13 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *dr= iver, VIR_DEBUG("driver=3D%p, sconn=3D%p, dconn=3D%p, dconnuri=3D%s, vm=3D%p= , xmlin=3D%s, " "dname=3D%s, uri=3D%s, graphicsuri=3D%s, listenAddress=3D%s,= " - "migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p, nbdPo= rt=3D%d, nbdURI=3D%s, " + "migrate_disks=3D%p, migrate_disks_detect_zeroes=3D%p, " + "migrate_disks_target_zero=3D%p, nbdPort=3D%d, nbdURI=3D%s, " "bandwidth=3D%llu, useParams=3D%d, flags=3D0x%x", driver, sconn, dconn, NULLSTR(dconnuri), vm, NULLSTR(xmlin), NULLSTR(dname), NULLSTR(uri), NULLSTR(graphicsuri), - NULLSTR(listenAddress), migrate_disks, migrate_disks_detect_= zeroes, nbdPort, + NULLSTR(listenAddress), migrate_disks, migrate_disks_detect_= zeroes, + migrate_disks_target_zero, nbdPort, NULLSTR(nbdURI), bandwidth, useParams, flags); /* Unlike the virDomainMigrateVersion3 counterpart, we don't need @@ -5725,6 +5766,7 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driv= er, &cookieout, &cookieoutlen, migrate_disks, migrate_disks_detect_zeroes, + migrate_disks_target_zero, flags); } if (!dom_xml) @@ -5779,6 +5821,15 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *dri= ver, *d) < 0) goto cleanup; } + if (migrate_disks_target_zero) { + const char **d; + + for (d =3D migrate_disks_target_zero; *d; d++) + if (virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_MIGRATE_PARAM_MIGRATE_DISK= S_TARGET_ZERO, + *d) < 0) + goto cleanup; + } if (nbdPort && virTypedParamsAddInt(¶ms, &nparams, &maxparams, VIR_MIGRATE_PARAM_DISKS_PORT, @@ -5892,6 +5943,7 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driv= er, &cookieout, &cookieoutlen, flags, bandwidth, dconn, g= raphicsuri, migrate_disks, migrate_dis= ks_detect_zeroes, + migrate_disks_target_zero, migParams, nbdURI); } @@ -6066,6 +6118,7 @@ qemuMigrationSrcPerformPeer2Peer(virQEMUDriver *drive= r, const char *listenAddress, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, int nbdPort, const char *nbdURI, qemuMigrationParams *migParams, @@ -6191,6 +6244,7 @@ qemuMigrationSrcPerformPeer2Peer(virQEMUDriver *drive= r, ret =3D qemuMigrationSrcPerformPeer2Peer3(driver, sconn, dconn, dc= onnuri, vm, xmlin, persist_xml, dname, uri, g= raphicsuri, listenAddress, migrate_dis= ks, migrate_disks_detect_zeroes, + migrate_disks_target_zero, nbdPort, nbdURI, migParams= , bandwidth, !!useParams, flags); } else { @@ -6228,6 +6282,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver, const char *listenAddress, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, int nbdPort, const char *nbdURI, qemuMigrationParams *migParams, @@ -6277,8 +6332,9 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver, if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) { ret =3D qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, = persist_xml, dconnuri, uri, graphicsuri,= listenAddress, - migrate_disks, migrate_disk= s_detect_zeroes, nbdPort, - nbdURI, + migrate_disks, migrate_disk= s_detect_zeroes, + migrate_disks_target_zero, + nbdPort, nbdURI, migParams, flags, dname, ba= ndwidth, &v3proto); } else { @@ -6287,7 +6343,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver, ret =3D qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri= , cookiein, cookieinlen, cookieout, cookieoutlen, - flags, bandwidth, NULL, NULL, = NULL, NULL, + flags, bandwidth, NULL, NULL, = NULL, NULL, NULL, migParams, nbdURI); } if (ret < 0) @@ -6355,6 +6411,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver, const char *graphicsuri, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, qemuMigrationParams *migParams, const char *cookiein, int cookieinlen, @@ -6391,6 +6448,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver, cookieout, cookieoutlen, flags, bandwidth, NULL, graphicsuri, migrate_disks, migrate_disks_detect_= zeroes, + migrate_disks_target_zero, migParams, nbdURI) < 0) goto cleanup; @@ -6434,6 +6492,7 @@ qemuMigrationSrcPerform(virQEMUDriver *driver, const char *listenAddress, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, int nbdPort, const char *nbdURI, qemuMigrationParams *migParams, @@ -6477,8 +6536,9 @@ qemuMigrationSrcPerform(virQEMUDriver *driver, return qemuMigrationSrcPerformJob(driver, conn, vm, xmlin, persist= _xml, dconnuri, uri, graphicsuri, listenAddress, - migrate_disks, migrate_disks_det= ect_zeroes, nbdPort, - nbdURI, migParams, + migrate_disks, migrate_disks_det= ect_zeroes, + migrate_disks_target_zero, + nbdPort, nbdURI, migParams, cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, bandwidth, v3proto= ); @@ -6494,6 +6554,7 @@ qemuMigrationSrcPerform(virQEMUDriver *driver, return qemuMigrationSrcPerformPhase(driver, conn, vm, persist_xml,= uri, graphicsuri, migrate_disks, migrate_disks_d= etect_zeroes, + migrate_disks_target_zero, migParams, cookiein, cookieinlen, cookieout, cookieoutlen, @@ -6502,8 +6563,9 @@ qemuMigrationSrcPerform(virQEMUDriver *driver, return qemuMigrationSrcPerformJob(driver, conn, vm, xmlin, persist_xml= , NULL, uri, graphicsuri, listenAddress, - migrate_disks, migrate_disks_detect_= zeroes, nbdPort, - nbdURI, migParams, + migrate_disks, migrate_disks_detect_= zeroes, + migrate_disks_target_zero, + nbdPort, nbdURI, migParams, cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, bandwidth, v3proto); diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index db03144207..ef6a1563a0 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -76,6 +76,8 @@ VIR_TYPED_PARAM_MULTIPLE, \ VIR_MIGRATE_PARAM_MIGRATE_DISKS_DETECT_ZEROES, VIR_TYPED_PARAM_STRING = | \ VIR_TYPED_PARAM_MULTIPL= E, \ + VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO, VIR_TYPED_PARAM_STRING | \ + VIR_TYPED_PARAM_MULTIPL= E, \ VIR_MIGRATE_PARAM_DISKS_PORT, VIR_TYPED_PARAM_INT, \ VIR_MIGRATE_PARAM_COMPRESSION, VIR_TYPED_PARAM_STRING | \ VIR_TYPED_PARAM_MULTIPLE, \ @@ -127,6 +129,7 @@ qemuMigrationSrcBegin(virConnectPtr conn, int *cookieoutlen, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, unsigned int flags); virDomainDef * @@ -181,6 +184,7 @@ qemuMigrationSrcPerform(virQEMUDriver *driver, const char *listenAddress, const char **migrate_disks, const char **migrate_disks_detect_zeroes, + const char **migrate_disks_target_zero, int nbdPort, const char *nbdURI, qemuMigrationParams *migParams, --=20 2.53.0 From nobody Mon Mar 23 23:24:09 2026 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=1773853930; cv=none; d=zohomail.com; s=zohoarc; b=jTJO8R4fyf9Hyo9dKferWyJ4zr6y1s6ddu6IHUCCwm0EAjPqzjMiZjKgAIlMlsRCH2TBc0gPylkjc1jGYeH0sxumoAx+sOgBcVNyMUDge++reP1Lejm417NkO3EWMcLDmIAl0JvsE5q9wrBvMkZbVJ+FZqYs2QDi4c5Z4zcS9Ww= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773853930; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=h8qRjPSb4XePgmeSEWIv07LWqH8SLi5bqVjtDC012AY=; b=XuAnZOq+6AC54MBtEKtwOqBknhP5Sg4YHkM+g8QgF/a83/6qf2SDYI4i8CIkyxM9tOZcohcWa2mAH7XwkO36h2QzsMAROLBiXiqtosplbT+oyYatbeUnPvXV3vBaTJGcxTUeQwU4v5QTWB2djkPI5QU5r5B0G17LjCjGm7NYw6c= 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 1773853930108384.7352634623287; Wed, 18 Mar 2026 10:12:10 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 4677C418BC; Wed, 18 Mar 2026 13:12:09 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 0BDB64190B; Wed, 18 Mar 2026 13:08:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D85044184B; Wed, 18 Mar 2026 13:08:04 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id EC40E41BFF for ; Wed, 18 Mar 2026 13:05:09 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-365-5slBxySPN0iE7TV9l618mA-1; Wed, 18 Mar 2026 13:05:08 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9134D18002C8 for ; Wed, 18 Mar 2026 17:05:07 +0000 (UTC) Received: from speedmetal.openshiftapps.com (unknown [10.45.242.5]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CB65130001A1 for ; Wed, 18 Mar 2026 17:05:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773853509; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h8qRjPSb4XePgmeSEWIv07LWqH8SLi5bqVjtDC012AY=; b=hOiId72s9bmgPa4727kj3QyIyP2m8MpBN7skHyG74GNSypVAEgdVcRqNa8klZZzuL+l75f fZPXkyQJeEAt8zhz3Ttp1Lwlo1kDY/p2EqoTWmpWnwRekJWtmawGhm4vyfiKOLdazE9NBD H9fteItm5g6ri6KkO3Pdb4JugXCOV6I= X-MC-Unique: 5slBxySPN0iE7TV9l618mA-1 X-Mimecast-MFC-AGG-ID: 5slBxySPN0iE7TV9l618mA_1773853507 To: devel@lists.libvirt.org Subject: [PATCH 7/7] virsh: migrate: Add support for VIR_MIGRATE_PARAM_MIGRATE_DISKS_TARGET_ZERO Date: Wed, 18 Mar 2026 18:04:55 +0100 Message-ID: <5743d638da33b24cb1ea6f30b775482d2c4fbe36.1773853407.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: GXkIdhYIZfhZU9A4n2FOEnH3JMy7r_JPLkaMQuSbrzY_1773853507 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZNDAYSYLHCSWRSKOV56H2NQQ64VVHAPI X-Message-ID-Hash: ZNDAYSYLHCSWRSKOV56H2NQQ64VVHAPI X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773853930567158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Add '--migrate-disks-target-zero' to pass the list of pre-zeroed disk images. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- docs/manpages/virsh.rst | 4 ++++ tools/virsh-domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index da9e9f8658..4b8bbec7d6 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -3722,6 +3722,7 @@ migrate [--timeout seconds [--timeout-suspend | --timeout-postcopy]] [--xml file] [--migrate-disks disk-list] [--migrate-disks-detect-zeroes disk-list] + [--migrate-disks-target-zero disk-list] [--disks-port port] [--compressed] [--comp-methods method-list] [--comp-mt-level] [--comp-mt-threads] [--comp-mt-dthreads] @@ -3760,6 +3761,9 @@ disk target names enables zeroed block detection for = the listed migrated disks. These blocks are not transferred or allocated (requires that 'discard' opt= ion on given disk is set to 'unmap') on destination, effectively sparsifying t= he disk at the cost of CPU overhead. +The *--migrate-disks-target-zero* option which takes a comma separated lis= t of +disk target names specifies disk images where the target was zeroed out pr= ior +to the migration and thus hypervisor will not attempt to zero them. With *--copy-storage-synchronous-writes* flag used the disk data migration= will synchronously handle guest disk writes to both the original source and the destination to ensure that the disk migration converges at the price of po= ssibly diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 1af7f9eb0e..a17c8b42e2 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -11218,6 +11218,11 @@ static const vshCmdOptDef opts_migrate[] =3D { .completer =3D virshDomainMigrateDisksCompleter, .help =3D N_("comma separated list of disks to be migrated with zero = detection enabled") }, + {.name =3D "migrate-disks-target-zero", + .type =3D VSH_OT_STRING, + .completer =3D virshDomainMigrateDisksCompleter, + .help =3D N_("comma separated list of disks to be migrated with assum= ption that target image is zeroed") + }, {.name =3D "disks-port", .type =3D VSH_OT_INT, .unwanted_positional =3D true, @@ -11461,6 +11466,27 @@ doMigrate(void *opaque) } } + if (vshCommandOptString(ctl, cmd, "migrate-disks-target-zero", &opt) <= 0) + goto out; + if (opt) { + g_autofree char **val =3D NULL; + + if (!(flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARE= D_INC))) { + vshError(ctl, "%s", _("'--migrate-disks-target-zero' requires = one of '--copy-storage-all', '--copy-storage-inc'")); + goto out; + } + + val =3D g_strsplit(opt, ",", 0); + + if (virTypedParamsAddStringList(¶ms, + &nparams, + &maxparams, + VIR_MIGRATE_PARAM_MIGRATE_DISKS_TA= RGET_ZERO, + (const char **)val) < 0) { + goto save_error; + } + } + if (vshCommandOptString(ctl, cmd, "comp-methods", &opt) < 0) goto out; if (opt) { --=20 2.53.0