From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11020127.outbound.protection.outlook.com [52.101.84.127]) by lore.virtuozzo.com (Postfix) with ESMTPS id 8FE1480726 for ; Fri, 9 Oct 2026 14:56:25 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mFXV1/ROVEdhvpZCG5PoORPJj1FzAOb2+gbx1P/9HU02dYKW6ewKlKLz27hYLDnN3qkmy5jXRf085UGR68TU3Qv2InCF5aBGxzTnYz1SPj9NekUvqHR2bRRjsaMKR4ngYS+dLBHPdifdk8AAErQoDsx6/vaftwslKy2B8NyOMBnvRrQMb9IlwTBXMby8IKux9ULNKqhTN0ZquT01WN3ir/DEf5LNHCfrbsaxR8497JSEr0kuzW+viQp3Smfud4GWjwCatJx+4y1RIpkHiRArinm+kWy5DhpzzvavsjbPmHpsvkMc270WPfvopYwqEiJsfsbFgJlfv9zqb60L1WYjAw== 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=JkoNcuapoZzo6RT7D5ZCFs2aplylvMkt7161sR0pzvg=; b=MH1gQrOAfPTSsxntCSa2R1R/MTy7g7j3RMxyAmwjGueTM1YFLde/tAlepOnMWSDy3MuTnM200OKiMcM1OAGyHVXUzRW1bGUFBq+BmqfUvrrf0gNn0mTI44E5OKEcC8w9qZ1fKKVJuMjrJANlylKWorKm0V43evw3Q1ZjGBGa+4mM3J4FKidzR9VIUH/yr3I/ktUx26CutksgRiMZIUY8e+7c9ArMh6r2pFVa9MhEw7YnQQ6SXzmminDM7QupRTYps7T0GKb80JBaF4fXiZfNOk43vsdTPvS1ELgvFcg98hMwPgX37u+rFNPkYWOEWKGnFYFy0VhXUqBRfYCALcP79w== 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=JkoNcuapoZzo6RT7D5ZCFs2aplylvMkt7161sR0pzvg=; b=dWvQNzqrr0RqU4jcmv5YhS0c6vKMYeLfZLbr5XH/ZGsAI7nad8XscF9Uq0T5nvFCzBdOEeSmN2sweXXbjPmJ6tQi6zSCAPcam4FhlccgkJi8ZvXcISbBmRenivsI1/pyU6DY8EZ646ukDNthgwEFnnYD0gIc6DjdYd7YhIxNDQKnt65dVQa7EzsGBpk/jeDIQ5UocEGitC2G6wG+Wv5ovNxGpqeeP21+bdfNeVyBaRCvwj8vcEYwsZJFwGGAhQBLrRCe5TgPjNjyxH4Rf6X+P/4m2cH+7crwdE5xXT20yjEX9NVdoKcYEtVH51A6TdHVhuXTW0V4NHc7/m/wlK/VhQ== 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 DB3PR08MB9110.eurprd08.prod.outlook.com (2603:10a6:10:428::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.496.17; Fri, 9 Oct 2026 14:56:23 +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.0496.010; Fri, 9 Oct 2026 14:56:23 +0000 From: Andrey Drobyshev Date: Fri, 09 Oct 2026 17:56:11 +0300 Subject: [PATCH QEMU HCI-8.1 12/21] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261009-vfio_v1-v1-12-2ae91d5b8048@virtuozzo.com> References: <20261009-vfio_v1-v1-0-2ae91d5b8048@virtuozzo.com> In-Reply-To: <20261009-vfio_v1-v1-0-2ae91d5b8048@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0132.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:34a::14) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB3PR08MB9110:EE_ X-MS-Office365-Filtering-Correlation-Id: 136138fc-eea2-43f2-becb-08df2615749c 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|376014|366016|1800799024|52116014|23010399003|56012099006|38350700014|10067099003|22082099003|6133799003|5113699003|3023799007|18002099003; X-Microsoft-Antispam-Message-Info: qyG50d3wBoQrvNeks+30efKwbRYkPJlToUgAmt/RV6wRiLPMavlargky4sQzGIOsrUB25+hyWcPcJpElgw6m9D9xgBqVVjsf6u/vt/4j1Z4FhzckmsztKG/3TXvG8JLB9gEgD2Zhap/7f555uYu4bNXtHSvOfdpQDqLJiEXyXmTnX5HiWezzqHf9xmlFNr7W6Z1wbSm7tKXCNyFF/9koRFd51coF9yao69d8t4YkdU+sWi/7AZ17VXvJxnNDGVDeyh+rLUXveq1N6GtyHy2gp7H2CANcbvqdF6HtR6B4wJ9fC8YJhUuyH+g39b65Ee2NysHYoM9ZJpDe8EgRYXDNEe7l4/w+v18MEJIXE1ohK/rApiDPJj7REWcGqs8guVZCPMg/d1fCJPgV+6F8mFNUiV6gQqpC03wN6Io191NREkPRd8b6cqh6w0/e4Jt7I2Z8HqbhB4WuyDGUrOlUSjmKxS/2zjC4TasRNKhXTnJa2U8NgM65SgwAe6JBGffjQzL0xl3Nji8P0O2WjcRkD1EAJPBDq34+yxH9af36zYVTgb6Ha5hQ8G6OMoYAa5HoSRelRnVBLitDu6WfyIFjVIKo9RpokXvxFem8yADsA0yQjCGuft9ZKbiY/c1SvafbZZnw26UNO1D/uLY4uNbBPupRY1eRlPcnggiDCGXefAGhuD4= 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)(376014)(366016)(1800799024)(52116014)(23010399003)(56012099006)(38350700014)(10067099003)(22082099003)(6133799003)(5113699003)(3023799007)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZnZFOGVUbjRMR2hwUm5SVUN5NXFwNFJMNnJJdGtZSXZKTGhaaFBaWFoxSkwz?= =?utf-8?B?R0NRVjdhMVVGZE5mNitZai9DdFB4SExoTzh1M3ErMk5BMHpDOXhIZlRkT0dk?= =?utf-8?B?UWp6VzRwb1VaaXNJMTh3R25hai9GODZDZ1Q4d2NPeG5oOGJNQmlrNTJJM25y?= =?utf-8?B?QlNTZGpCK29xT1BUME93cllpOHFkTkJ0WWtTNzdwUkE1MUcwSUhHQ21JVnVE?= =?utf-8?B?OUY3QVNaRS95SDJUbWJKM204MlJvUzF0UDFrN1NUR2loby9ETUF3bEF3WjhY?= =?utf-8?B?S0hJeVZIeks4T3liR0FTSnFPTVZSdzNZQzZEeGc1eGhRSzAvTUsvREljb0Ex?= =?utf-8?B?OVlZWUlKeHN4TklxY2Fkamg4c1VIMFgrcUszVUptK0ppQk45YkMrZ1FHcG40?= =?utf-8?B?M0RtbzFCVkZiVEhTb2JZVjNiTUpFZjEvUjEwWVhXck1GVDYyeDEyb0ZTNTFY?= =?utf-8?B?d0xTV1BxcDN6dFZpcytvcDMvMWI3M1RFMFpRNTR3QmlNK3dPTjhQMit4SHpM?= =?utf-8?B?R0FYK0dtZUpuMGpTY0QrWEM4eCsvdEdTL3pBSDdKRHFDVUtzOUN4bWFCK1JF?= =?utf-8?B?amY0T05hTXhSQ1RzN0tjSUFEc0dqNGtDNC9QaW5MaFJSY1IvMWI0MytvaWZh?= =?utf-8?B?TjBCNk1YLzFhdHFOU1NJVEJkT09iUW1YL3BjZ2VFaFNROG03My9KMDF6bE41?= =?utf-8?B?M0RnRDM2NjZONXp1UHFsSk1iaEdZOGpiMzMxUU5Kd29GN3ByU0YwS1MyU29Z?= =?utf-8?B?OG1oeWh6eUQxa1ExODA3c1VWV1ZkZThQcWMwbDEwcmlXa2llc2dqNXhkNVQr?= =?utf-8?B?dVhyUzdyR3EwSS9PUXpQN00rVy9xYVdEQkpkOWQweWJxdW9vRkNiWDN3bS9z?= =?utf-8?B?c3BNcmRMaEFva2N3LytKT25RMUlFWnlTYUhEQ3V2UDgweWpMS2FFQlJJdS81?= =?utf-8?B?VGEvaVNnaUJNUndxUGxaREpZNXZwYmc4TnRuWFdldzVXL2h1ZXVtMkF1YnZR?= =?utf-8?B?VDBTSForNGJiYWhMV3RRTWVRZFhma2l1Vm9aTE9XVVQwUFBSSzUxdWRSRlRK?= =?utf-8?B?dFgzNm90ckJNSVZrREl4VWwza2cxM3doWkRBalNob21yVW1jc01aL05wR0l6?= =?utf-8?B?T3NOZUFUVWN2UFlpb29KRERPaE44Q1V6ay84YmVUb25mMnliSHFDanVIMkxE?= =?utf-8?B?aXVyc0lJWnRZY1pDd1ovdm9rdERaTHJMUWtyYmwvbzlVa21GQlpLbW12MTBE?= =?utf-8?B?bTlBbCszWlVUa05jZGVSczdudGtRL1hvbmxKQy9sY3NxMXpMOTBHcXhua0ZP?= =?utf-8?B?QVJqeFJVQTNMbFVnL2FmdEFXVUFMOEl6ZDYwbSt5dzAzSHFHSXQ0aUp1am91?= =?utf-8?B?SDE4SVZvdUR3bGxGUk9hNXJGQTdJVUtoZVBiTWp4RDgycldDOUU1T1FpeFFM?= =?utf-8?B?bmJFdU9jSFI4cjNPZ3FhNFZmSmFZTzA2alBSS2dRQzFwYUlvL2Q1cTUwSUNv?= =?utf-8?B?djZvTjdHdWZSdWpld1A2N3RpN1B5TUt5THQ0ZExoVnVVWk1SVERsNy82bml0?= =?utf-8?B?cnFwYUg5SVlRMUxHd1o2SFphcEtwRUNWbFBiNnAzMVFrT3BZQ2VLcVBQRDRu?= =?utf-8?B?NlF2b1diVzEzVzZ5dEVWREtCT0k4aFhZRDFQdFpLUWhjWUZubjJRY0JvblBS?= =?utf-8?B?WFY5aHVIOEF0Y29kUUFwdlhlMWZDeU5vOFNKZXBDMHEyT2g4ZURrcXZ5ekRl?= =?utf-8?B?MytleldYTHpXQ0JRZnNwLytSZ3VHZWxVNnJISjdxMkU1Yzl5NnNQd3FxQkgx?= =?utf-8?B?Tngyc2Fpd25iM0xQWFd1YmFPMy96NTNjRU1hOFkwek8wUGloZGZHYzJKTE5T?= =?utf-8?B?OVM3alpjcTNEb1RXWlNLOU1HR3l2VWxGTGhKKzAwbDZ0eTFnbGJXSzVYcE8y?= =?utf-8?B?RnNuMkQ4MUlUVnZXVjFSeHpmdmNydGJXam9vU2dWbmU5OEpqMWRwb2xTbjJX?= =?utf-8?B?TEFlU3hNbktMZjNqcktTMVg0UGNyRmV5cUFremdSSFMxY2J6VWU0K3FKMHIr?= =?utf-8?B?QlNwUEV1b2MrZEVIclVHKzNRZHlHa2x3dEpyUnJjWllOTDBzaDJrbkQxS1lE?= =?utf-8?B?UGJ0K2s3RmZwMUlkVmtwRWFFSXV5T3lOdy9ROFc3c3lIVzh2cGdBanoxSCtU?= =?utf-8?B?ZnlUNFRVK0JPa1pFNG53SlZrRkU2OHRUQVc4ak1IenZUU24wenphM09Ddjdr?= =?utf-8?B?UlVGSzVLM0lldGM4dHBOemlxRkFBdHYwUHluN0hHaHhVTVZEcHBjTDZ6dk5p?= =?utf-8?B?bFd6NXRKbDR5ZjNCZTU2azVSMExUZVZPUWlxWHhLSXdsS2ZOUm1zZTdTdHN3?= =?utf-8?Q?AugIydLOvg/Wgiro=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 136138fc-eea2-43f2-becb-08df2615749c X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Oct 2026 14:56:10.4074 (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: dFl/bF0AVwULfbpL2YEQEEXsEiFO9iIK/Qx1znqclzzPGG5Yng2SC4RkWbid0XpBHELgIvnNlQXT8JNdHyUw3GPwc8ODWJdgDIObNHOAJDM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR08MB9110 From: Fabiano Rosas Move this CPR-specific code into a cpr file. While here, give the functions more significant names. This makes the new idea (after cpr-transfer) of having two parts to qmp_migrate slightly more obvious: either wait for the hangup or continue directly. andrey.drobyshev: This commit was cherry-picked from the upstream commit f523e5aa5f56, adapted for the hci-dev base, which predates the upstream qmp_migrate() rework around MigrationChannel: the watch is still armed with the plain MigrationAddress from qmp_migrate() rather than main_ch->addr, and qmp_migrate_finish_cb() keeps closing the cpr state and destroying the HUP source itself. Reviewed-by: Peter Xu Reviewed-by: Prasad Pandit Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-24-farosas@suse.de Signed-off-by: Fabiano Rosas --- include/migration/cpr.h | 5 +++++ migration/cpr-transfer.c | 23 +++++++++++++++++++++++ migration/migration.c | 29 ++++------------------------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/include/migration/cpr.h b/include/migration/cpr.h index 8fb79eb0a28..ae441322ff5 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -9,6 +9,7 @@ #define MIGRATION_CPR_H #include "qapi/qapi-types-migration.h" +#include "io/channel.h" #include "qemu/queue.h" #define MIG_MODE_NONE -1 @@ -76,6 +77,10 @@ int cpr_get_fd_param(const char *name, const char *fdname, int index, bool cpr, QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp); QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp); +void cpr_transfer_add_hup_watch(MigrationState *s, QIOChannelFunc func, + void *opaque); +void cpr_transfer_source_destroy(MigrationState *s); + void cpr_exec_init(void); QEMUFile *cpr_exec_output(Error **errp); QEMUFile *cpr_exec_input(Error **errp); diff --git a/migration/cpr-transfer.c b/migration/cpr-transfer.c index 00371d17c3a..61d5c9dce2b 100644 --- a/migration/cpr-transfer.c +++ b/migration/cpr-transfer.c @@ -6,7 +6,10 @@ */ #include "qemu/osdep.h" +#include "qapi/clone-visitor.h" #include "qapi/error.h" +#include "qapi/qapi-visit-migration.h" +#include "io/channel.h" #include "io/channel-file.h" #include "io/channel-socket.h" #include "io/net-listener.h" @@ -72,3 +75,23 @@ QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp) return NULL; } } + +void cpr_transfer_add_hup_watch(MigrationState *s, QIOChannelFunc func, + void *opaque) +{ + s->hup_source = qio_channel_create_watch(cpr_state_ioc(), G_IO_HUP); + g_source_set_callback(s->hup_source, + (GSourceFunc)func, + QAPI_CLONE(MigrationAddress, opaque), + (GDestroyNotify)qapi_free_MigrationAddress); + g_source_attach(s->hup_source, NULL); +} + +void cpr_transfer_source_destroy(MigrationState *s) +{ + if (s->hup_source) { + g_source_destroy(s->hup_source); + g_source_unref(s->hup_source); + s->hup_source = NULL; + } +} diff --git a/migration/migration.c b/migration/migration.c index b1112556a22..81d5d4dd4c0 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -110,7 +110,6 @@ static bool migration_object_check(MigrationState *ms, Error **errp); static bool migration_switchover_start(MigrationState *s, Error **errp); static bool close_return_path_on_source(MigrationState *s); static void migration_completion_end(MigrationState *s); -static void migrate_hup_delete(MigrationState *s); static void migration_downtime_start(MigrationState *s) { @@ -1500,7 +1499,7 @@ static void migration_cleanup(MigrationState *s) qemu_savevm_state_cleanup(); cpr_state_close(); - migrate_hup_delete(s); + cpr_transfer_source_destroy(s); close_return_path_on_source(s); @@ -1661,7 +1660,7 @@ void migration_cancel(void) migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, MIGRATION_STATUS_CANCELLED); cpr_state_close(); - migrate_hup_delete(s); + cpr_transfer_source_destroy(s); } } @@ -2242,25 +2241,6 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp) static void qmp_migrate_finish(MigrationAddress *addr, Error **errp); -static void migrate_hup_add(MigrationState *s, QIOChannel *ioc, GSourceFunc cb, - void *opaque) -{ - s->hup_source = qio_channel_create_watch(ioc, G_IO_HUP); - g_source_set_callback(s->hup_source, cb, - QAPI_CLONE(MigrationAddress, opaque), - (GDestroyNotify)qapi_free_MigrationAddress); - g_source_attach(s->hup_source, NULL); -} - -static void migrate_hup_delete(MigrationState *s) -{ - if (s->hup_source) { - g_source_destroy(s->hup_source); - g_source_unref(s->hup_source); - s->hup_source = NULL; - } -} - static gboolean qmp_migrate_finish_cb(QIOChannel *channel, GIOCondition cond, void *opaque) @@ -2270,7 +2250,7 @@ static gboolean qmp_migrate_finish_cb(QIOChannel *channel, qmp_migrate_finish(addr, NULL); cpr_state_close(); - migrate_hup_delete(migrate_get_current()); + cpr_transfer_source_destroy(migrate_get_current()); return G_SOURCE_REMOVE; } @@ -2350,8 +2330,7 @@ void qmp_migrate(const char *uri, bool has_channels, * connection, so qmp_migrate_finish will fail to connect, and then recover. */ if (migrate_mode() == MIG_MODE_CPR_TRANSFER) { - migrate_hup_add(s, cpr_state_ioc(), (GSourceFunc)qmp_migrate_finish_cb, - addr); + cpr_transfer_add_hup_watch(s, qmp_migrate_finish_cb, addr); } else { qmp_migrate_finish(addr, errp); -- 2.47.1