From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023083.outbound.protection.outlook.com [52.101.72.83]) by lore.virtuozzo.com (Postfix) with ESMTPS id 4FA458017D for ; Tue, 3 Nov 2026 13:57:51 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YCR9/YMlomUPMWRweshoECimf4Sagz9XBV05QxMIetJAeuA4fbfx1XVn+r6p+SnaGJTSwrpb5NQkD0f8/Xq+O6TkmVe5PDjCx2ELC0obJynCO2ihsixV4TGeLkaEqSD8yHc4B374jfQrwH66G1O0tjwPyG2/AhD7clN5d9VUg3b+qO5NG4YyQwZcpaUniCK1TpPz8tV47Kyd//+hAvuCNxfLcxB6w22hHjujAdlbCSSdX+wUC2JNhaEOfNGAeOmjxv7GSJZ9ekVWA9WkWTZyV9pRGh5U84AEras1/Sv8Ur1x5wfRBZywPlsqNZqIKRoN17FEKgVa87kco/BG+wMUDg== 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=O5eZp5hIAPBysYvYA6r35o5+lTeWJOwQBXjdsLWVHKo=; b=TzZE4S3LDVPKVXoRzgdtyXH8Jhi3W7tROyoo4MzkGw9lGhetQW0hAVpDGHa6ImbPhl4DPPcmyEU9q8gUwP3tHHeTMgxeG1yGwpF5VqZjVipDoURHOA3Fw1a/BIRd+kKm5bJnnw2tJEePjz5jVJv2brq2BzQoBD265so3Zo152wfflR5QzfCoJfHmDMxKMDTnPJbnBMcCUCZD5zjrbsZm7ITzt20RtaShDIcjIgJo63AVz8ksbnDs8ixdqIWRFVdZfFhhBg6wJt+RMmHsDqCmx09b3bfXPJnhSUKTxtTHm1zL0Man7LfMnf2ZTzIHXxiZFJiqlW6LLS1oXK8/o9af8w== 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=O5eZp5hIAPBysYvYA6r35o5+lTeWJOwQBXjdsLWVHKo=; b=jP7ALP6mTGaUv68Jc4EvS2Ef5P0J0fZ91buD4nMGYmllmopbkFA55uYyap+ACi8DQujTPBUoIy9hfomB2kQAR+pJw1bM4IXMqWIBY1+mlKg6HwtqSbqbIHR9sc3aaDPgjiWv3qPPw9vgpyMR7Xm8FVCt5gwP4pxE+An2xDRQJtgCn6mF/mVQ/V/m03IrCivCqgMF9emodtquCd5d5uMGfqlzRSV4XevBkyP9wINHFpKFwbFsQBngADhZnRmA7No0snx5iA9QyiGMYQ8nIMja8PrcSUxn+raP6XNUp38FT7thgY1L3twOA+wtvTOMO0Va1sF2hcfu/8GVnDDR6OXKUQ== 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 DB3PR08MB9135.eurprd08.prod.outlook.com (2603:10a6:10:434::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Tue, 3 Nov 2026 13:57:47 +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.0569.011; Tue, 3 Nov 2026 13:57:44 +0000 From: Andrey Drobyshev Date: Tue, 03 Nov 2026 15:57:34 +0200 Subject: [PATCH QEMU HCI-8.1 v7 19/35] migration: yank: Move register instance earlier Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261103-vfio_v1-v7-19-4467fdccbbe6@virtuozzo.com> References: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> In-Reply-To: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI4PEPF00000153.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::86f) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB3PR08MB9135:EE_ X-MS-Office365-Filtering-Correlation-Id: 2f25f5ae-6642-47be-31b4-08df39b267c9 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|1800799024|366016|23010399003|5113699003|6133799003|10067099003|18002099003|22082099003|261102123227099003|56012099006|5023799004|261022105027099003|261026121527099003|261022075727099003|261026140227099003|261009223027099003|261028144727099003|38350700014|261021121427099003|261021123027099003; X-Microsoft-Antispam-Message-Info: GzOCQKO3/KZyMvqT23G4wxEzKjKY6dlG7SrsVY+yNr2DLV/cYJ4gbZECxqN/M04ztOaEWlvax0rLOMLQDVWz90flAiUKI4zDeKcYEV0/+h/aS6xQAmkTywbLpJtYThbzIl3O/b1+vNSm5u1wh0QwS0y4VST0z4bhAQIfam9oRLfJ7Oke3skt1tKR+74tX+FY2Ba3eJQ3zCYx9117NZJJAWT1Mm2K/x6opB2C9dU8Hd5hCjW7JOLu/OLcIbw58GQlA6lLtRFtsBG0rni3OmVWodtOSgDeUVMNOcT8oxSE+OCEFRbeAIFrgix70I+fN45V5Kv+QZgd3n0VmkTcG1zcHrz2/Vf9MZH7RfvKesmvrWs19z/bWvlec9YeRSXle8YEhLlYPSp+Uzyk82m7vhrlenIh4Hvq7Ag6FZStLuPC5/7rV7bfyXd9kPZUO1fzqI6nOiIBpPpDhnK6KyJ4x9wR+wqSz3B9RjBX3RLnvJFDPBXuVzjCOCi0cusbdLVLZg/i2S/bxLPFa+Pq2NuaU0CtzASWVDh29MzMXqSxIULOhomkNV0n1bh+aAJVBEEMweKo55t35mNQ3T4ME9Uob0zmqyqLq5N9K3Ymj8Trn06Uc9AZchu/zNpFpCeN6qz2AyFLT6b+Z/RSXnm/S6vAwCkoeuA99rhNfPmfcwxBv0zbI74= 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)(52116014)(376014)(1800799024)(366016)(23010399003)(5113699003)(6133799003)(10067099003)(18002099003)(22082099003)(261102123227099003)(56012099006)(5023799004)(261022105027099003)(261026121527099003)(261022075727099003)(261026140227099003)(261009223027099003)(261028144727099003)(38350700014)(261021121427099003)(261021123027099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?d3o5aUtCbkFXSEY4MGZxTHRUbzE3WVVvbWp0N0pVdTE1aVZDQ1k3d3lKVkti?= =?utf-8?B?ZkJqekRaTmQxeEhsSnVoTGF2UEdkVGw2bXE1ZjVCaXB0MDdMNnpzajJERmRl?= =?utf-8?B?L2thcmJzSUZOaS9KZ0UzT3BuL044TGxHc29ydFhpS3FqTXE1RmVOd2d1TXM3?= =?utf-8?B?SUxNSDJXR0xqN2lHYWRGRXFWd0xpbEd6eDJpWWZOVXZ5eDN1Y3J0cnYyMHNM?= =?utf-8?B?aGNUTWowTi9heVlkT1hLVUNkSXZGZ3JkaFVtUnhXTFYvRnkvQlRSTldzMFgw?= =?utf-8?B?WFo0K2hrL3ZKbUxHOXllY1ZjbHVqbWVhdlJJck5pcE9SVW5zNGN0amdmTlJK?= =?utf-8?B?QnU2YzBFZGRySE5GbUdCZXpHamJvV0NSS09CK21LamNodEl6eDBlMGhZdjlG?= =?utf-8?B?c0pSNUM1cjhJTE96aWRzVUppelkwWnoxU3hNTVhTZjFwTXFydjRpTnI3Y2Fh?= =?utf-8?B?ZGc3ZVA5NXh4aWZqUEt6dXFoWDdCZVBVNUQvSEZER3dZUjVlTjBkUk1GWnVM?= =?utf-8?B?cUZ6eERSNnBETjJKblduczBxVkNzSVZXb1VwS04vd2tsN2M2dWxDcFhqNmRr?= =?utf-8?B?TXlCa2RDWENyeVB1ZUx2ZmQ3M2ZseFpSSHVHUHY0K2ZsWElXVnh5cHFzdm5N?= =?utf-8?B?MEowaGJvNVJGVTh5a3JjRXVXb0lrZ3R2elhJOUNpWkNOR2F5VzA0bFRsc1BY?= =?utf-8?B?NDRSL2JWMDM0WVRaQVZkQ0hvWWhGTFdNNzlMZytmZUFJOThzLzBwTjNGMDhy?= =?utf-8?B?a3RlUVhGU2JrdjlVbFM2NDRLUTF2Ull6MHhmUG8vNmswbWlYS1FPVk4vbzZ4?= =?utf-8?B?U3crRUF4T2VEYVpBZWtKVDd4T0w5amp3cHYrdE0xWXpKTEcycmo1RGdlRmtC?= =?utf-8?B?ZjM4UStOVmkwRkhhYUt4NGc0N0lLSkNEakhFVGZNUXN1Q3NlTTduNjNYaVV1?= =?utf-8?B?YzlGdXBneVBvZXQ2cHBhdjMrdVo1QUptVjlCUlBGZjRyYkkwTlNnMG9Td0FJ?= =?utf-8?B?V1llU1J4NW0xUGhQZytuOGM4UzVRbldlV1djU3RUMlJaNTQrL0JKRkc4UFBJ?= =?utf-8?B?Qzh4cExQMklUQXRteWVQcUd5c25kb2RWY0psMG82UjBDWEFKZGN3alpsUEox?= =?utf-8?B?YkpnS0dQa2VTUHc3eThHNi9UenJ4T2FuZzN2bDduSnA4NitsQTFZMkZNeUdU?= =?utf-8?B?N0lFVTJZSTJhMXc1ZnNtZ2lMMG5YRm8xakRmOWMrR0YxSlJRRU04REk4Slo4?= =?utf-8?B?VHFWMjlMRTBrNWE5clFBS04zOGhpc2wzc281Mzd5L0Q2ZGVXd0d6VW1tNWxE?= =?utf-8?B?ZEZnaUJLa0J0bHBuQ29YdThxTDF6NUlrWVRvc3NZUVdISjRWKys3V2pGQkR3?= =?utf-8?B?eWZlY1hqYnlaMDJVa3RnREhZUGo0MUo0MjVmbVVZaTErdXlHYlRJdWl6NWN3?= =?utf-8?B?Mk5iM2Q5N2JyUHJ2VEcwaVp0V2FMM1FLeFgyOWIyMFYwalgxcy9kT1hyN2l5?= =?utf-8?B?YnZycWhjcFN0WjFIekU5c2FNeEZVYVpDMEVYbGxONnJaZTFONDNUbnBhQ0VC?= =?utf-8?B?NFBITnJWYk5MaU5TNGRETTRGTkdhY0E1dDdRV0w3UmtZdHkzT1YxaDB0akRj?= =?utf-8?B?R0N1WXhaZExaRWkvOG04cHhTeHdHYU9kNDFKN2hjelZ0ODh0czVsVlowbDRi?= =?utf-8?B?WkltOUh5dGxlckx3TjJlR01DTlRPa0FNcGtPSUVXN0FGbVJDVVBma1ZmTkNt?= =?utf-8?B?Z3NiYnhsK1hjd1FtcVgxYndKcUVDUmdYT3JzcSsrakJtdjdDUHN2ZEQza0dq?= =?utf-8?B?dzAvdEJIMVVjTDJvcG1CN3NoYW1qZDNod3ZFZTlSTFI3M0o5dmluZ0FkTVdz?= =?utf-8?B?aStwR3E3eWpidVA4cFQ3MVN2L3ZiUUpPbGhxTVpzSm9QUklLUTdNVHpGRkht?= =?utf-8?B?V0lGajl3anpUWjNhZy8wNGtsRDhteXRwK0NING1iR2I5YTUvRnNSK0haMEp0?= =?utf-8?B?cDFoaUxMU1UvYzFhVFAxTFNTTkgvWnJmckNjblVoOWZSdFY3WWt4c042VGUr?= =?utf-8?B?VlNzNFBDWnFHekg4ODFsbHR6QVZxWE4wYkNTdGQrb2JTZ2xCSm5jcFZtT0Y4?= =?utf-8?B?RWZmd0hzYTdNZHU5TGdxaUVJaHZBVVpKR2FLeEY4K1R6cEU4V0Z0WmdCa2xi?= =?utf-8?B?OUhnLzY5L0tqdnc1YzExcWVFZzdQMUh3d0NCTE5QWXVhRkNva29POHBtQ0lQ?= =?utf-8?B?bjMyTVBYb0htNGNYK3NLVmRDUlNFdFdLUm9wQWJNUTV4c1E5Y0FybEVYaG93?= =?utf-8?B?UkdSQ1RlMWxtYnM3RUJmYk40ZWtJd2h5L0JQWWU5Sk15N2Y3dm5HSlVUdm9n?= =?utf-8?Q?sDZgeZyHbfqdDU1k=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2f25f5ae-6642-47be-31b4-08df39b267c9 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2026 13:57:31.9290 (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: fpWnw71nranHoQYyWGGCQrxAK2ZDZD6JQs1blaSYXqcDwQhcHvMB+myNRa5uX2YVXHb4u9TMLx1OJdI+zOjm/mWmlopEFvFZYKQo+NmbhoY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR08MB9135 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 d5a21da3129..cc88f70ae59 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2186,6 +2186,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"); @@ -2243,15 +2252,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) @@ -2276,7 +2289,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()); @@ -2288,7 +2301,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; @@ -2341,8 +2353,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; } @@ -2366,27 +2377,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; @@ -2413,7 +2423,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