From nobody Sat Oct 24 20:20:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; 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 38.145.34.151 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=1791197177; cv=none; d=zohomail.com; s=zohoarc; b=lMhJoxLCG0VTKWLZddDhaXc6HAy+02NsY0XQDviYeF7kGiXNSSw7h7THMsmgdH3IEbZ8S1zYVnGeedsQq2VQWM3ua760MIEkxDmkSmltnA2inr7AeR8bDCg7YVuQC5nP5Ds9/w4wk1N1/Rr+d21uzr4PqdkQaQ84Ew3ODOabbcU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791197177; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Subject:Subject:To:To:Message-Id; bh=eyvjzU8YY+XsQrG95K4uA6XxFLl9zX4zUFpVtPacd+E=; b=fPuwXBjou0twJPeTl+GTftXOO1IhtcggG6oYpcrMOh+cNjIEZb24thVRLwY+EbtlC5PyblzbMzzujQciO69kmALmhrsYb1qEK3B3CkaoUbVQ6kOU8Hk7kxGxnsQRy5rDTm9M+NMMX6zrWgv30Etjvku6nduHjPSxO93Qcnx8qSQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 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 [38.145.34.151]) by mx.zohomail.com with SMTPS id 1791197177481878.6701984408455; Mon, 5 Oct 2026 03:46:17 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 579F941B84; Mon, 5 Oct 2026 06:46:16 -0400 (EDT) Received: from [172.19.199.16] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id D7E3A41A2E; Mon, 5 Oct 2026 06:36:34 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 243CC3F317; Fri, 2 Oct 2026 07:19:12 -0400 (EDT) Received: from mail-wr2-x0f.google.com (mail-wr2-x0f.google.com [IPv6:2a00:1450:4864:30::f]) (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 1E9EC3F302 for ; Fri, 2 Oct 2026 07:19:10 -0400 (EDT) Received: by mail-wr2-x0f.google.com with SMTP id ffacd0b85a97d-4887840c529so2582734f8f.1 for ; Fri, 02 Oct 2026 04:19:10 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:9f21:a362:21c8:d9a1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4a0394c937csm38707435e9.1.2026.10.02.04.19.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Oct 2026 04:19:08 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1790939949; x=1791544749; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=eyvjzU8YY+XsQrG95K4uA6XxFLl9zX4zUFpVtPacd+E=; b=ATser6xO9XS0j/Po9tw9PJquhAgAHOf7+lhQa1J4zE24RYOYy5JOsOiiYVdKElrt8n Hnu0PRLEU9MMoglxi3uJ1Oci5O/skSfSymY5OovUIa3BAm19joet52JJmqoM9jHhL16J nf/5auj+JR4WvvaDQDL+0uO4boA66O/It7RN8WZCvzU3BAUmjShOAaxRcUg8oG5H73iB pE/1UH0iZ0lKufGpsY2tz6otyIAqFY63jYP54oRC6i2r3ohOGVfA5Kqos12x5ZxsA51k uxUI3q//W9ZPWXFmFn1QoOQO2C0zF70U3TDmkGV7fGGMdjNkeDjiLFTWn9RmXAT0xElS rLkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790939949; x=1791544749; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=eyvjzU8YY+XsQrG95K4uA6XxFLl9zX4zUFpVtPacd+E=; b=dYkY5IjKvNCFjkDIomPgQXoAav/yKfKbROqMdLPADgufHNBbfpVx9Z87qxb3WDalKi rSvwnWiRNcrbkDRIuF6w3U19OP1M7/YL8OKCv1BndaI60jO/BB421oKa0xogNZkSlvL/ tmpjzwEX8PLhIq4Z3w79iYIL3hhpmpZ8mL2STUo7uY7RfwqMm5UsSPffDJEcSpRBzCxW 32m1FUBPGc8dqqxXYQBniuTXN8du5dP7KYquoTA9SJM95lDym1UdX9z0hl9uURehphDO OUh4bDsQ7K7r47wEyzGqmR6aXoWYzzJmzyeX9feKem5LWhoTjfXo5pv/4hUMuROkXgwC fKTw== X-Gm-Message-State: AFuF++nkXebIvyb3yjdHAXUj4UQUtl+evguck2eYpT2JL6nqBpJHrSqN DjDKed6F4grS6kPprhXWz6JS+SJ5PxFgIiD9173wfbNTuJR8nHPy2t5FsStLd92l7YZxsb8MgHW sBaOr X-Gm-Gg: AYBFou033jMJS+r/DuygulHcjHi300VR2onNZmH+wU0MIIr1VwNyUkskd9GF/XZC2AH 5GnBd+pyymCx2d4fxNILKVoLfyvEI7ohn2NTnv2RTuF1BFIyTJKLKwLYfIS/JpFAnPma92/302I wi6n2r3QEDwWrZ4KNUdzzdTWkhhk92fhbx0ydcUhBUs0+3OhGlQxPZfo2z6yJxYYPrYXSjyMnJj GNYLlEab0vVcxkJ8VUbtMXebAQbb+DKoF5lHoxJEsJ4yF+4MDGKH1b2hrsc9zeaL9o86lyNWzrP syX59Kx3wF5VC8W3RRSTIOZNbjYIwipXbDBKmzNpLtllYaDsO+H++ZdlWhocId0/WDYPnIbOB7X rmo9TpCPPF0PEl/NjZIAXgryr7FzDtKn54W21lMW4TT5QZGRUvAqPNP/LQuxn0E+cR4c1d0/4Ro g2obel8zBO9FB+qOU2Bt8WxCMOgMXs4XpNpgJ7Lzyk9Vr7TVEWMmMXAH23BvGpm+1XtzE= X-Received: by 2002:a05:600c:8b77:b0:49e:6581:7baf with SMTP id 5b1f17b1804b1-4a0274bcb29mr39994465e9.2.1790939949396; Fri, 02 Oct 2026 04:19:09 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH] qemu: add support for postcopy-device migration state Date: Fri, 2 Oct 2026 13:19:07 +0200 Message-ID: <20261002111907.1865552-1-den@openvz.org> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: NDVLMPTUXPZG37BV6NER2CYL4PHXOKXE X-Message-ID-Hash: NDVLMPTUXPZG37BV6NER2CYL4PHXOKXE X-Mailman-Approved-At: Mon, 05 Oct 2026 10:34:58 +0000 CC: den@openvz.org 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: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1791197180686158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev QEMU 10.2 added a postcopy-device migration state between active and postcopy-active. The source stays in it from the moment it has sent the device state until the destination confirms it has loaded it, and the destination is in it while loading. libvirt does not know the state: the MIGRATION event is dropped with a warning and query-migrate fails with unexpected migration status in postcopy-device so virDomainGetJobInfo and virDomainGetJobStats fail for that whole phase. OpenStack nova polls job stats during a live migration and aborts it on that error. Treat postcopy-device as part of the migrating phase. A failure in it still lets the source resume, which is what QEMU added the state for, so the source keeps waiting for postcopy-active before it reports post-copy. Signed-off-by: Denis V. Lunev Reviewed-by: Jiri Denemark --- src/qemu/qemu_migration.c | 2 ++ src/qemu/qemu_monitor.c | 1 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 1 + src/qemu/qemu_process.c | 1 + tests/qemumonitorjsontest.c | 25 +++++++++++++++++++++++++ 6 files changed, 31 insertions(+) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4a43ab83b0..797f83ca0d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2004,6 +2004,7 @@ qemuMigrationUpdateJobType(virDomainJobData *jobData) break; =20 case QEMU_MONITOR_MIGRATION_STATUS_DEVICE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: jobData->status =3D VIR_DOMAIN_JOB_STATUS_MIGRATING; break; =20 @@ -4895,6 +4896,7 @@ qemuMigrationSrcIsCanceled(virDomainObj *vm) qemuMonitorMigrationStatusTypeToString(status)); return true; =20 + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP: diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2c86cd1971..1216681ac5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -148,6 +148,7 @@ VIR_ENUM_IMPL(qemuMonitorMigrationStatus, "active", "pre-switchover", "device", + "postcopy-device", "postcopy-active", "postcopy-paused", "postcopy-recover", diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index e9b6a25f0c..d69335a27d 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -995,6 +995,7 @@ typedef enum { QEMU_MONITOR_MIGRATION_STATUS_ACTIVE, QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER, QEMU_MONITOR_MIGRATION_STATUS_DEVICE, + QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 8e88dc9442..29c42f7dd5 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -3286,6 +3286,7 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValue *r= eply, break; =20 case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 57a3ed3720..f99a4c3b37 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1771,6 +1771,7 @@ qemuProcessHandleMigrationStatus(qemuMonitor *mon G_G= NUC_UNUSED, case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER: case QEMU_MONITOR_MIGRATION_STATUS_DEVICE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_ERROR: case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING: case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED: diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index a963029c69..a38d63c22c 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1674,6 +1674,19 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(= const void *opaque) " \"error-desc\": \"It's broken\"" " }," " \"id\": \"libvirt-14\"" + "}") < 0 || + qemuMonitorTestAddItem(test, "query-migrate", + "{" + " \"return\": {" + " \"status\": \"postcopy-device\"," + " \"total-time\": 52," + " \"ram\": {" + " \"total\": 1611038720," + " \"remaining\": 0," + " \"transferred\": 1611038720" + " }" + " }," + " \"id\": \"libvirt-15\"" "}") < 0) return -1; =20 @@ -1699,6 +1712,18 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(= const void *opaque) return -1; } =20 + memset(&stats, 0, sizeof(stats)); + if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test), + &stats, NULL) < 0) + return -1; + + if (stats.status !=3D QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE || + stats.ram_transferred !=3D 1611038720) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Invalid postcopy-device migration statistics"); + return -1; + } + return 0; } =20 base-commit: 215fab8ab1d912f6b25e60ab4d2ad59000f2eaff --=20 2.53.0