From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023097.outbound.protection.outlook.com [40.107.159.97]) by lore.virtuozzo.com (Postfix) with ESMTPS id 0C9F980B92 for ; Tue, 20 Oct 2026 16:31:01 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MIo/wLv8n/LkZSFuco/NasnqAVdquS+JTiLYU7XDMHpX7Mx+t646NtGaa9E+UN20KKxBJMBxKdh4gX0Q/jeUpG/V4MmskL/KRlWdKrSgy5sZlxXhcNqXPncXsUPOdssfjUItEFB5Cn8C8TdqVlIMUw5K2CVo8lYY7oZUF47l72xBBLc+2Kfd+RmFbgWMcnaPk+XFPvH1l7kzMNR/vCtZyCSfaBTEzzy/GUQvJiIDkhcZyiVYSTavGVQv2knpJQdkgMsxyeFPqazwFxRCvBOEqHt6AC8qHG8ncFy/oWkwlfc9YHfOH9fSgvI6HFi/WCn7AoU84uKJC9/bsVotsDT41Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=E0gJiwhCW4X+EddpHoO86Im7QJPr5+/K/bsIjtHG7vU=; b=V1593ZPjPpxvWUajcuKkXhzyjrrGkjvsn6lEbrq2PQ22u2xDBsjYntRPqbvvb23EqO7x5U0FVlS77M2O1TqK+Oiyh9sW8QkOnIbEcDr6Agt746oyUX7jezqgp19IGH3v8TVt+ukc7MLQpjS8V6LuN1Fqx46EjhAn+mgxMBW9Dm8UQ9fHqWj270g/xuhdO4GXKoAJRpyEf56Plw67io7RuXdZGC3z3HKciWejeMnoxygWFrYmW9EsVTFcQuwVnC40zUDXuJenXW1KrNKXro+UnktmBIo8FIpwKRmrOjGceRr3MXQV9XPSrBQGgaJ+6h90v/2vF0QwZABaV1vuMfKORA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=E0gJiwhCW4X+EddpHoO86Im7QJPr5+/K/bsIjtHG7vU=; b=gEX/0Xhe554Sry3nnqFjHBi/esxKJSoFuRnmdV2gGjKKfG66/EHH2Z/jEv6oEz1Cf8HOw7n3in2MCWPsDKWVOULYqFu+71A3f7OT7ddWICHgQF20+IZbBvB79O/IoFiIFvA2cVNFiRW0CdSifZxBBvR5HDgEWyQTIAnrWWXu64AMFN6oAn9/yF7zbV/9hsJ01Ny5OuYV+gO7E94OELr3E/uSZ+FESGkSm13t9zW/gkoNthYZQxw/4BROLSBhv1NzuHbXF7P5R1Nol6Sm8elAR/2J6/5G7X8ufBzokKUAcbvsa3oxRYYXLGatgAzcAp8qCRHU4mc04nPMUj4yhQWTjQ== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by AS4PR08MB7553.eurprd08.prod.outlook.com (2603:10a6:20b:4fb::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.15; Tue, 20 Oct 2026 16:30:58 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0546.012; Tue, 20 Oct 2026 16:30:58 +0000 From: Andrey Drobyshev Date: Tue, 20 Oct 2026 19:30:56 +0300 Subject: [PATCH QEMU HCI-8.1 v4 16/31] migration: yank: Move register instance earlier Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261020-vfio_v1-v4-16-83a5668230e5@virtuozzo.com> References: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> In-Reply-To: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0056.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:34b::14) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS4PR08MB7553:EE_ X-MS-Office365-Filtering-Correlation-Id: 68f5970b-79de-4df5-6e7b-08df2ec7844c X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|376014|52116014|366016|6133799003|5113699003|10067099003|22082099003|18002099003|5023799004|261009223027099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: A2ngfYQ982ImR7GADil9HmTZZNi5FyHvCdr72soo81Gn9fpS6rfg+LZ21YAHaRCJ2JY+7G+8MyVKhR2licXpOoMbcIHqxL9MTKHcUf+X0dBZe+nR3UVmZ2craWp9V7G1XGZQaum2lYsPL70fAsSq5EhDEdk6kfMeEMlH/vbuF3SfBij8/FjLVzHGHmaV9edmZEvRtZD3f4BxKZomHrlCC8bqdv7+h0y3b5G7kpnErVsALxsFuEoTeFjhyamQuaNfFa9MpqbZpY/YivmIktBIpMhGiPYkdxU6j89AcPIxOXkhjZeKCsiO0E47Sd9x0aZLAVOM9s7bz0bUBpvbGobcpHNSw/PTGrr1nJiUrdRAqsI4Asmze0rUbRDe+CzRo/ocCKLZVQXkWTOOz0E94/eeZhzrlsH6ZzKnA+Tfq0ZtWLRlMf0tUJcg4h8Q5SiInqlOy2vbIlj275W4o8xKPo9SHqXerVZUPPSY8h5ALyAPrdKx4ztmXhv42iaTZn9zAy40hgFUhng/RSNPkkN+aQ4H5Ang8pSpAGveUguJgUdUUM8cs9yZ9xMkssaUtXjyhT0xSBfDpUg08+zhhZZmCwKZm2pkVQ4YzLMg4DJ5Waa0uPK+t6/VRgfRuFQljWHxiMX6P68NUaM9VJDATs/uX9GAnRT5Vm3exkA26UE7CdAQ2u0= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(376014)(52116014)(366016)(6133799003)(5113699003)(10067099003)(22082099003)(18002099003)(5023799004)(261009223027099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VTFQbnJQKzZQN0NtRnVGS1V3ZDhUY3QxNjVKMmUvNUQ3UVpZUE9qbXd1T0FU?= =?utf-8?B?ZDN3Z3lrZS9PeWgyYy9mT01KL3BuNmo2QjdiWTBpSkRSck4yVTBQcmxlUExh?= =?utf-8?B?bzJSdWdUR1JqaXA0MS82QjVYVXhYakhkZDBDdmFmWktuZmtZRm9oKzNpdEcv?= =?utf-8?B?SUtUL3oxeDRSS3BOYm5CS3JrOGNCNmdJVVdSK0dpNjMxVEFqRXhSS3VSRXRZ?= =?utf-8?B?NnNybDdVNUM3dHYxcysyTmdzd0p3c2V4K2JicEtlRE85V0kvbENqRFZtOS95?= =?utf-8?B?bVduN3BkVlZOTnJVQW55dHdxcml5V2VwSW45bUJmVDNWYmh5OWRrelZtUG5D?= =?utf-8?B?N2JNak9SNlgwQjJ4ZEgzODlnZkJYS2wyZFZHbW5jVTA3dFBaYnI1VXFEMFEy?= =?utf-8?B?d21GMEV3WVdxZFhQMHFEQ2NIdTBUY3cyU2NLaTAyOWVpcWQxSDRHcGZXaW9u?= =?utf-8?B?M0pRUGdtTWRZb1pjTktyK3FCMHhxeEdnd2lDR3U2S05wQWRUM1hTOUlHTE5p?= =?utf-8?B?RW5mR1AxYzdVbVJJRlpaTFNQa2FMTk1CbkwxcW4zTmtmKzBScGxGU3BrQ25J?= =?utf-8?B?d0QzOHcwNEpXKzdRT2JnU0pnN1hMTlRxRkhGYktzODc5VjlvM2RJYkZ3dGVz?= =?utf-8?B?YjVjU1huMzczREdzQUxJZS8yWWZyWG9nZnN3TkJOWU4vL2lhSVRrSFBuSjFp?= =?utf-8?B?bnNjVktlUWwvOU5WVFlWVnBPWTRJeUtjb29hU1dRRmxSRHh6eHRBY21RTFlT?= =?utf-8?B?RjZMY3JVSTVaNTNuSUQ2S2ErWUJoQ1pRTHE0Y1M3SzNmNVhpek0yYTJvYm5i?= =?utf-8?B?WWVoY0tiN3ZIR0ZsWVI4b3VKcU1RS0dBSzJicDVMOE5OSjJibkFMQXNLbUkx?= =?utf-8?B?RDRwdWtPTXJ6MXhLVEFtV2lFR1RGNEw5amNJNy9rSTJ4VnR1SmlONFkyZExQ?= =?utf-8?B?eGk1NmNOU2FaaC9aQ1JuYzBZVzhuemtTK0hZM25pOGF1bGJYNzZuWERXQkY0?= =?utf-8?B?R21FdC9pblVIbXZtb2ZGRDJTZ0FtZFBxWFZ2NWVSdHRWZU9oWDF0anhuRnpq?= =?utf-8?B?QjVJS0Mxbk81d0ZOemp6WC9qWXlod0JtSUJjMElGcEkrZUkxV0htZStOY05l?= =?utf-8?B?UTVLZFV2VFpaZ3pEK0dPYkszSm9zWm94aTVsb2lXVHB3NGFkS3Y0NGFLMGpk?= =?utf-8?B?WDMrVFQ5OGx4amNNaU84dUhqLzd0enNuRHpTMDY5OXhCTENSZExXZ2piNVVS?= =?utf-8?B?WHVHbDZXc0xoQ1lvL1ZpRTB2L2N5L1JUeTNsUEUxcnVoa3ZoV0R5bE9DUEtW?= =?utf-8?B?NzU0VTBPVzg5a09BWkppZFZsQ2tZU2Y3dTRKZjhDOVBLSmg0SmxDTGJoUzEr?= =?utf-8?B?YkQrdXVoTFptNjhvZisvU1FDdzMxRHllQUpBdm03OHU5enBaNDQwKzlUeTZp?= =?utf-8?B?bXNmNzdYcDQ1RUNrZVc5dDcrSG5IMEE5MVB6Sm1IQ2dFdGJTNXAxZkpUK28z?= =?utf-8?B?OCtlM0FRc0ZYcStIQXNieDRpOEtvb3NVT3dxOVNuakpDWmUzaVdyajhZSllj?= =?utf-8?B?Z3dYVzNCaDI3MUpVV2k3WEg5RnlCczRNMzR5ckxiMjgxK1JWOEtTSFZDZXNH?= =?utf-8?B?Y3RhTUllQ0VXYk5malRRSXBxVE14NUxNVmJydlhsSzVMdWVkRGN1OGNkVGFG?= =?utf-8?B?VFJ2UW9wbDJNUit4Vys2eW1oZ0NYQllYNFZ1djR4dEp4bWV6VTN2Um5pUHpw?= =?utf-8?B?eGdicXJZU3hGWVBqQW5YZlg0TitWblgxeXp4cnUvMDZtK05IMUUySDBqNk5S?= =?utf-8?B?UDFLalNmTUZsK3JJRjJheDYzNXdldjV3YVh6bU1sUDRvUW1iREYwcDMrMDNa?= =?utf-8?B?ZGwyaWIxOGtPMTVvemNiWnRweDJFalJVajJtMDlNUmFpV1h3Qis3S0UxTFlG?= =?utf-8?B?b2E0Z2NobUcxSkJoU0kyRkZTVjEwQ2dZdndDR2lIRGt4eVYvRDM1ckVrenRR?= =?utf-8?B?UiszZmhCOC9RWDlVbjFITk4xTFJ3MVhubm9sMEQyWG5VeTRjUkZocU5oS3ZO?= =?utf-8?B?dlBKS1VYMHF1ZG1aZCtnZzF6SXU4M3Y4eHFTM0VGdGRSK1VOSytmNUdxeTFD?= =?utf-8?B?RVczV1lBVmRXVW8rUGlhOWdVTHUrR0J1WHJoMzVNVEl2NHh3eHdRSHJhODQ1?= =?utf-8?B?cEVJMk9JVG1GSU9ZUXBlck5pajdMa0wyeXN2TjVJM1JkVDU4dUpCYmswV0dz?= =?utf-8?B?YVg5NVpXUnoxenVOU1F2c21rRnBIc01ZNU5EKzc1R1NVN3VQSUhKNUJKdWlV?= =?utf-8?B?TmhJUFQ4bU9TYjNoczZsNEt6OFRCdk1PQ1hRRElOU3ZrcWh2WmwzTVhBcURZ?= =?utf-8?Q?aHS78J17zgzPCXcs=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 68f5970b-79de-4df5-6e7b-08df2ec7844c X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2026 16:30:56.3780 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: flZZCCp6ypaJTKMlAKiW1nVtaVvB7jRj2xwfH2akNpPihk6Q2reyMabNY1q6BcvfNqDPHn5PduMQ4/oRcxE+Lu/TzEFw/MihcHHczdyuKr0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7553 From: Fabiano Rosas Move the register_instance call to migrate_prepare() so it can be paired with the unregister_instance at migration_cleanup(). Otherwise, the cleanup cannot be run when cpr_state_save() fails because the instance is registered only after it. When resuming from a paused postcopy migration, migrate_prepare() returns early, but migration_cleanup() doesn't run, so the yank will remain paired. andrey.drobyshev: This commit was cherry-picked from the upstream commit 7e714392437c, adapted for the hci-dev base, which predates the upstream migration_connect_set_error() -> migration_connect_error_propagate() rename (77c82edadbe0): the error propagation calls in qmp_migrate() and qmp_migrate_finish() keep the older spelling. Also fixed here: upstream left the yank instance registered when qmp_migrate_finish() fails before connecting (nothing calls migration_cleanup() then), so the next migrate command aborted on yank_register_instance(&error_abort); and the unregister at the out: label ran on a resume, which never registered the instance. Upstream fixed both in 6b587af5ec9d ("migration: Fold migration_cleanup() into migration_connect_error_propagate()"), which needs the above rework; this is the equivalent for our base. Also register the instance with errp, before migrate_init(), instead of with &error_abort: a duplicate instance, e.g. a previous migration still being cleaned up, then fails the migrate command instead of aborting QEMU. And refuse migrate while an incoming postcopy migration is still in progress: the guest already runs then, but the incoming side still holds the yank instance. Reviewed-by: Peter Xu Reviewed-by: Prasad Pandit Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-11-farosas@suse.de Signed-off-by: Fabiano Rosas --- migration/migration.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 132f0d403b7..802dc900c6e 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2182,6 +2182,15 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp) return false; } + /* + * The guest already runs during incoming postcopy, but the incoming + * migration still holds the yank instance registered below. + */ + if (migration_in_incoming_postcopy()) { + error_setg(errp, "Incoming postcopy migration is still in progress"); + return false; + } + if (runstate_check(RUN_STATE_POSTMIGRATE)) { error_setg(errp, "Can't migrate the vm that was paused due to " "previous migration"); @@ -2239,15 +2248,19 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp) } } + if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { + return false; + } + if (migrate_init(s, errp)) { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); return false; } return true; } -static void qmp_migrate_finish(MigrationAddress *addr, bool resume_requested, - Error **errp); +static void qmp_migrate_finish(MigrationAddress *addr, Error **errp); static void migrate_hup_add(MigrationState *s, QIOChannel *ioc, GSourceFunc cb, void *opaque) @@ -2272,7 +2285,7 @@ static gboolean qmp_migrate_finish_cb(QIOChannel *channel, { MigrationAddress *addr = opaque; - qmp_migrate_finish(addr, false, NULL); + qmp_migrate_finish(addr, NULL); cpr_state_close(); migrate_hup_delete(migrate_get_current()); @@ -2284,7 +2297,6 @@ void qmp_migrate(const char *uri, bool has_channels, MigrationChannelList *channels, bool has_detach, bool detach, bool has_resume, bool resume, Error **errp) { - bool resume_requested; Error *local_err = NULL; MigrationState *s = migrate_get_current(); g_autoptr(MigrationChannel) channel = NULL; @@ -2337,8 +2349,7 @@ void qmp_migrate(const char *uri, bool has_channels, return; } - resume_requested = has_resume && resume; - if (!migrate_prepare(s, resume_requested, errp)) { + if (!migrate_prepare(s, has_resume && resume, errp)) { /* Error detected, put into errp */ return; } @@ -2362,27 +2373,26 @@ void qmp_migrate(const char *uri, bool has_channels, QAPI_CLONE(MigrationAddress, addr)); } else { - qmp_migrate_finish(addr, resume_requested, errp); + qmp_migrate_finish(addr, errp); } out: if (local_err) { + /* A resume didn't register it, see migrate_prepare() */ + if (s->state != MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP) { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); + } migration_connect_set_error(s, local_err); error_propagate(errp, local_err); } } -static void qmp_migrate_finish(MigrationAddress *addr, bool resume_requested, - Error **errp) +static void qmp_migrate_finish(MigrationAddress *addr, Error **errp) { MigrationState *s = migrate_get_current(); Error *local_err = NULL; - - if (!resume_requested) { - if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { - return; - } - } + /* Before the start functions below change the state */ + bool resume = s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP; if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { SocketAddress *saddr = &addr->u.socket; @@ -2409,7 +2419,8 @@ static void qmp_migrate_finish(MigrationAddress *addr, bool resume_requested, } if (local_err) { - if (!resume_requested) { + /* Nothing connected: migration_cleanup() won't unregister it */ + if (!resume) { yank_unregister_instance(MIGRATION_YANK_INSTANCE); } cpr_state_close(); -- 2.47.1