From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11020142.outbound.protection.outlook.com [52.101.69.142]) by lore.virtuozzo.com (Postfix) with ESMTPS id 4871980A8D for ; Tue, 13 Oct 2026 15:28:16 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CO9KC5ojesqd36VSjHJW3WAe5sKJvUljBVt49l2z60B3l79Tb9bJA98nhhjVm54r2naQlWApINUvXqEdmVepOW2LAtaCdhFbuuEItPKankUIHVFv5kACvFAGYqFwJQjBPNxsRap0LdHod/WneWzVjKAaClUeE1Dnvy5/FnxZ5TJ5PSyg2qZH0Z3yZ2gmtEcOOouYsvJoz+elK+vDsT2b7SMNMycKRO9cr0bGqWqaOxOLUwdLe8IVC6AuwFoPSSeesMOd7JcJ7LH3sS3t4Gzdn9Mn/zID+xSUyAjD1Rekwav6TZoMPkcWh/wPCe3SvK2seFd5wAcMp1zoKJlVpCJRkg== 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=YyuYwCr3HGaAt1/FbRpmqATQ0ByNeK4CZVa2AcuwF70=; b=ZRsKCIzb9KDII2Dr0gbHMDcYJVfIIkLOGpgBhq/FE0WXevV7cxrZkxkBj7O9mO3FAeA0PEkUdvx7vttdsHYfwze8IplKBFNUzV6uEt5KSO7Ky18Wac5EzLFGS+i8kGmOJxBQqKEHMgk8RMwoCHufXqphwj0IrrUAhjp00lm4m6S0wIAWscIdPDu8Ogyp2vm69HS1eQjauEyl/e1htzNHP3T/c9SI1S0cbKAegVey5TsjzJB/Hbm6nUh2PR/RmUlgBp+t4UcFPsOdHAX4tCkkHqxAYL1s8mSAnm5NzJRAWdFLW/6+buVEpmz1fiuQ0RDQjqbCevDyV5lnotP2AvMgCg== 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=YyuYwCr3HGaAt1/FbRpmqATQ0ByNeK4CZVa2AcuwF70=; b=P/R6xB5NeAFd8IDpru9cXlCUh5rkrCgeerssMWvtfv4mw6WYQUv7Kz6/4D5hFiMn5kUDDXwu7ADVkaQBxp1DsVUnO3ikWzRM6qYkVZshuGzvBxiiG/gNgxttbTB0Kz5HIZBRX4wOFRqbQL9OmEhLF/gBMiKqrLiBpYxXSoo32ui7Yr1469Wuj/1ClevqPWE1+KtqWHGRx3pn0z4i+dIT6kNyYT6kEwDus5P2Dwwmv9jq2OwW6y8JCJpdopUtnSlc8XRr99McTjg6QjWS2tyfQRTD7rJ2wJpZalCBy00vpAupaL/4TL/kpYsB0OdbyneII84ileGlbIIf9wyj6EqEog== 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 WA4PR08MB366192.eurprd08.prod.outlook.com (2603:10a6:1d0:30::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.522.12; Tue, 13 Oct 2026 15:28:14 +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.0522.008; Tue, 13 Oct 2026 15:28:14 +0000 From: Andrey Drobyshev Date: Tue, 13 Oct 2026 18:28:17 +0300 Subject: [PATCH QEMU HCI-8.1 v2 13/24] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261013-vfio_v1-v2-13-433455c0a294@virtuozzo.com> References: <20261013-vfio_v1-v2-0-433455c0a294@virtuozzo.com> In-Reply-To: <20261013-vfio_v1-v2-0-433455c0a294@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI5PEPF00000939.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::833) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|WA4PR08MB366192:EE_ X-MS-Office365-Filtering-Correlation-Id: b50bd288-0e8b-461f-e2a9-08df293e98f0 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|23010399003|376014|1800799024|366016|52116014|5113699003|6133799003|18002099003|22082099003|10067099003|3023799007|261009223027099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: UrprL2BiJSrmZBNk+LqxAlmPrK4UTWyTSMz8g5Kqf5Fof8sQuoKXB3CDsoWcjfFtJs2woJ4+hsbDoHauOYkR+vaEiLKq0gJIhK2vsImiYerlsUiV01jec3sgGUUn0TdobPZ/rYFosCA73faEXubjrJLKvzCEHqZxHYL+gmv8S4ZW1pQroMBdN+9xCv1ZxVzTikTni2MghVcKQIoLJhcescJNlpr+WnSmJUNU7AJwIsihb0771QqZoida53LHklhAAaXmXHuNGyvVv3UzGY7u3UuTSzjvT8QJ4jm6PrxevNnI7VuS9nXrg8SG1znerSKG/+c2A2245qlc02anbp+dkkhR6Ap3v9gMMGxpZ2p3mzKafgtGUMeDq4ffd0ILlDEztMKUkeeDpYiRaoA0W8RTldPNd8hvxK4RW0ZEmHTGu16G9N1GZtLBGZb9A5NgGdff+yv9HFk5jtUgCp4g6UBTyd25HTHVFjbVhS1wqQBW38W+G9Ym/hKUgtGx2vCKGDJZOdH9PkuNPd5DzYyhzVzkUTrWaTIwzmk2kWRsMFWRlxeefJscPuDirYKOs/G1x+tS3yCbanudZ/DjTqJMuA1c+5b5c8QsdvdpUXWeqc+NayARu9iRNcGllZhxSUUQunqmqHOvdpivC4CmBFIdNaBxLthU9VDwFMPn9zZXs3csS+A= 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)(376014)(1800799024)(366016)(52116014)(5113699003)(6133799003)(18002099003)(22082099003)(10067099003)(3023799007)(261009223027099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?b1VNRlBoVmp1VVUwTk5NRXJDeFRJTTg1Rjg5b3V0Y0R6TU9VT21zRFdiYTRC?= =?utf-8?B?eXpzenZZS1JLUlZIRGtvaENuRDBJMW9udXZKY0ozck1EWnJYWnZVSkUrdndw?= =?utf-8?B?cllvZU9Kbnk4UG9JN2NZcWV6ZzJIZ1JuVFpaMkw0ZFJNMVc0RkMrak4zWUsr?= =?utf-8?B?U3ZvVXNSb0wzYWUyK2R0SjB2QVExREZJdGFFNEkxYUJhSk40dXRUTXJ4NUhP?= =?utf-8?B?T05ieU9RNkYxNTN1Nng5aWRHSVY4YmhNVlFrOGozSEx6WHhvOXExT3FURms2?= =?utf-8?B?N1ZCdjY3RGh1ME9TUXd5ejFaWkwxa3JxOWZHaU5NMDM0Nm1kUWFLYWVFUHhO?= =?utf-8?B?azI1OTlWMXRjb2trQmIyUHZiSDB5cnZid3hoS2RZYklXMkR0TEwxOFROL016?= =?utf-8?B?UU1LazRjNFpKQ094ZWRoMmdEOEVHWFJkQXBBeDMrKzluMlprZjdxRlUxSVRo?= =?utf-8?B?c3ROUE9LV1pxWnliZHgyNU9jQ1dkT3FuSUdJUVpzcXlFMWs4c2FQMDhyNTFJ?= =?utf-8?B?V1k3QWR2cDhzSUFWc2x6Zkt0bFo1eTFHVDZWQjMwdkdlSExBNWkwWFZxSXhv?= =?utf-8?B?eHhKOVA5RUQxTFZhM0lCcFN3dytXQnBVeXBxaUhjUVhYVWtnMXFuTHhOVXB0?= =?utf-8?B?bGUyai9GSjFJY1FOblE0andGVjFyL01OL0JZYVcvVEVRQ2x3VW5iK21xVWNX?= =?utf-8?B?QVRnR3VZdHc3S2RxKy9XckFtdUpZUkpySW01Nm5JcEVXUzFHcG5zZHByT1gz?= =?utf-8?B?YTJlZnRIOE9lcmdtS3BiUXhGVmhFUnZIcW5tRi9Na0xqVllvU0VJemdabTdL?= =?utf-8?B?YnRRNEZLcnRqS3BtS1NvQ2M1dmtDZnpIMU45WmZFVVdvQ1hrRGRBRWRYQTI3?= =?utf-8?B?MUQxdmRkVFFGSnJnRUtsUGNPYkJXdUtPS1ZKS2o2S1QvQ0g4VUxMeFdvWEp6?= =?utf-8?B?ekZLMnJFdHRab2p1WlNmN0pVc05BRFdGaTlESjlSWlJaZzFGRUR6VFZuZlhy?= =?utf-8?B?eHVCV1pOaXRyaHBzZTlyN3dySmxrdXp5aVNTcU4zdEg1OVdETmI4QzFvR1BR?= =?utf-8?B?OE5ZZTJCQkhSZHJCc0s2bGExK20wNzk3NlExeHp2bVlvWnZLN2ptZ0lwTkIv?= =?utf-8?B?OHpnaUYvYit2cE8wRlN2alRhZGphc2MxNjZQOWs0N2cvVnI5ZVdwTTZITFVE?= =?utf-8?B?Nk1EQ0V5MWNNK3h1R1d6djE5MFp1NDlEL25xOVNxc0x6Z0VtMWtJZmY1Y1JK?= =?utf-8?B?cmhoanRKT05yMmovNXNkRGVlQW5kMmFHQXZKcHpONHNIalh5RWs1bUNxWDgr?= =?utf-8?B?SFpzSCtTNTR2d25Fd0JoWFZBUEJWZGdGYzFMcTVhZGJWWmZRRExRT01BTkFJ?= =?utf-8?B?UEpRVzJKTzIvalZBeDlwOU1uZkttWm1LUnZlRC9TbXFUMXFodnY4UW5ZUjVr?= =?utf-8?B?aUdKZGxtaGFCR2htcnl6cnQwMHc4aVlVRUJNYlUxT1krN0MzclAyYjZuNGhu?= =?utf-8?B?MHYwYUZVRERreGN4U3ptQ2g5ZitsdzFpUmdrd1EzN1hPQ0U5SGZ6eGIweHBK?= =?utf-8?B?TEtLbHphbWNLRVVRRk9nOWJZeE1ueXFsWDhDWS93c0thVXhpNDhIVjBkOHFt?= =?utf-8?B?OGJiWit5cHNzM3NiTlNrWkVDc0grYnhONXM3VHdRMXBlelNROWpsR3ljdVNs?= =?utf-8?B?b0V3NHFFcVJvSXRRUTVhaWdFWm12RTkxWUh3SWF3YnZmalpHZ2NkNVh6VGJO?= =?utf-8?B?cUExR2l6UTY3U3hvQk9mcW9uNzd6UlB6bHBzUHJWb1hRY3VpM0VRRDR5blJU?= =?utf-8?B?LzN6ekVHOHBiOVZUaUl0WHJCcTVFbGZXaTExcVkyVW14WUFmTWVmL3N6RXl5?= =?utf-8?B?bUl3bzRzK3lVclB1ZVJONnV6c1htbEFnQUw1MURLdTd2N05sMVY5alJKSEc1?= =?utf-8?B?SU8xMVA1SURFMkJmK08zVnl2dCtMb0dIMmlaVWE0UFhqZHhwUTBOMVBYYXlX?= =?utf-8?B?bXpZK1lMdVRzalJuNTZSQzVGVDF2QUp3Q1dDVXpYZCs3bHVidG5jd2t0bnBm?= =?utf-8?B?VHRTOWJubTAwMU5QNTBkbjcwV1VWVk1xOXJHK2QraC9IMmF1RmhhdlFaMHJV?= =?utf-8?B?OEUzdVlPY1p0RTkxNUhYajN2QXVZM1paeTZ6bXRCczVKWWI4Y28zSXFUL1E1?= =?utf-8?B?VjdQbnMrMnVreUI3eDg5b2NBY1NNWERIVUtmUkVCWFFVM051U0p1SThMVjRP?= =?utf-8?B?RVJnUGNmdXFlK3NUTjhodVdkTExSY1Q4MGZGVmhyQkJIQjFqWlFhU3ovUlBt?= =?utf-8?B?czhTNktJSWQzYUJHS2s2c0JuL3pEYzAvZnJZTmdFR2c4SWMzaGtaSGUzUnJK?= =?utf-8?Q?ebATWgSUOss5qToA=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: b50bd288-0e8b-461f-e2a9-08df293e98f0 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2026 15:28:14.1462 (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: +GmgsJSL3AlMvQb+KR4kaPNTXh5ReXqANzDAyUd2/DzPDbRU+4HE+U8ujqKr5zlgp9e4uskaxMq0Jz8pPvsyG/IjLn0f5/j6Z59ne9V5WHQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: WA4PR08MB366192 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 61d458b2562..14ff16fa6a4 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