From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023097.outbound.protection.outlook.com [40.107.159.97]) by lore.virtuozzo.com (Postfix) with ESMTPS id 45C7C80B94 for ; Tue, 20 Oct 2026 16:31:01 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UqfX0Qnzmb7wJlvYcy8DgvpgeiZCWhS3tdDJJbcFJriio8Msd+tRsKGByNhjbDPyKx047f4BSYF3X7AzBknbbf7b3TdtqZ1Nb0Thc0UvEBMkEDCRTnBVoKO9JSKP72yfOQFLv75Ot8FGRSBrWn0xiISB/3bh1AlsXMdUpISvKcNxuj+4rtg7HU2GeJXKifgxw9+IUFzyIojItmFLpjaCZjOf2STfh7kvvUps3ItVUK96ir3DqfaVxl1CkqO8j+Dhg8V1K7KfGMp7H9Cpya7UJSQbAwQ84BL0r0TquJ0ZmCCVsQUvW2d4uMUAF++3oFKOV1eWJAyadDWD40YWdzdG9g== 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=I5zUklGhx9mSKZd9RAXXmtGzvg6nTXNEKWqfObJy+ss=; b=DWqtF7f+neA7dKD5nDeKaxCpc/6GH2BkM/niwPBxQXbOa6eaAbznsjIwFuVt0eTU0k02njG1XlsfTC3B0cMF9TqNbGI6sOeD9ebQLlkIZFCK6LUYrdrH3akD3RfITM0lCedu6lw9K/b0mXwZiq/mu/KdH+on4oJmnOSETkn97AyMo8wDszOu0YZnvy31Hwo6yYryncxdgPdvQsMc3wQ3M1RCWdMSN0WBScsI/BzFNbN4h93RdejGA6txmcoyY/IHQXJDKSZwD4767NUdZdge5w2gcTf/rgV1ThamUWIIdtOchJCQ4e0mQnKHWSeei5utbyEkB2SXR9Ct04yifsyKYQ== 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=I5zUklGhx9mSKZd9RAXXmtGzvg6nTXNEKWqfObJy+ss=; b=PlpfkuLIQmzHcj4L74nLtol1kv+54dnH05zeY4+S8pqPSTAyIBqpxk/rK6AAMxdFQFRtNEzzEh+mA71K1KY9niXxpb/cPxda7f80KOTz8CUXRRLIOT7n++AFF1fXJT7h//Xmkl3wAwEJFmbFKxafDl+8ZaoHx+c1+wZEMMoONiagRtBZf7RzF8r2N+4fmhAEL+RZzT0nMSkSDjkIXBe36EFfnthheL8vvSbfZmQoSZmm8VLQeyz198kxM3o9lUsCfdQtnyHCe/ZdlWmZuGAlcx85tgptTKjMlfm5DMroc7t1ZD+od584SfTP+KkhEdYqYngdFthVSHtkISR7rKOCVg== 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 AS4PR08MB7553.eurprd08.prod.outlook.com (2603:10a6:20b:4fb::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.15; Tue, 20 Oct 2026 16:30:59 +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.012; Tue, 20 Oct 2026 16:30:59 +0000 From: Andrey Drobyshev Date: Tue, 20 Oct 2026 19:30:58 +0300 Subject: [PATCH QEMU HCI-8.1 v4 18/31] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261020-vfio_v1-v4-18-83a5668230e5@virtuozzo.com> References: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> In-Reply-To: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0056.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:34b::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_|AS4PR08MB7553:EE_ X-MS-Office365-Filtering-Correlation-Id: a40240d5-f49c-4dc4-e992-08df2ec784ae 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|1800799024|376014|52116014|366016|6133799003|5113699003|10067099003|22082099003|18002099003|3023799007|261009223027099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: 6a3rID+ibHY0F81rk7Zw+65gp3fwo3NSw5oEoDKV1ycauX+Vj6Q2BdQrVMnRaSxLsdkZIw19nA/zPR12SZTemawl/mcs0jbq0UnZBLU0XjLckD3wC2wJd05S4ABn6ngleVbeEt78bzzSbTxtVO/Nb92g4ljjEa555fhTs20j21YFUICx2k6NEyHYcjRlHc+rYuHVTr7Joog6kHE2rBCGgfjZcUNXrQ8FOjKvue2gpx3SSmgYS+hljYcnEZgwns2L6oEGwK/3M2R/BotL9ZbRDn/vgvfLa0OSCTEvaJ7hYLQhejNBkl2tv/6sfVqZR12rjVsPFUMBlarB++DB3CDqwB0flp+GBjPYy7d2YZrtrVV2pOno2wb/gOhrelLK0iUod9SS8T7PgdcB8pmhKcH88tsG8doHSf5Mal4yu/3n8LVZo9W2aR+stYzE7kigoFz0+qPzKyq0meM5WclhAr0RDNo7nZDhqSOMCeVr1A+scHjjWCOPBl7qtrPH2m8RGXg3YLWEQ1LLCCX0jMjYXsPycT++n7yQE6KD1TfTa1bE3QaEIAfnVww/71ndzimbrC5foQWAOfJV9kbLlODkDHo0y2UYBVQHec3HRuellcoOXoruPO/R/IUzl4gtmY3jPN0yxXgX65oL9vldKMK2JM1e5LOZ4csFXFATBPI6w69gCOI= 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)(1800799024)(376014)(52116014)(366016)(6133799003)(5113699003)(10067099003)(22082099003)(18002099003)(3023799007)(261009223027099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dDMwa3l6R3NQdnROalhjTkh6cjhER2hac3JoRUttazFpTERQWDhKeW0xbkpu?= =?utf-8?B?NUtVNWlVRmZhZWUxVnZMRmk5b21FRmpYMmVrekNSck1BcEEwYUJMWS96ZURo?= =?utf-8?B?Tm9xYzRzd1hUcFFyT2Z2dzFVMkpSSmdMT0dCN1RIdmhyRjRKdU1JcW5TWE5P?= =?utf-8?B?QkRDMWQ4Zm9adTkvZGJycWpka3FOTThENE1uVDRYK3EyOVlvVC8yL1FWU0JU?= =?utf-8?B?bjh3T3k5TU1wZllJdWhKODBOdFdVeFJOU2laYzJrOSsyTnY5UjBXaG1QRjFN?= =?utf-8?B?Q3RLQTM3UU5jWG94ZWV1YVYvRjZhYkhNMVMxN1hiRjlieURkcHhaVzl2b045?= =?utf-8?B?Z3BGV0xtaXVTZFRhazRGUW83bzk2YklpNkY4ZVNmWTZqclNLUjdyS0RpT05W?= =?utf-8?B?NzFkd0RNMkVCT283VnE5cnh3RWFzaUx6WGxTOGd4Tmh1SnFGNlNFWHg2c3Vq?= =?utf-8?B?REdTV3pVZVRYb1ZnSndrcXdGdlh1NmRHYlFRc0VaOUVpVy9qWHVKd0lkVVR5?= =?utf-8?B?NVFlOGUwNXdvR2tWcXVra0dYTjdBMGQ2dklWdzB5d0I1NW9FcVhBZm80SWx2?= =?utf-8?B?eE50TVpYOUc2ZnVZQWQ0WndVV3JQdXZzZ2JTbTlJU0NWZ2doUldkUXk1UHhJ?= =?utf-8?B?WUN2cWtBYVFTTmhwMTlIdmZvMDZnVHlpVTV3TXJBa2hFUXNMbjNaV2dqM0Qv?= =?utf-8?B?V1I2c0dUY0JickR1VnoxemtTendrMTVqazR5Z2VXMzlHNEtQdzFKM1JqemVq?= =?utf-8?B?TlVvb0QrUWduenZlWUpha2QyS082TW5seHVtNm9NQ29JZzV3bFAvY2VJTEZr?= =?utf-8?B?VnNMdGFYRjhaMDdiNkJEbVNGbTN0anJrTmYxTHIybCtVbjB6YnRUYWdOZ0RF?= =?utf-8?B?Q3V5MDlVSS9IaHdkZmgrNmczb280R0N4TWpRdzVTWTJ6Y1NHKzA0OE9FVjZT?= =?utf-8?B?b1AxeHZBZkJZMGNobmZ6SEZoZUs0ODFaWjVxSVpiN2R3ZmhpSy9JazUrYWtR?= =?utf-8?B?L244c0VPbFRkUWxhNDVLVW8zNXBjeDBjUkRPSnZ4ZVNmOUxSdndPcUZwZHFD?= =?utf-8?B?VUd5VnJuNUdBSysxWjZ5Y2R6MHlMNXZPT3lLcVN4b1pPSnh5VG5kRWtZc2ZI?= =?utf-8?B?OFJMaTNxY1RCRTNyZzFkdWJmZEtQazFOUFUwbWhpcktQTUJtd0hjeUNPMHd6?= =?utf-8?B?cWk5U0l0alAxMUplTUUxY1dFZW9nS1RQK1FBbGJYd1VmM2tDUWEycHpoTlFj?= =?utf-8?B?WXpLOFJFc2NQOHN4ZHFhOU5mMVJXTkVWMmdVWWQxbiszWlQ3dk9DL2RBakto?= =?utf-8?B?NlJqOUEzZXVZWDdnNHJpNjh0aW0yN1pxSGxDeHZFSVczZ2xBOU8wMlpTR3JY?= =?utf-8?B?cWJ2RkduTThYRmgzalJkOEZqK2pqR1VtOVA2VmV0MjhPNFVHVUZsL2ZRNEpj?= =?utf-8?B?emtteFNZRmg0Vlp5bWlFZVJLUWZORnM5MklkZFZvaDdlT2FqM1JCckF4SWR6?= =?utf-8?B?dFhTSEtiUlZHQmRiWmM5S01ncU81VkhudFpIOTRuT2V0TnBwaTVTQytsNlVG?= =?utf-8?B?VlJ0eHJJQWF4WWxUelpjMy9lU1VuMnR0ZkJqRmRtb0xyR01IYlFxL1BLc1Vr?= =?utf-8?B?SkE1eWFwV2tkd3VnaGY2V2duRWE4OGYyLzJaalFQdXc4RDlSS0ZGbVRaWlFE?= =?utf-8?B?S0JiSVRVOXhkQkNDeFovMjRJOHNJdytqVEdMWCtZcmZKL1VnbjdzckdmbHZK?= =?utf-8?B?dDBqR3Y2M1NXQU92M3VnYnJhL252UlQvRE9aY3VzdW43R05QOUlaS05ET3lP?= =?utf-8?B?Z215VlF1SGg5RmFtcENUTFZCZlJScmhvZzRJR0FPQUs0U1RLSFFzSm5QSGxC?= =?utf-8?B?OWROYnk1Y3VjWjRNMDNQbi9uK3drcm5Pd21QTmhtZ3RmdkFlSHFhNFo1MjFE?= =?utf-8?B?b052ZE1uYjc5V21HS2F5TTMwdm94a3R5QStiT3RDaHB5TjNtUVJydkxvdUhZ?= =?utf-8?B?VlBDeVdXUHE3b3E0MnBZUGtQMHF5UVB3aklwWHlmbHVmNFRSbnYrckd5UVE5?= =?utf-8?B?azU2WFhEUjAxWGYxNGpwMmRFRnQwL01FRFh4RklSb3lpelFHZ1RoTzAxY1d5?= =?utf-8?B?NVVDdURQM21CQ1Y3a3dybGxYaEJFejdSSGpManRneDF3ZHR0WDIrUVB5eVo4?= =?utf-8?B?c3haWmtydlNsdTJLeGJoK2U2RjFBN0RUc2VnSnhVZ091TXJVanp6RFhaTXVK?= =?utf-8?B?SWg1M3BCQXk5Q25QS1hZMUx5R0VPeVFYd2hGbVZlcnVXSFo2RDUrVFBHQTdo?= =?utf-8?B?MVdFL3RiN2ZZdnVBRlBoMTNadHY1bnRGSytka01JTnNVM2xTZWRXZmZRSFVH?= =?utf-8?Q?W/yfdfBB0g2CfvgY=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: a40240d5-f49c-4dc4-e992-08df2ec784ae X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2026 16:30:57.0158 (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: YnRuG3hNEUTWjeE/wK+HKxnEaq+NY8Oqjo/XNFC4p8hvNsO3vS4mZBansF3jqvsL1dd8FD3GbhDvYiiLyVqD0vpT2dTW0wq56oLG0RWwoso= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7553 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 63e9dd54805..b7db5c94b0d 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) { @@ -1508,7 +1507,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); @@ -1669,7 +1668,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); } } @@ -2262,25 +2261,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) @@ -2290,7 +2270,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; } @@ -2370,8 +2350,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