From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023095.outbound.protection.outlook.com [52.101.72.95]) by lore.virtuozzo.com (Postfix) with ESMTPS id D5E8D80B13 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=s+/tzCnodsr+8ttZmVS4p0R23ilf4tEkTHDKOfvhi/vmo4PE3w0/HIZnfFA7iNx1wHyzHOxaeSudSN2OhoZx7twKzikR6GamxSo0wDQE8+k0NHN16wRVELy3JfSqbcKWY1UDLDorJUV24Oqyqr7rXT9F5Vocw/xwUs5ud1oM0YP7E9KEwEcdpJ2bGN9PFchDXWgODKV0j1iKyy570WmHqI9najjKd8ygRWP4r4IKjnh3blBWBirAuDu9wreNqs4mMQXfBY64UIJ3QbfUDmB8EdVYNNArNnQX+V99KkIFll63q1a63W4poKIXAzkB+k3k4RdfKJMuj5QhlN76H6Ldrw== 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=36+xXh2vA/VsAZtKtvZKme+W2PKIrIzyAVUmjLwe4pA=; b=l51sVMCABqKhjRZaIWeDWO2IWepzNitc25GjITLkTR5uPT/z1X56nMq/mT/UXyz5HjBqGB19dyVE4jCURpMXIIddiLCZ9X0O0cQtV+krOfh4T8Vfn6Z4s4F5UmWF5n9/9zdSFAmEEX/dsr7Rc4BLEzLHYRyDD3kfGSw9ySzYGcYIrPTgfjjmquteThWKKlfcJIC6nL9DqV6oaNv5RP/nX/OtZqpdEfxID8zyWGLZ4DRbISp+ubK3QBN2TdOSTouIPg+drYfdcBuEqsXHoy5ue8iIHPhaXJD4iQDLyN019cIT2Ony+RVnELeoxkv/fyIm7QpdnmRoQ0fSRIz/klx0zw== 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=36+xXh2vA/VsAZtKtvZKme+W2PKIrIzyAVUmjLwe4pA=; b=o0DDeql5PpbsXXu4B1Ko+3oZMsceDzjDl+HlroCpzqnB1LqkhfvM7j5R9Qd84n8CgiI/+tl43YeH/WzlUm5SYl/o9Y5AL2VdoA4D5TORAySsgSYwiDszzS5lPNPN4AJAGdnEekewjqO5cy/exnb3DsNEzA+HjwqG9p9EU+kxi5XiYKpmQhc71KzFy+FNhjCdIloI3A+nkqykvtQd+oXKlqpp0VzBI2my6Nf6E5Pn8yNK/+zVY+ITqpL8ztdKGukxaeeUt5eZ/G3BAuTSYKriYXyIB4RLKrjhKBX5KhE3Z4dNotRHTSZRhHAY+ZxeJDE6JHt/xnyj12IdwepTJntqPw== 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:16 +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:16 +0000 From: Andrey Drobyshev Date: Fri, 16 Oct 2026 18:26:14 +0300 Subject: [PATCH QEMU HCI-8.1 v3 16/28] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261016-vfio_v1-v3-16-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: bb308738-c0cc-4886-75eb-08df2b99cfb9 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|52116014|1800799024|366016|376014|6133799003|5113699003|18002099003|22082099003|10067099003|3023799007|261009223027099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: dO42bQn9FpiuyCNJyW5ZyFwH9uYhwBzJK0KHWzqoJONFmMZRx8/mZBQ5Ex0Shb74nLUn8JD2MLON98rnbf23CXeNqbrA6tGAHl8I6IMKccChOKZrEu/Xuh00hYxgonqqp9AkWdtvkHbMQGMaPCjmpHAhZvdsgiKngSt9Yc8ycx1v3CCegf79dalk/BvY7lfZxdM1rH6uN3yaqRsGQA1heRxXPnYQ7neh/rTmFqu8ZpftN+7rrWwIuoUKhCu1TUJedw9rzY8VQDuqB9yoyz/eHnQPneuA+DQT73kKDRUBsuNkfzstnsbEqhkafMSixb5dAeT6K8xPHVB3CSArOQJHQjDJg+PrbOGjmGCauO7EG68trPf4KZRrwUQPmnDtHhcWxQhdOQ4E4eunYvUvKg7YDDZgGuq8t5g/dqfYS1goL0h6+FhRhMMvU/2T0xZ9Lsw2pA4fHI8dgWMe4lOoa+io6zSZVXPD7w+QKxp0DqPt4uNDUr7V/Ub0RZ8RwS/nbOf0OLdGMcd4zho4wVeX6OPRAqe/3X6YYLaSuPUVkxCzHJfW7RJujU5G74BvgTQ23s9FZU0JZ4JkgY6OA/Bq4XqF7iADcVW5OqwfLeGcW7YB9Iga579SFmSZjFXV2Sqgt1N4NwO7oW0WEpnSWzh2gv1Ue3lHOfFGOpLbKL+caWMBtRk= 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)(3023799007)(261009223027099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VEJOdkRjRnE4MWVhZ0VDUWI1ZGk0T1JDa0ZyUWdxL25HOExlS2t4Z25FNWlC?= =?utf-8?B?QmhmU09Fa2pHdHVqN0FCUHBmMVBST2NuNzJQbjhhZFZIL2hIY01QK0oraVlI?= =?utf-8?B?WXZTV0p6R3pFSW0vNGowaXlPRFpVd3JTRmdTdGJOenMwWGVnREVUQkdvTWlG?= =?utf-8?B?dUEzUUpzU0ptRnJ6dDR3ZGhtUmNzM21RWXpRdW9SYU5GRVdsNHpvelA1U0sx?= =?utf-8?B?K0RzQlpXL29qUzVxejhpd245UWI4RGl4ZnVOZ3JhQUp0WkIvcUN1aXZ4b21D?= =?utf-8?B?cm9US2FRNkJwSkxNVkhVT1N6eWVSQTkwN0RpZUVtd1g3Z1NSYzZSQlJiSHVo?= =?utf-8?B?amxBQ3RvWGphY2J2bXNYU0l4VE1WVWFlV1ArYm9tazVRQk9kZVlnd3RxNUFm?= =?utf-8?B?Rk9MdHN6RFgyT0xDL0s0Q1VOMDZnaytXOWJwK0Y4Tmc2QndzV0hScnIzOWs2?= =?utf-8?B?RlVkOUhENnE0d3dVMnhxZmpVRlRFdlNLL3JncjNQbDhFbzlYZUdaazdMOWR6?= =?utf-8?B?NWkycW1CT2p3TkM0S2lSMmJiYTVjVUd4MVJuMkxSTkszOUdMSzBJNTdZendw?= =?utf-8?B?L2xabW15ekVDNmF1dTRNb2RscjFBMS94VzVXa3pRVWZ4YmRZdHJDUkdheVJK?= =?utf-8?B?V01Dc3hQbHZtR3hVRHlHSjY1NzBoTGY4WlpoM2ROS05ZbWV2RHE0alBzOHdD?= =?utf-8?B?ZGRnVXVoWm94QXo1eU80R2RGQ3hFNC9uRjdwR2xHdG5nanlzeDdkUDE2SWhT?= =?utf-8?B?TmJ2WnNhNmxMQXhTZVM4RGVNWStNdlhkY0tJSXdGSTU2VTRUbmhjc1lnUzhC?= =?utf-8?B?M2pqcWNCbnpSNGVSVjdDLzlBTU55N2REV0lxbUxSb3V1WXUvMDNGWHd4VVUv?= =?utf-8?B?dHRuMm9BeU5QTW1rTERsVVYxWGdzam1HQnR4UStBZXlXc2lFWTJoQThkazY3?= =?utf-8?B?QmNMYnU2QTB6ays2R05ya0w1cGRTVENBam1SdUtJQWtMRDJ3QzMzNm10SFFB?= =?utf-8?B?dkZTbS9yRk5zUXZLSWlLQk9EU05lL0l5aDBsK2RFeXlTMjhsS2NtOUZjSHVK?= =?utf-8?B?Z2d3dFIxODNLM3pVU1BEOUZ0b0xIakJwMFJCTzd0bWJqZ0JEem5WcENrTmRq?= =?utf-8?B?TUNKL2FIQkV4cGVpUUl2MHJWNTE2bExpZG5EYWVoeEhvZStEZ1BQd0ZWMzJQ?= =?utf-8?B?MmkwOERlM1ZiSVJySkNzZWRaSzdob0lwd0hPWXQ1ZnNTYm5WNGFUMkxyazBV?= =?utf-8?B?TlE4aTZUZ2RFdVlqSVRxYkp4LzZ6MzdLRVlYMzVvWTFFamVJNkVENHg5UXBE?= =?utf-8?B?TzRFQndTeU94RXZCR2dOZ3paQkZGOHdrOTUrK3RTVW5ZeTZJSFBzcHllc3BJ?= =?utf-8?B?V0Q2eUZSZnVNSHdmL08xY1hvalJkNUZJdTBOemF1T1dNRllVVE9TVU1XbnBr?= =?utf-8?B?RnZZNGxEMkpFY2xtOC9pR1k3c3g2dGNXM1Q1YUp5SkgvNDJoK3V6dFJiQVFO?= =?utf-8?B?NmhNTXJtTUpZbjdTTUJNNzVobTRoYy8zdDZaQ2pxaFhDWS9oYVpGWHlBVUgy?= =?utf-8?B?VnBtWlJacmZZNW1LTHJKdkViWWFRQUx4YXVUN1dLUXBFb2UxVXhPRks4LzFV?= =?utf-8?B?ZStmcjllWXNMUVpseUN3eVlXcCtzSUE2T2I5TnpYdzhFMThIczdjeElhYSsz?= =?utf-8?B?aDhLTUUzSXY5dHVoWkc0RzlOL2xHMkNKclRxQ0FIWlNieDdXa1ZPRnZ2ZTNt?= =?utf-8?B?MG5TTlBFQjdxSlRBblUzcnZtcUc1UDNRMU92anpHN3JMb2t4RWQwa2JmRWpF?= =?utf-8?B?c3NlaTJRVENpWmU3ZW1YUnk3a3JMc1RuYU5Ody9aNU9nd0xWZ0VVUXo4M0lu?= =?utf-8?B?WjRQWkIrUlIvbXVHTTJnM1kyK2NGV1VSYitqbW44TGlZQlR4UU1HcDNpbm5S?= =?utf-8?B?ZEtid3dRNlN6b1EzNEthd0MvMWRpMDhzVEYzV1B2RUhOVXc5NjRiaHZ5UmZF?= =?utf-8?B?TUZvdDdrMDZLVkhwcUV2MmZsaDNPem9NQmNpaDJ0Vk00S2lBa1U3Vjl4dmFF?= =?utf-8?B?SHAxd0htQTRzVmJtMGtOTmx5aXN4T0cvWUd1ZTFEL0kxOW8vQi9WMC9STDVF?= =?utf-8?B?dmNjL2pDOWdKZHk3bWdhREZJcWtaTlBvQXJiakNuK091UDhraXBIcHVFSE5O?= =?utf-8?B?RG5QR0JjQk83QlEvVjJHSyt1cVMxOXRCMWFxRldmWEhxbi9FQmQrQm1zMW5s?= =?utf-8?B?UTl4NEZXTUMzaGxTOFZBK0VndGJEZ2xTaVVXYzE5bUQxd1Y1K0xIVFordWtM?= =?utf-8?B?ZjNaWnRValpaNjlBZ0NYZVU2S0svdHF0cnV4L3RpTjE3ZUNzTmVEMnJVQXhn?= =?utf-8?Q?oi1H3ofbvbgaYiig=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: bb308738-c0cc-4886-75eb-08df2b99cfb9 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:12.6501 (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: fsnpi/5KT9i+wfZlJQMYzCwCNUph/mOJfA/w00bY2ccktczbSY2ys+19tM8Pwkel7hGgi9+kq45VDlB9qlNNjZ706oSSHaPD40LCcN0Gafw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8907 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 9ac11d57d5b..c138fa40e10 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); } } @@ -2251,25 +2250,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) @@ -2279,7 +2259,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; } @@ -2359,8 +2339,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