From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021092.outbound.protection.outlook.com [52.101.70.92]) by lore.virtuozzo.com (Postfix) with ESMTPS id 88FFE810A1 for ; Mon, 2 Nov 2026 10:36:35 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vS3PpzRRb1g8on/Zk25x0lbGEXSK2tn50lojssC7XifenHGtP63f0S6vFZc70uBAIvFHNUSKnwri5WrDElZDQ3QuYdB3qzqExYQsA6pQyku807ITFeLzsOOVQteA/jNLnmK9JlBNlxUyPYagBEzUvWofoVGsgyPWPxgQpP69vk9kjXDpN1KmLxroumzI0/owxHGpFShIl4zNZNCv8qNpVYHYlTUbPr4xd2Vd7Sb4wX9lOUktxya3QY0Yc51NEqma9RgdV5B2rshkhO/OY9O06lqmcWbi+eOuRy31Botarcn59V9PoP9Sh4pK5n6M5zL1sqWtVhyGr+qL06xs6zBbYw== 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=vAJ71kD8xpkEzQMz/OSQa9rjTW1iftDgYTyWFOPwMI2K3yIVdYwRUyTDNzYQM04dWxXCenDWT9xQfUYsgyIheBl7ohXMXFuFtiFMzsMDawTXfdeD9oahvym58gx0cFnEHUXWbimo5u7sR1oMafv3Y7jRPOUNfxeJ84qeApQxX942OTFrQHNbMm0YWP7JIOd5q3RrafpoJ/ABeBm72Gfi4/jzQUn/zl2ATzsnJbGKJDDElZk/v5wt3OmkSm5JOO+hcar5Fo/36T+PEXrPUBwESOoESVH74cQcFjprKQXFwtxsOyjTGI4ctYzTcqljW4P+Z/Ikd4FhVcrHyHY3Ol48Cg== 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=aeBsVVG5xlSYjPTpChiEl4R3K9avFG+GTz9MxB4ZMcgGGaoYcl2Pbx6fmPX0ksz2c2ze5Eq+2fPPDZ3l6Sxp8Xlk2ja1m8jaC01MsED+8+irs356QmM2p00PLsQP8N9eVKsnjvOhw7hxpwe2nVhH/jS8AaLRHLTc0WVUK2kF1x+UPGEYjZUofVmi1l4aui3RGVMLsm7cDgPerK4+V+qe16QhfN6JCtfjNTsobJLuFj/yR2kbx5O2OH9/yGiXLmNJFZ/GsXBtocL04SwbxLB4t0PtxrIxVihcSAXgZTv+0QqpK8vAwuxPIyap1GdrXE7qSHd3O9qgz28mz5YDG2icZw== 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 DB4PR08MB8199.eurprd08.prod.outlook.com (2603:10a6:10:381::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Mon, 2 Nov 2026 10:36:33 +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; Mon, 2 Nov 2026 10:36:33 +0000 From: Andrey Drobyshev Date: Mon, 02 Nov 2026 12:36:33 +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: <20261102-vfio_v1-v6-18-9bc7cabc850d@virtuozzo.com> References: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> In-Reply-To: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0048.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:353::18) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB4PR08MB8199:EE_ X-MS-Office365-Filtering-Correlation-Id: 38fdc053-4316-4c03-c537-08df38cd2714 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|1800799024|366016|23010399003|52116014|376014|38350700014|5023799004|56012099006|261009223027099003|261028144727099003|261021123027099003|261026121527099003|261021121427099003|261026140227099003|261022105027099003|261022075727099003|10067099003|18002099003|22082099003|5113699003|6133799003; X-Microsoft-Antispam-Message-Info: 3/FCCogGe0WQhZucJN/hzi/YQVOg8vCdjToT321Wjmxf7eQl6g/RM/AcHU+0gR0OxJGmH06teDoZtilQVDHDi7jakQ+jxQ++loCQcBtIVSu12+hkwkn1mx0GUG0n1ZoUFdMu51htUWv7WwlxwmNTET2+/6vwD01XQu2INZcvJJMr7838GEPqtmiaFwoliQvpaBUX/fQSkK7y1CrpJgzp+jGUTXUxTaJjZnz6R6aWF288KSSikcWzy86Ug/KWfj1+WssMjiEXyssYhox7u7a/llG1zC2DLdVEz2RPKmfsbtvtyvnXyLGFHLv9IQLJBftybV3ua0P1wtnIAbenAMGs3w4XB/FYlxVMBi1XknzkNRiZ/u3zfsDPG5gMCWcRl+dbZDFbyhnVigYuiRUj/CL3cRJ5Kqi0F2KzUlonqYmQqcGZBafh/xhqrrVW74FDS0sb5IuUvr8zwtwP+bAPkzVCeH0mncY0Uq/MeGcPmB2RzjZpsOtjWNLOqTun4DZp/7DxudkvkoweeszsEn4BBIO74Spm9lMWBsa4ggD8as7bzRkvqGcG14ufrxndxeCNIhKCQtTi9Q0RDVpZmQKO0TcpiAexq0FQro6Lp8jK2kd153OAuDOdem0EyXANVoeKpKyGZQNlzV8y+m/yKMpFGDkUNQTxIu8Yj2GNtarDP0kNKBvF66UyYQUC+zUVk8Y39LIf 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)(1800799024)(366016)(23010399003)(52116014)(376014)(38350700014)(5023799004)(56012099006)(261009223027099003)(261028144727099003)(261021123027099003)(261026121527099003)(261021121427099003)(261026140227099003)(261022105027099003)(261022075727099003)(10067099003)(18002099003)(22082099003)(5113699003)(6133799003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RXlham1JdFZTbk9IRklXaTdyMVdkaURQQitJdHRIVk4yYmhVQ2RBTlBMOXln?= =?utf-8?B?QWgzQk5kRVpyNXVVdXRrQUhrSC9qazJkREFxVlErZnVoWjlocWhlTS9HU0Yz?= =?utf-8?B?NE1oUDdENDBsOC9JTUZsUFNpc0d5MVJLcVU5YW9VdnYwcHFtNUlFOHgxeSt5?= =?utf-8?B?eERCZTBqanExajNKL3hYSU5GTS8wWFUvT2t1TkNRb09BWVgxd3pzZVcxaEJO?= =?utf-8?B?TDI4dXd2a0Njc2l3VWxCTkxsN3BvRkZ0TlB5aE4wdG5YNERRbjZKQnlDell5?= =?utf-8?B?RHlSMlRUR0UzSFRsdk9aeHFxVERUVzZtNVUvQjV6bzJ1NTJGWWpxbnJ4UVZU?= =?utf-8?B?UnV3S3lpT1lKTlkzZW9SU2NHVWs4cXVUSkFDMmsyd2tFTDBuVlpqSDVtVnBL?= =?utf-8?B?NFBkd1B3LzFxbjVkOE5nV3dUYUVoRFBSQ283Y2hjdmVtdEJFS0xQZmV3WjRp?= =?utf-8?B?NE12ODdVT09pVkFQWFpRejNVWEwrKzVSTXhDemkxc3BBZTYrOCtLekRxWFJa?= =?utf-8?B?RTdOU0VPMGFITW53K0ZPc2NMeUdIR0VBVVBIa2Vka0hjdExENmhWcFllaGdz?= =?utf-8?B?Ylk5YWpWeTZUaGdGbUJNTlBCbVBxY1FLcWR5QkU0WkVHenRZMk1jUHpyWDVG?= =?utf-8?B?aHVrYklISFBtZk9iS21vRWduRFBuNi9zbERiekFxK1BzZHhSUElyOXlFSGhh?= =?utf-8?B?U1ZmYXRPWVF5UHFVUjZQZ0hFNTZtK2VqL0R0ZlRxVGN1U3crQmVHSWZGdWIy?= =?utf-8?B?eURqb0J4NSt6ZzBtMGlsZVRWL2E3aFUvNzBBaUptd09vVVFZcDRFdWllZGlz?= =?utf-8?B?UFg2dCtnZ3N5MU5sTFE2MmlsSGt2MERndVlvOFpVV2VFQXlKeWttUnZBMms0?= =?utf-8?B?VUk3VmdDTGNaYWdXVmMzanZzY3lrSjRIeGFGMlZuVjFOR1RUdTc5MVhVRk1N?= =?utf-8?B?dWwwSTZFNVJ4cFIrSmxZYSttOXVRMU9MMlRzUmp3SjV6MVAzMGN0cEExNWJo?= =?utf-8?B?SFZIUE5icjBSdmpQWnh3V2J0Vk1WUGlIU28zMjlpZ0p4NWNBL2FpMmhVcEZ4?= =?utf-8?B?Zk0xR3BvT1F6d09rMlJQNzc1M1hjalFpV0p3U2lrSUNNbnUwMVRtZ3V0Y3VC?= =?utf-8?B?ZkpRd3BsWHhtamNpeldOYUZSWGEwREdwL0NoQkNWT0NLUEE0akRtL3RYS2ZW?= =?utf-8?B?WUtFMHFOaGVadWJKUXgvZXVRNTJ5M0RaZWlWOEdFQVNoUmtFQTJXSnBrdnkr?= =?utf-8?B?TW5RVHl1SGN1UTloMlN5WlFSd2hJNWFORkdtbFZTUWJ6YXNlWUdwZkhCc3dp?= =?utf-8?B?RXJBcDMvdEVPekU2c2dsSHRrR3F1b1lPNndjTnZ2VVh1NTc3T2VMQ0J5Nlpv?= =?utf-8?B?RyszK05IKzJMR2phbE0zRmZvSFI3TlZjUTFncHo1S25qTlYvcXgwMWJ5SFBM?= =?utf-8?B?cmdqMDM3SVdwdUVpb1VNeW9jWXJzcjJhNXY1R20yL1B1UjY0bWVDUWUvNW16?= =?utf-8?B?OVlPekRlcmRFOVR4WThPQ2l6Um1CYUR2Z09OZlJWTGM4Z252WjgvdjFmckJq?= =?utf-8?B?OU9IWEoySnZwMmdFbDA3bktpd2E1bEpkSk0xdFdWNEIwUUpjSUtQQ1M2cmhT?= =?utf-8?B?SE5iNHlQSGJQbGFlbnpmRzkvcWwyMHVPZ3NydEpQMjZMRmVIVUJKWk5BTWdr?= =?utf-8?B?QTJvSklxQ295ZXhZVFZpNEVzM01EYVArUjZlRHFKaHNuUGJNUHlIS1NBUWxm?= =?utf-8?B?RkYzSGxpZFhnM2p5M0I0a29WWVdvOC8vYmt4aXllQjZYTk01b0dCam1pS29Q?= =?utf-8?B?eXd6bjZOd0p4cUZEUE9OVEJ6TitPMGx6dVBrNDBBNkZUSGxpdUdxVlRYbmk5?= =?utf-8?B?aDY0T1dVNDd5eVlHamc5NnhFdndpTnVUMnpnWUhSNklGWm5SbUhUNjNzdVQz?= =?utf-8?B?WTVIYWU5THFJQ3pBbGJ0c1p1OG9FUllOc1pyYURWbDlMTnVSdDVCeUxSQ3BP?= =?utf-8?B?UVJUNjhRQjYrMmFxZmRUOUdpRisrOGxzNUhscUlpRDlmTTJmZE5mVTI5TEV5?= =?utf-8?B?dURITm9vYUVzU2FVWkJmc0hkS0JyNzMxUU1sRitsTVFPUW5Ha0R1S3JQWUxr?= =?utf-8?B?SkM5T3d6c0Q5NG1xQ1ZCb1dPTzFFTnNzZUE1WUwrdERmdzJwcWFYQmRSWTFX?= =?utf-8?B?WkxJN1JKZGNIQkdYd3VWai8weVVBcUYzQ1BqNmRDT0NGblRRUUcyZWJGa0Y0?= =?utf-8?B?SWxFRVJ2a1NQRWd3ZGkzQW1aVGVVQjlSMC9Eb1pxMnFXVlhxUXBpanM2aVBZ?= =?utf-8?B?L2tyOGNUUERnM1p1NmZqTGEySUcvY0p2QTVGT2VpbG9Dd29wcGRLVCt0T2Nq?= =?utf-8?Q?tPBcbgesWWJ1l6GU=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38fdc053-4316-4c03-c537-08df38cd2714 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Nov 2026 10:36:28.6863 (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: BuA4XGFTb1UcUSOR2XK0oLwIpexdkPh5+ZFQR4KV9l3QfZEsqZb7UfRE3DNYFdpgM1aFpHS/7RhSPGGsyTB4tJsHPfRqoGyX1zEvSvjQ+CY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR08MB8199 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