From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023090.outbound.protection.outlook.com [52.101.72.90]) by lore.virtuozzo.com (Postfix) with ESMTPS id 1F5BB80B0D for ; Fri, 16 Oct 2026 15:26:17 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=M06w5RT/hqFcRaqazwW/c+MVBjRxn9emvnbJowLJbz7Dr1q6cb9nwz7wOMZUD79KPazidAOBXV9PguebRcNq/yYD6wf1M8rxUJzHrCJjaOqYQaCYP5aT5Yxh+gxQhsofbAmENWyDYsKbFyBhvcAkLTrAjQ5Pxna4GEdRh6pMuTbimBa8ceksC0ef1297//vqz0uscj16RZOQHoWtc8BkYn5WJymrukA50TZgUb5NiDPwwRITgTQnxJWgOK76RYPLa9o+N5N3CnrdcNQS/4d6yayj2cbeEgqxlo3Z2MK3wt8Y5gIXbwFQSySSSkNMQA4/qH5ISMhXPDc9LSh0J8P3RQ== 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=rLxzgouo5YJcGXAV9ynCI/M8zWXUpV2JhPKERHHtRYk=; b=GhChIM1hlowp7LXXd2iOCc/kakD2iRAaR3cce3gzYD7nlMVT8KaJ5NDy6zfiCnZkMfWLvd+eN5hafTABsSTpIFN1NQq/l1xA5Ij/ynLauORkZmWilL+EmkopDoEf+QkXVal316VYI4PEPmKFdVFINotLR+UXllJtUH4rFsEuPcgw5KNqvEEVAaIL/flHQj7pNbmYCCQbCEdVbyL3IitnBLdsDLmgeKuenvYOWqA400ZwuoaPp1NPd4ctbfOlhcI3lxiaaE4cFErauICdviGJYcl+zE52ZG7sp89pikVq/eYJEq9SORY/xekf13KwXMIb3bowoPnb1iOw1z8xigMKDQ== 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=rLxzgouo5YJcGXAV9ynCI/M8zWXUpV2JhPKERHHtRYk=; b=qaJrDfLjCuKG6J5SNow8EHlA8UjFXDptDVUODaOHtovCNa8fv1olNYDLqXQAsbCWS8QUJWIFcHVIlDy1wSx0ke6vNhjmzbKVOIlhlh8PRMI2RFzc6s/qxjQl+QDJag6B8n22v5WkM5wqRf/4ogu+J2x30Qko5UgF5EXB4xKAB7jJsfztTNc6kflPuRVR466a3J0LvowL32/+TrNRLXb7JGdAuFIomWeGU6SZQe0xqIUhsU5vGRATMD73vyBF9dtNf/UO3mlu4eZTzwgXpzhH9SG7EsiNRx+prOEhHFsi1IULSSZVvhjt1risBYh85cluD3FHstT41XUgFV4+aiXRIw== 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 DU0PR08MB8907.eurprd08.prod.outlook.com (2603:10a6:10:47f::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.9; Fri, 16 Oct 2026 15:26:15 +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.006; Fri, 16 Oct 2026 15:26:15 +0000 From: Andrey Drobyshev Date: Fri, 16 Oct 2026 18:26:12 +0300 Subject: [PATCH QEMU HCI-8.1 v3 14/28] migration: yank: Move register instance earlier Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261016-vfio_v1-v3-14-47487cb5a8e5@virtuozzo.com> References: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> In-Reply-To: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR10CA0088.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:28::17) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU0PR08MB8907:EE_ X-MS-Office365-Filtering-Correlation-Id: 94aba2d6-9e0f-47f8-fa57-08df2b99cf20 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|23010399003|52116014|1800799024|366016|376014|6133799003|5113699003|18002099003|22082099003|10067099003|261009223027099003|5023799004|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: +2/ITqvNJO8UTd9weSoMeeBPZqPn7s07wIwFcOscArkjF1KBDKAZUEl8K6kZP4cCydw2MWgCgRT4vEFvLycjNIwxAGsP/eRL8aeCy9bo4nvio5asSpKn9xdWg1CpbYo4jBoYdV8SmkW7Y/zo0d44F0H+/md/BUejGPpREzHxNHPbYVllzESWwuasQ4Sd3g/5ETHvhJC0SbX9Dtp/0piyHVfaz19vrI6JSs8B4g2mNLejF2ogJvaT2ocUsC8fKENLKfnKZF2mWqdtO62DyGGZ0DfZH7K98Ht5VcOgKUUa02ZghDm4Wz17SXkKiYXQYv2rVTIBYniogBz8CLyAM7RC0vUA4CTIePcbknN+yEZuGZ31fwdsGuNJKxNXBR//aZs0ucv3PvH2VUHuP1XOBFwlPGFC/GhGzu154uQSxdCBGmuxZ8Id81HTibKfuRYwluyPEFSWOtkSlQ+/shY2y85n372Oucn6sC9OdjWprekhJO+hKql5+yDMroVtN4SSgQ+8lBP25ugT418pqHzjLUi+EXExe3H5ox3+vmbgoXGhMET+uYC66cfFGdEzNEXndmKnHxHtaynAvRDRY6FzBUs3icgYdRv3nI01JdKum83tHihPSKwX/dsKzQIisu3CUAW1LYPhfryzqJI0WJFLojM4OKOHktZbGNsSNmyKbXGfLD8= 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)(52116014)(1800799024)(366016)(376014)(6133799003)(5113699003)(18002099003)(22082099003)(10067099003)(261009223027099003)(5023799004)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NnU4SGZZanE1cFdsaE1OUWdCMVhFWDBNWFVNUmhUMWwvQ3NCTDNuUFNFUm00?= =?utf-8?B?RlNCZzg3ZVRsSWdKREU0UHFiMXh5QlFtUTdpVDhvYitsMXhrVUlWSUUzUlN4?= =?utf-8?B?RXp3aDBOWGh6QUYvTlNoS3k0a0p3cm1qRmpBSzNyVjJ1R3hiOTFhVXVtZy8x?= =?utf-8?B?N01wTGtHUDQrWFBEejFwclBvWXE5OUVmdC8xcGdFUFUzdWhLNVEyMW9DOFgx?= =?utf-8?B?bWxiUnlxUGt5a0hmRkNkZVdWNFZ5QjkzcHJnSzhTVFJZNVhaNzJSazgwRDds?= =?utf-8?B?eC96MFFHWHl3L3NwSU5QTTY2VGJhd2hYN3ZzdE9RQjgyMVdIcTliUTFkYjkw?= =?utf-8?B?R2FIcDJwTWxBRnJPUnJzNnc5TEdCakZFY1J0U0RwY2UrL1FadXNmNlZzUGRW?= =?utf-8?B?eW5mNjh1OHhUNnMybXZ0ZExNZS9zMXh0dTVzbUJObHgzVlA3eUJNbWh3NlVs?= =?utf-8?B?VFJ0L3dQT24xa2JyaFFWc3ZTUGhSTFJWSkRwUlVMQUpIZU55M1dhT0xNbEN3?= =?utf-8?B?bFNia3lMYUc4ZldRNjlxZDY5OUZ1andzYURDL1ZySzlXSUFwZzVkYWdQRU9S?= =?utf-8?B?WUpVampqZElrTWtYUkFhRVVVbytBbUpxUHpPRGZVcmdXMmlyNjE0TDhDZ2xZ?= =?utf-8?B?ZFJrT1FnOElZRUFwVEJNWXQ3MllTWllkVEd1VnM2RHNBVUxxbVVKdHViRnFL?= =?utf-8?B?ejROQ0F0WC8xMlRkc05lOXoxQytvdFVRSm9TZS9uME5hSFFJMk1meVdMRyt1?= =?utf-8?B?WmRncUdHZm1UVEN4WmY3alZBOHpEcFVwUmNJUmRBMzNXYS9GSkdjcVh4STRK?= =?utf-8?B?andxbURJTHNVUmhNcExNS3NGVU91bWtkUnd2dXVScHFMcTlicTFLbi9mT0pp?= =?utf-8?B?OGhyZWExaUorcGtqMWNmNWVOMVlhalZ2aHpOV0d1NXp5bmpLa2FQZXphUFRl?= =?utf-8?B?NWpqSGVRNTVEU0taMGF1aHRpSGs0bDZQdFprdis2a3FVUUlDanJQcWoraWZo?= =?utf-8?B?YmFBa0VmelJLeVdza010bTF2bEh2djhIMGp0OHRMTGFSbVo5VUZIcjZ2bnMz?= =?utf-8?B?UEtzeDZpcEJxdjdnMnRiSDVrQ1plYXVYTW1XSWljOWRjcGNTOEIrWmR2WW1N?= =?utf-8?B?T005SG92U0YxTTRCZ3ZuK2tNZjM4ODBzcUVMcEpSNW9uc1M0V2p0Y2ZCNno1?= =?utf-8?B?Yk1qLzFjWXhIbWVGNlFBV3hIbXlvVEhzbHFOaUtSVDdGQkQwSlZCSldUeE1y?= =?utf-8?B?VzZMNnE1b1k1eWkzcGRwQTVBM0VoeTJKcGhyVTlsd1pFaVVWZFlxOFRyUHhw?= =?utf-8?B?VEowRUszdnhBWXpScHJOQkY5aUZlaFhQaUxqNlNTRHZKRnpxMWZsbzhpUmg3?= =?utf-8?B?aGZ2YXlPOHZvSUt5amp4bUxBSXh1TkZjUXFiYldCV2ZQb2wrN3FCb0hRbUpM?= =?utf-8?B?NXYrdTE0R1hCS0RVTzk3T1d0NzdvcmU3TXZQcndoOGNna1c5MlhEa0Z2cWhy?= =?utf-8?B?OTZxMnp5cjNyVHlRekpveXJqMGgrQ3ZNOUNiajdrd1pJUUtVNENwU2MzUmxl?= =?utf-8?B?K0lNdVdFZUNTeWp0YURzQkEwblFLRTJJM0ZLekI4NzhMVFR1RkxnbzNIajVH?= =?utf-8?B?SnR6TEVKZko4eHp1VnpkRDVibWEvR0VPeDArQmFRQVJuMnhmdVYzdkw1OXcv?= =?utf-8?B?eFhBOS83dERhUDByUms5dU56Y3pwcWtFNno3MVJmb1dYT0dIbjBOQ2ZCSXVq?= =?utf-8?B?bXRDSEJXSFlabXV2K0s0QTJDcndXMzJnRXlXWmZZWlNxdkFHUS8yZ1RpVTF2?= =?utf-8?B?eS92Q2xVRzN5NzVtVlVDMXRVdHhmTzg4eXlJWFd4MXBYUHVwZ2o4RmpnSDdv?= =?utf-8?B?TWpQbzJ3N0wwWVBtM2NFeFpZYlRsWnExUWJWeHdEcUtjVWE2cUU3aEtNV0JH?= =?utf-8?B?dG9QZlYwRE9mVTVlZXU4dzMxZE5qNjI2c05YTWNUUi9ZYXZYNzBrM1NpR2NW?= =?utf-8?B?VmpFWkpXL1NVTWpQVFdJZ0pUNFBZRU5SRG9KbS9SV2tZcFlxSDZnQWQyWklv?= =?utf-8?B?a3ZyUC9BMklTR0psN1ZXWndPT3hRcmk2N0x0TkpDT3ZpQklhbEhoZUU1QzlU?= =?utf-8?B?NElseWZtK0pCVGNlK1hQZDdYbjJxbS9WNXNsa242WHAvM3Y2ajFCTWk2dTJX?= =?utf-8?B?M1hvTEpsaCtYSnJTQlBHWlRXUUtwNmV1RDdRaUdpUEdhWFV2ZkNid2JCT1lm?= =?utf-8?B?SW9CekQyV0lhcVprN041RVZmbE1sTHFFVHptQjlZNVo3T2lwZjc4VEd6dm9l?= =?utf-8?B?Tkt2c0dyMm1IbHZSQWxmVU9GZkpjVFBtNjhvNGl6OUxMVnhjK3lFd2E4TFNM?= =?utf-8?Q?n2Vr+xaf0W/jCOVg=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 94aba2d6-9e0f-47f8-fa57-08df2b99cf20 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Oct 2026 15:26:11.6628 (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: UXabyemZ0qyguw+2SS6DAxALu9xbHUwhhxbMRdHr9yi8Zog8UydoNViMl1nBFLHeXsc9B289+I2u2VjwhceT6kNKCeRuuSahpBFVKmn4J14= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8907 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 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, so registering it with &error_abort would abort QEMU. 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 | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 2f8ef20c036..0b830956532 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2174,6 +2174,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_incoming_postcopy_advised()) { + 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"); @@ -2235,11 +2244,12 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp) return false; } + yank_register_instance(MIGRATION_YANK_INSTANCE, &error_abort); + 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) @@ -2264,7 +2274,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()); @@ -2276,7 +2286,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; @@ -2329,8 +2338,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; } @@ -2354,27 +2362,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; @@ -2401,7 +2408,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); } migration_connect_set_error(s, local_err); -- 2.47.1