From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023116.outbound.protection.outlook.com [40.107.159.116]) by lore.virtuozzo.com (Postfix) with ESMTPS id E4AAB80CB5 for ; Fri, 23 Oct 2026 16:54:44 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OKn/CBgjZov8lHrDYqHc9KPA26ScNHLib2IatUo1CZT4+ErKCZLhvPOEBOYOUVn3qs+sLSetPR2PsLSMFv63wlNg4glYjHVRuiEJc/tqBpTG7wiMLEBe9iPvgiDP6c7jrEjQjU28rqoxKvLFvuFROSqBL7USwZr2q4/sjINV0WQogmL0XXMsEu0H+lmu+XiI174hG9IcCx6dPyHrP/yqdS/1XsjLSKTF9at2XN33FF4RkSVjoXiwsVml2+BOx3RRw72OwWNO2tzSoCwidy80L388cOkO6z38IUi6Wvq/XL2XPrassb2TQd12vpWYfGPN1OGkgpJ1vvSBlBb+PfyWPQ== 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=a7qcK39N7prKnrvTN5yGYp7fNwnToh6XFFnUACnIQv5WVB6ll/5sJ0P1QLnuMStehYHXBQa7KZL5vttHp9tFjQPpE7Q1ktreCpDQhMlQRXNlGDp4wd8g9V/YG/jwUkU4EYl4b2UGA4jkDe2DBgkPaWttpJ6Fmp4hL5iMMg9vro+ML2W1HJABrbDayslnj/GlpGNiVNpV6/RdQ2AJh5H7/sXORJwxWtxHuYVuFAE/975sUu+M1HRAuSaE3nBQ+xIGvMlU92lo/lB6tYZcq5WqMP4u+CnkYP8KB7hu+x8IxFhOYIDBkjVLHW8jLPRavQ5MMVnHMuh9UrEZEYagVGpDFA== 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=nhvykdWBbcrCZhgmq6Bld2wAGkigHi4G/K8HssgJamGGx4Lv2QezismsNEBoBtbAYKDBrEgFvOJzKweY6i9HPmzMmepu+FxweQVHawc1gLHiXiXJhZJ0Lufrup7LfT6FZz4/RbW6ujfHacM/HRs3mTTo+A+n0IuhCRZfTDWac4H1kJfOuRrsx+PVhdXRXHcYzFjwvEYCtRRVcHXdBp1pO2g+9P6vy2f7L5+aMFlFQ528D/xBZma/9TxZzoJ0s7ado3l4KXPnV4GoT543M00S8K+JBpMhTJY2YD0Un9KAoC8tQFvMSRXe5ijHlYQPgz4fUwN/qluSfpX4+BkqtonKHg== 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 DU4PR08MB11747.eurprd08.prod.outlook.com (2603:10a6:10:646::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.19; Fri, 23 Oct 2026 16:54:43 +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.017; Fri, 23 Oct 2026 16:54:43 +0000 From: Andrey Drobyshev Date: Fri, 23 Oct 2026 19:53:55 +0300 Subject: [PATCH QEMU HCI-8.1 v5 18/36] migration: yank: Move register instance earlier Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261023-vfio_v1-v5-18-ba0bf3c6d122@virtuozzo.com> References: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> In-Reply-To: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0902CA0027.eurprd09.prod.outlook.com (2603:10a6:802:1::16) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU4PR08MB11747:EE_ X-MS-Office365-Filtering-Correlation-Id: 40b95063-a554-4ad0-c3fe-08df312650e2 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|1800799024|23010399003|376014|52116014|6133799003|5113699003|22082099003|18002099003|38350700014|10067099003|5023799004|261009223027099003|261022105027099003|261022075727099003|261021121427099003|261021123027099003|56012099006; X-Microsoft-Antispam-Message-Info: HjQpxkV0ixPLfRljppfYO1cuEIxxVD/kh8LTh/v1M8DiDCoh9xuAoFyta7tGble2ltPH003Q2ymtbSY0M7/yV5L5hDJAO4tK0P7PMZvpOFk/aJmWRblV/Q15FWLUrlJNFo1xqMrXpWWxlVRviPH7CAxlYMNbQhV90q7kl2r6dVmnHNrUDGkUN8hxi5eyPrHYAQRcqmXufCY9nuDQMH4XiAbyzYQ03dEhhmhPi+hZ2rSP8CqV9AH6+yhbAMoiQC+wzVSSgCXN14NQR2pVf6i4cvf8gPiaOXXk3G6S2KHN3TAqcsJy49qh5MYhMHhZ2AHLp5b77J9bFc0kiOUDZhotHs0pJVDokR8s90bTfluIlfM7ovjfurwkMStHcwbUZdILqU/dMRVHYX1T+BXPZDsQQnx6q4Fpu0i+733xGSSgMyTHqAJjWiQFzZ1y8OMHjoKGNkmKdzvHjxOgZRazHwOifCYiFTpUX0PYByn1sIVn7DiDwvE0bPBVtwV+jSqHPW1oB1FhBx5pcZxC5ODTMoamj17fBRYsZKiGk5Sj6lsgyTq2s/jtx2upp/rhR2uIgkRrzXQRY8APYbvcjFNieT9/bhojwHb+Odnp1A6CzAZSioZn5Ad52hwnRt1T+JLEo/b/SkH6UOpeqVp28vW9dftb9Umwuk+mz5FTM2JeOceJNQA= 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)(1800799024)(23010399003)(376014)(52116014)(6133799003)(5113699003)(22082099003)(18002099003)(38350700014)(10067099003)(5023799004)(261009223027099003)(261022105027099003)(261022075727099003)(261021121427099003)(261021123027099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?a0R3SUpqdnd1ZlNKVFRwWmYrOUl3WElnZzNRYUFFMzE3WnB0VWFIVi8wdkxy?= =?utf-8?B?OFBxSzNWRUZOb0JmZjB4ME9HYUNwRFdPQ3MySEl4TEhNdDdkQWU0b3FQalg0?= =?utf-8?B?eFVMYStUek9oYW9WUkRwNmZ2MDBXdFFtNlZwVlIzeTBjdEZka3RlOE8zTmpx?= =?utf-8?B?Ujd4NzBSZHEvKzBBK203MUlZcGFMYUhrN1QvK0RIVERLaFEyZkZPVXVMOU9n?= =?utf-8?B?ckRYb09jRTZYTnZQWkttQnhNQU5hSFNOSE1jdjcwS3ZLcVlIclVWc0JlNjc0?= =?utf-8?B?TEVBLytMUTRWOUdCQkxFb01qb0w1RXpEYUdEaGk0dVBLV3dLUXlrbEVXTXAx?= =?utf-8?B?STB6Yk1VbzlkL3c0c1pvTy9NN0pQeGRSZzlXeXhHaHV2SFozR0lHOC80Qis5?= =?utf-8?B?RUJsQkdrNlJaRUUyaUdCN0RoUURqOGhZdENJc3RYUG9FNFRlM1orSExTWFJz?= =?utf-8?B?WXp4QUpYblgrRlAwVVRKSnkyck1QbmxxVEk0a0FvaGdzbzkxS3NFa05ic0k5?= =?utf-8?B?SDhrd3Zna2libjJ6cGp3TnBLNitiNmdzYXQySkNBemdPcU1WY0hnMjdGdnFt?= =?utf-8?B?ampkWGxUTVVEUU9IelhqY1hZOFdJN3RhczZyc1l6U21tWk5mb3QwN1JGWFd0?= =?utf-8?B?SHNXMnAyWmtXSlB2bFNOYVpvV0huQVJneTZGRzNqeXFkdExCaWZUT0pOKy9Q?= =?utf-8?B?ZHlSYk1SOFhpbERMRkhvZjdkS3dBK3BqdVZlRU9DNnhXTTJqQWgvaytGbmN3?= =?utf-8?B?dGYrTnVmVld2a0c4cW9jOTdmR0F4bmFRaHZmSnlWZllvZEY1bzB4SlR6RmdG?= =?utf-8?B?VlRackhuQTdvRFJoWUh0NG5jYnhrYytUUThJT2xSYStwVU1kbzdGWEFxRzZR?= =?utf-8?B?bkRmYUJsTXphNDBMc3EyT3lJd3FjaTVOWW1HNHJwY25ua2JCVzVWRGNvSmlR?= =?utf-8?B?R3VJMHVvajZRNHVDbWhXK2I1NXR3WjhJazFrN1R6QXNGeUowbndnelhtTlBC?= =?utf-8?B?a2xJTmN1RFRIbExVTE5LUXJIank3djZmays3b3JRaEpWOHdEa3J3WVhtWFA3?= =?utf-8?B?SXBqNWVRV1NCc3pYNitNOXcvWElpUEcxWXVpb1l6Qm1YWkxkMncyYlFjTmRj?= =?utf-8?B?UlJYL0ZSdU1JNU04eldkQ1ZJcFY1ZnRZckR2ekwwTzd1RFhYZFJYQThybm96?= =?utf-8?B?Umc4eFRXYWRZaWVZaDJUSjZFdWxqR2RBaWhlNG95ZFlWcmlxOW16Sjh5T2Yz?= =?utf-8?B?Y2R0K0k0OUZVa25yT1FVOGc2eUwvWUpaTzhrSHk0cjNlZGNsL3FiT2d0N1hy?= =?utf-8?B?cUtlSG16eUpGMDEzbEc4b0RKRmRJYXk2TEVqVzJnVm5idVFRelMxdFNCeDA0?= =?utf-8?B?Und3OVNyMjBhbTlEdHcvdUxhR1U1d1dGUGpkWjFYaC9aaGRqL0ZrVGRYS1lS?= =?utf-8?B?dW85NFk5cFZDMXlKUzFNbUx0alpCKzJESURhejN5NitWY0xmcENZTXlLOUpX?= =?utf-8?B?YXFaSE1BVHdVYjR3aVNxSWdqeVZhek5ENTI3KzdpZkpwNjdsSGdqamppZER2?= =?utf-8?B?cHNVZ2V4M0dxVk1lbURhTFhnejFtRnhiZnZ2cDczWEhVcENYbkx4TS9GazBp?= =?utf-8?B?bVJUZW1TcVBPdVM3UlVjUm5pQm4yc0U5aDRvdnZnclpvb0Y2eUt1eFpnZ1g1?= =?utf-8?B?S3paOWpocEF4R2QzSmpaMDRaaFhyYzQzYjFLaktQQzBNSllQMjVidkw0VC9x?= =?utf-8?B?NHhCVFU0Qk1IWElCcklZc3BWMHo4SXh6dGRRN3A4dnpBbkxweGprRHlJRzZu?= =?utf-8?B?N0ZuRnBTSlJHRGh0bENvVjl6NXFkbUNKVERJbmxtNks3SWJNdHF4bVE1UE0y?= =?utf-8?B?a2xjamV3SlNuTTVYZ1RZalhENmRXUEo5NzdQb0hDSnExK0lxQkpDVGhKWlhs?= =?utf-8?B?ZEl4Q0cremtKQ1l0V0FQV2NpSzhYU2h2b3FEYnJ3WWlFMGk0OGFzMzF6U01N?= =?utf-8?B?WjE4OXF2dVdpZlBhczh3L2k3cy9OdGtseFovZlVyZSthNmpSZDh4Q1ZIV1Bn?= =?utf-8?B?M2NWZlVHZkludnl0NEFKNEs2SmlnNXVhM0VCbEhvVE0vUWIzRU4vTEVUQTBP?= =?utf-8?B?RGt1SU1lMU9KVnBBS2g3b0hYSCtzM2YyL1NhWmFvRjNWTzI1dkRCeW5iVGxW?= =?utf-8?B?NEU3L25OcnpBOGV3eDdBZlZJTU9MeHphSjNnTkR1UzYyS2tYSy8zZHQ0RThj?= =?utf-8?B?S0lOaHU0bnRmUHFPZkpVcVNDS1g3NmxHZ3Y4NlFLYWhYOUs1WW5HMCs1UU03?= =?utf-8?B?VlFLeGxWYVlzWGFlRjBBREhJQjZMaUNRaVhDR2M3UXBQTFVXY25nSkZQcVRF?= =?utf-8?Q?hV0mz4PEJGKXxAF4=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 40b95063-a554-4ad0-c3fe-08df312650e2 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2026 16:54:34.8442 (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: KrhNhTV2jtxfeMjzw+Yef+O/GezrI9KiQJKYjt78ToFz3gMwyA6r/8KKYJ2Sw9HO3M0z/LuHLu3S/nLDIlCqUu/0nRY3duaZpemHTx6rrmE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR08MB11747 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