From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023101.outbound.protection.outlook.com [40.107.159.101]) by lore.virtuozzo.com (Postfix) with ESMTPS id 3BF1A81069 for ; Fri, 30 Oct 2026 14:45:52 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Dc4HTg6NC730tLUM5HsLImVU5+7aMb8AZDfWPsfvPw2+NUHSrjXkUq+6FoD6ZGAJjMboCKeKy+LA5kYkGuE33DioHqEQr/HfOkOEZYmf+OyIDS7oPrioma3jo5/pLO1Pq7IIul+gHk19YBIXedlBEjNd/1Y1y1GdxFiyf3dbGwTf74VqUqy62bcElR/DqCanR3peQ4W8hJ1ez5WnhyQkaJlxUMjjTmf1BiEkfY5gXT2nzZ0vd1Q+jiuabysL0Witpl+joM6H2oqcFxm+XdwlMRbWSA6hEcfZ7SFgPt7j4A+g7A2fB8OE8x7MAkZtHLkXlvZ4VKYpTLgWrzjnvpJ/kw== 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=v+SOfyiDMODJKIgj4MrhjQigPNUZsy+dUqaAzwSzVL6RYUg2tvGsKRd3Z0CubK0vn0dEeVoe5aFD50KOuSIMnorhaDRdBMvikkP4JwTLebPCZzrYQLHIylb0FMVejIT9g1vylONJ0DIfQoZwla0tYNh4ICb6HQCEwGpqB7zRjIY07QJoM9DJ6RsR1yiFu2T/2qKfXFiRNS1W6sd86j1Q+9Gdcind9wx5vduSrL27t/ZtOCXZujNYVa/XQNxbBx3KGfdx8RIKuMrXftfdKah6MrX+3Yh2MNfF23M3F8aEnkrdRBmZXYn6V6cOjTdi45TZ5li06PKDXTARbYQJUwDtAg== 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=YIhs4j5Yx/CqITEKvZdCVj/izi7T9YBOziwxVvIy+sBm3Ycd2EvcdNzkygHXicxM+ugexgt3PIM7igqvPKB+EX3f7HNqm8/W/Jgw4AKyg6KB2TXrxhyjNYmUTmESP7AjXLDf4TlQcjE10iKBTgIUxg8caCvtkYLrVBAasK2GfGJKRaLjKLpIRedESywNHAiN6ROfvSQ8hOUQ1GfbK6DK+4TX4L8dlNH1zWu/N/Oj77LrKBsqiRmIJ36obY+nQ+j0Au6Bs0rFEjn0iCVbLXFsa7RZfSBSJjqCBVHXIE+BmRg3xJnZqSAL7+2UyAgbPjgPI9+sOQczHTLK9i28sYNN4Q== 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 AS1PR08MB7451.eurprd08.prod.outlook.com (2603:10a6:20b:4dd::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.9; Fri, 30 Oct 2026 14:45:50 +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.008; Fri, 30 Oct 2026 14:45:50 +0000 From: Andrey Drobyshev Date: Fri, 30 Oct 2026 16:45:49 +0200 Subject: [PATCH QEMU HCI-8.1 v6 18/34] migration: yank: Move register instance earlier Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261030-vfio_v1-v6-18-45de246bc92e@virtuozzo.com> References: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> In-Reply-To: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0502CA0031.eurprd05.prod.outlook.com (2603:10a6:803:1::44) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS1PR08MB7451:EE_ X-MS-Office365-Filtering-Correlation-Id: 0571cb9f-7b3c-4564-a876-08df36947c2d 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|366016|52116014|376014|23010399003|1800799024|5113699003|22082099003|18002099003|6133799003|38350700014|56012099006|5023799004|261022075727099003|10067099003|261021123027099003|261028144727099003|261021121427099003|261022105027099003|261009223027099003|261026121527099003|261026140227099003; X-Microsoft-Antispam-Message-Info: ot+0w0GbQCUHYMjLlz62WGTeCW6B6hz86W3DnljUuiwi5w8+45ilR7flyJWbWCMDL74hJJGe4anFtBHhlh2ZE0uZ69PhKbtGTdzb3e781Wh8rKZHnKh/joi/XINCRNuS0pHNlFpHSAPxnlnxvwUbCe2BfUaqpYLAv4Q+v98FpIM31NLF4jBCFSJCgvXB0JCwcCxCHBQTRPmIqFfWtgjXG/nTqC9A3uXzpEExnGZOzqO0PAAieIkqBa2JdEnleSUAMgMyVzsybCCsuB5rZVzjPk2cfJ7XGDDRCEo1/p8QO9gmDyV/9IvvFFtqg0svDAChKJ+izMxxv51yHRoAldtiMlz6AAi4l4wVs7lWE5mRJOQDH69icRqPiwLS1UJlkGLk7w+8JmTXOqGbPXDOXemurGQaCPfknmgpe+k26fTKZlaWynfFn+A+T8UAKpmkwMNktgfjgtiD4ZsGu5Cx9F9iRvr/JqDyVIOouWxkY+GIvaLu5GjoKaykYZkKLNrl/CelwOwkfXUkxIe/ijTx8nbUeX2bi9ONzKQfK7XC9/xCcZS6QQ/DGwXmcm9z5x0XU2944Q0Wia0KXgpl2yv8qu/6qAYOnyAs7gwf5R8cQ/OjwD3fwobKoNYkfA+R7WVcq0U7JWNBlArbJcAfbYX9hqTJkOufvLFSLlFo/ahftcUHEvM= 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)(366016)(52116014)(376014)(23010399003)(1800799024)(5113699003)(22082099003)(18002099003)(6133799003)(38350700014)(56012099006)(5023799004)(261022075727099003)(10067099003)(261021123027099003)(261028144727099003)(261021121427099003)(261022105027099003)(261009223027099003)(261026121527099003)(261026140227099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WXlWbFRaMXhvdCtjbmdLaStLUE92YVB5THBocXBlZ0UvNEdGTlBOTVowZmp3?= =?utf-8?B?TGRPQTluRy9TQytSM1cvWVZ2eVUyQThlbmxXc2RpYkdod2c1NHE1emlTVVY4?= =?utf-8?B?UlpPMnNZVks4RDZyU0dSdzNZR3kwc3ZHSzNkeHM2bFhac3o3S3AzVlRmWWJz?= =?utf-8?B?N3RvYzRmYTNqL1o1Tld5SlpGalAyTFZIa2VPOXJZN2xmamU2c1ptYmo5V0RB?= =?utf-8?B?TTZtVzE3K09abk5ITmxIbkYwc2ZhTXRxamdZaVhwMEdYMGZpeHlzT1E3WWZU?= =?utf-8?B?Y0dOWUlHOG8rVS8vb1o4MklkVmpWWFhNc3d6RnhIWk1Gc094ekVhVTA0K2VR?= =?utf-8?B?OEtyeTdHVUFZdXFHcUE0SDh0MU13WEVhK3VzRkVEUExldUFtUzB0STZHSVhw?= =?utf-8?B?SFZnWnVZVnRFTHlycmNULzhxYTVyZitvYzdYY1d6YTVNQmlDbjRVSmVCZWhY?= =?utf-8?B?UTdxOE5jbWFlUEhkRm5obGkxQSs1Ykk3NDIrcXpvcjVLSFJibmNSa0JYbHph?= =?utf-8?B?Z2lFdkdQalBVQjhTSEkwU3BIeTZIWWJvdHM1U2xhb2ZGaktaUkZuSW1TU1hy?= =?utf-8?B?aGFTZERmaHMyMUxuSXJEbkFublFZY3FzZTAxVE42THNJelUxYVZRdnpOMnp3?= =?utf-8?B?eHMyNDdQWDVGM1NFS1hTYUg4WC9yak5PTjk1Kzd6WHV4aGVqWng5c2xzd1pu?= =?utf-8?B?Q3hqQzFIeUdtTTloM3dpNWYzWnNoSFhFQUZWcGVjQjF6MkNlQjlSSlN1NzNZ?= =?utf-8?B?SW9TY1dMRHZhczVUY0FsdHYzbHRpTUhrSDBsMkEyR1E0UUFkcTBrTzgxZkdh?= =?utf-8?B?Ni9zSGlVVUVkenlDV1luZkl0Z083UlNnQ25sNWRJK3FoUjhNb2NrQkhOR3BI?= =?utf-8?B?R0VMMFBua1RUT1dDTjJPU1loVmkxMnZRd0pRNjZjNHRBTjQzSDNOdlhUSytZ?= =?utf-8?B?ZWhJb2czQ2pPQmdXUFQ1dG9ZczdaWE15UXFVNFFWUTZuOXR1ZUk3eDR6bGYy?= =?utf-8?B?cVpYWGlyYStxOFcvVEZiRmJpejNiaU9KZG5tUlA2N0JBRmlPNHdYQjA2cGxy?= =?utf-8?B?cy90NzMrYlpXZjFLVzlTZCtiR2JIaTVnZEhKc2k3ekE5R2ZOMGhjMlZ3UkpY?= =?utf-8?B?KzVIU3BVWk12YXhaTjU0dmluc3hSZzBEZnp4eVBhOGF5Z3dCU2p4MWJ4NDlV?= =?utf-8?B?V2w3OWRTWnJDRXczTHNLMy9hR3gvQ3dxVHBqQ0hQcjhPWlpWSlpDNnRwUUZy?= =?utf-8?B?VVNpelhSYzdNYlFEWGlkcnFWckt0bTYxZnMvZXU3QnNNeTN2M0NCbnY0S1pp?= =?utf-8?B?KzhONTBPSG8ydzVFRDJxejJWZ2d1Rkp1Z1hKSmVmeGRwL2s4YjlpNitCY1BE?= =?utf-8?B?M3AyWnRaRGMvTmhGd3B0TTZaRjJyZGswSnZOeXFRNGo5S2xmUkowd2YxRzBI?= =?utf-8?B?YTNQUmZwSWp6dnd4SzFaVlp3b2laRERDYWt0YVQ4MGtyRW5ZWWpFL0sxZE1q?= =?utf-8?B?NGxiVUpIVERyWXVFSzVSQjZHejdhaWxVK3Z4VFVoUGtGWHkvbWJSS3hSajNl?= =?utf-8?B?U2dFcjZVUlRqRGV4VFBpNzkxd2xsRC9EUWdkK0ZmTGpFY2JQbk1SYXNqWEJn?= =?utf-8?B?TWtZV1MzTFFnMmx1aXNtQVZiaTNJY3J4Y2VEZVYwK0NHUCthQUppMWhHSSt5?= =?utf-8?B?K2huSi9xV0J5L1lBOTdtYlRQV3Boa0tid3BvZEd6bWRPMUZrNVRQejdYU1cv?= =?utf-8?B?ZVkyZ29uMEk3cTVWTTRlYUcwVzJCWWV1dVJ3MXlVQzdGWVJLOEtiakpLY1Ew?= =?utf-8?B?UTc2MDdXL2xhSE5mcFNRaHVrT2ptd28vMDljdVV5S2EvbHdrNzJLRlM4Mmox?= =?utf-8?B?TDM2T1k1c1hFSXVrMGJCT3pLK214U1lxSUlSYk8xNTd5blBrVEphMGQvZloy?= =?utf-8?B?TUkyWjhuZ2owdUJ3Wi9Td05EUmUyYlpwZE56MG9ySWxyd3QzS2tweUVMc3F1?= =?utf-8?B?V2JuSFljcUp5MjRab1VER3YwZjZQTkRHazRRdERlUTUvNXhHakhHOFhHbk14?= =?utf-8?B?cktBQ2Z1a2VPcjQxUkJMWDgxOWdFTHhVRkpDdnoraEJ6OExOenNlcGh5di95?= =?utf-8?B?OEpGbFdaNTlhZ2h5TEVOZGFBTS83a2cvNWJDVktoaVhvTzhjZDZmR0Z4R0w1?= =?utf-8?B?SnVvYURIMW5pYjhyajBqa2lkdnBSVExJRGVKd2xBZDkvaDJTZFFzdXdCUVNQ?= =?utf-8?B?U0lBU1lHaXJWRzRxZUpHZlBOQ1BRVkpBb2ttS21CaU42aElKV2NJbmx4NG5k?= =?utf-8?B?UWVuOVVvRGU3NUw2U1c3LzU5SlVQcWhrMTdySFhnbzNhR3Q2OXlHaXAxN2ZD?= =?utf-8?Q?+dhyBqxXUbyuMzDM=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0571cb9f-7b3c-4564-a876-08df36947c2d X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2026 14:45:47.7453 (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: Dn5POJJIgq9KOFW/MhNUgY5fCdYXqGInCo60a2ygGyf+kg7aoV9XzeJfmnVkrKEIqhi8ZF3S2wN7bQZVj42aIwKlVDpAyH8ysqOU2EYS13I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS1PR08MB7451 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