From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021118.outbound.protection.outlook.com [52.101.70.118]) by lore.virtuozzo.com (Postfix) with ESMTPS id 7D9818017D for ; Mon, 2 Nov 2026 10:36:37 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DqIcRjLo3B8IEoHb8xfq0dMqDJcXQ7pKWK8owDMYcRiNbpfiQRkzII9DqA4hJbsbgfTbm7fKyxzOWNIA7d+L0luHL7vHuK0TPC7hikeJRcKSbjw1JldfqwDzPHm0GbpdKPdaJE6odw8biJUkyT+GbQegkhKJHITBzav56Zgv35Oc9b6SvftZdqkmCuAvHKxrhbqrv+gcEpBoXGTWjN9IK9W0yEjtdF+Asrym2AAgmmzGJKygDj1ls6ZDv2LljkFi/JqN5s4mdE1FX2K1FbMBhaoSn7DoITn+bD0NK1rs1+NB2gfrB2RklIiyvImTw4cXXt9r6W1HvtvUwF6/V1ZzsQ== 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=7B0h9gBbp+Z7ZBLs4uCpv1CnSHj+x294vfwWPn3A4cU=; b=vVsAxQebuhB70aLHSVQXgyxgcK1n8/P2bKkzfTGlphIbMiuNvzKYPGRhXhIalXwQ+B1T5DF4ouKKGqj9HzXVBe8hUqHlgsbFcVeAej2TRcJWzkfo/MmWnr/pG2T56/csdI430Ao2xHp1DkFHZPiTV/r38ZtFQMY8fDKAX3CztDYN7e6IBAINSRUY5Wf6JOkjDTUddi0qOC2Il/8bL+AbgUbJtNk75PXYfjtKgvoBIz/WGdNyvXOAGdWzzhrAzhmcTkTSbZ4Sz0PP9ZkbUfhfXTI7V4kBEg+EZ2ewj3xizC6SFOD13DHVdMiLBqnegGzqoEOwtku/XImBBWwX59YJZQ== 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=7B0h9gBbp+Z7ZBLs4uCpv1CnSHj+x294vfwWPn3A4cU=; b=xqwI0KjCHgez4zL0by0UUdzRdmwFjsQ2e7OrAehucExhurhNQJH/rCY5xoj7HTOytJZlI/NIQDpBel18QsbeDuJZvV0xFcofFBo0t+0nxDFmFRPD1XzRE4AtHrmuUz4TEJXOkP5zH5nlrtCV6Vh14ccQlbsrelP52nA6gdlRX9AvuVeZcXgmIXL5OvQY6DucM/evuTAo8glZUUQq74aqVEAuW+R/PhAuR0qrUn0Xrk3GTiC0xWnw9lptnPyl4lCPM5GC33awA8XqOmJLfqJLeZXI4H1bZ2lhZR9oafn3BHi3rKPZEZa/S0lFr4EgzZoH96ZBWKJijrF35ijJd2uEzw== 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 DB4PR08MB8199.eurprd08.prod.outlook.com (2603:10a6:10:381::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Mon, 2 Nov 2026 10:36:35 +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.0569.011; Mon, 2 Nov 2026 10:36:34 +0000 From: Andrey Drobyshev Date: Mon, 02 Nov 2026 12:36:35 +0200 Subject: [PATCH QEMU HCI-8.1 v6 20/34] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261102-vfio_v1-v6-20-9bc7cabc850d@virtuozzo.com> References: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> In-Reply-To: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0048.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:353::18) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB4PR08MB8199:EE_ X-MS-Office365-Filtering-Correlation-Id: 7b35ea35-95c2-4438-570a-08df38cd2789 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|1800799024|366016|23010399003|52116014|376014|38350700014|56012099006|261009223027099003|261028144727099003|261021123027099003|261026121527099003|261021121427099003|261026140227099003|261022105027099003|10067099003|18002099003|22082099003|5113699003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: +falp2fIO9rxFYHT6U0eyEljHOtRmRrqFYCWWxq0BB4wTDR1klZXRcrHvpRSV0hiHRsLezzMqHk8Q3X3XBdyLey38A/zAEI+R6pTRiekY+IvYnGvPS2CMaKpGMp76iRtLgYHZV6FnEoLjaTtqH8z/uwCGz5FPGUYWnrhd47fCq0CiTGYgbNnOLaPVmM5n+w6Nc9t2eDUmrAJIWht0+keVTJR5dU1w53MbPLJwQtZRdvKKvMRzX3D2uCFrAzVMPY5vYXz5W38vHFifqx+jD+9xaPlyUup9cOuJa9J6YPnN8ubEncT6I2gj8dvPoXhG7BqHp2WAJxNCejMwZyUW/yPVd1V41abaKF+z0Q4b0SX9HNMtxijcus3YNnj/QDbasc3PgsElUJDN2vCMLRoNyNZrntIvUcJm4BlVNmb0gAwpr3/GZZhx+uLMsPuGO8QJII4beuXxdbS5N4JjyFQsBRBWOLv4iR6wh3by2bcbVEdNW4mc5S1zMBsYO/1sgOCeuO62PyXzSHR/Ct+Rb3mbfFquvIm12Pr6IzLehE5Gd9Ncfw2C0XOcmNcK/xF824oR9LY7QvcpWdU9AzqLjGtF0+vW4HjTUpCNNm/3anBupqZ9WwDn/iz6cM4fk2SzWnkQ2AZU2hfH2wrnmF/+6MUYGkxQpc3Q506fKH22J09tjHWyak= 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)(1800799024)(366016)(23010399003)(52116014)(376014)(38350700014)(56012099006)(261009223027099003)(261028144727099003)(261021123027099003)(261026121527099003)(261021121427099003)(261026140227099003)(261022105027099003)(10067099003)(18002099003)(22082099003)(5113699003)(6133799003)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?czVmTGxCQ1pnbnBhU1ZmRVJkOTJ0bEdLdCszQVREZzBlRmZueE5RQlloa293?= =?utf-8?B?UnFraUxvUDd2R3hzbHF4elpCZ0Q2OTZ6RVlURXZlaGNoV1N4TUlGTzgvbG0y?= =?utf-8?B?cXIxclIwSy9JMkdKWDF2RmQvd2NDWGxtcDFFeXhIeDlZanhXb3J1OW5scXEw?= =?utf-8?B?STVuRGxnRzZ6dGFzZll5bkpDNi9wcVpCbUVzbG9kU2NmdVNFR3k0cmNJV0ZX?= =?utf-8?B?NUlkQmNJcWdHTnZjcDBvbFlTQzVUVC93U2krNzAyTjBCbWxjTXY1U3FEUkJk?= =?utf-8?B?WXdncVFNQTVNTjd1YXNmeFBUNG1FN0JtU0tjZ1I0cWdvNXlxanN4Zy9GMzh4?= =?utf-8?B?cnBoL0RQNGZlS3A0WWtaNkxOTncvSnk4TkNiOEQ4QkhhcG5YTGthMEZYUXlr?= =?utf-8?B?b1hmeEFtcFAyT1dYa0I0MDB0SkRZZHFVSEh2VmRCUHZWZ1pnQkRYRzBRaXZN?= =?utf-8?B?WHZFcjlUVVd0TXA2b08va3JWQlFyVzFWN3U2V0R3MmYrYzVocmlOWXBONDlQ?= =?utf-8?B?M0t0Mjd4Y0g2STFjWmt2eXRRWVFyVk5tRG5ZOFo1dWdaN0FIZmIrTU8xS3VB?= =?utf-8?B?RjVsbmhjY0VGM1pmYWdvUlc2WHhSb0dHS1N6TEJzamEwd2sxM3BkOU4wUDFT?= =?utf-8?B?N0tNR0owenluZUphMGc4MGVCSkJmQ055cTRPOVlmNURqdFlzYjRZRFR4cFl6?= =?utf-8?B?UXpGRjBRQzF1Y2hJOWNpbGRWekp6SDZMbTJvdnlEUE1KUjUza3huU2hqREha?= =?utf-8?B?djdDbXR5b09GYkxvSS9oWndMRWxUcC85SE5LNkYyVWo3VkxzUGlmYzZLYmtz?= =?utf-8?B?cm43MndydjdnRWNDdGNHR0luaEZkaW8vc3lzdldPalJKeThIY001alZlV25M?= =?utf-8?B?TjdHbzJ1Z0JCMGxxUzBhUUUrcmdxUGlyZUVPSjhUQmk5WmNIT2FwWTY0Q1Jz?= =?utf-8?B?bTIwMWtpQS9vMGFGUDJEWkViYWszejN5VUtVc3Z3UHFHeWJBcHhMVmljYTh1?= =?utf-8?B?dFEwTFlHZnp2RVBUVzlVY1RpS0ZLUzd0Y2RrNHRodVF4VUN2bkpKZ2g5VFJX?= =?utf-8?B?UzY1OW9iRFVQdUF4dUN5RFB3MjJ4M0NvQjF1Ymt4QTZBKzJyTWJBLzNMWmZy?= =?utf-8?B?ZFFpS29hZWd4eHNkNm1uQ1pxQ3h4OS9UazNQZFMwa00yMjZrY3g2NU8zNXVD?= =?utf-8?B?QjRjYSt3ajIzSXVZMnpBWWFhNGEreEdWTEhEYVdBVEZMVGVhWVlUUWJ1N1Fr?= =?utf-8?B?SlppU0dGUTZyOHpiOWpwNlZVS01jQkdjdWhubEUzYWpIVS9sNnRMbkJEK3Fx?= =?utf-8?B?QnZ5clkya1cyNWlEUlpIZ2pMMmxCaWNIdGpNYzhaL1VPbjFlUmhmWU1WMmwy?= =?utf-8?B?LzByVllLb0w5a3F2R3kzUDhWTlpCL3RTWDRLa0hGQURWZitZMzNFdnJOREVp?= =?utf-8?B?UVhUV09mNnZDQ0krUnIyQ2JRalJXVWg2VHhUWTBUNnhtbEUyVHRHbE9uZnQ4?= =?utf-8?B?NnNVOTY5MkxEb1FFNXZwKzk4bkFpL3UrWnFhaG90Q0NCY1Jxa001dDgvM2kx?= =?utf-8?B?MVRoQ3RhemwwNG96bHdoSTI4WitDd3M4MFRJdUZwUmFqZERRTE83VCt2eG5y?= =?utf-8?B?WW85U2NYRjRFUzZTc1YvWjI4Tzc1Zk1FUUpPbzdCcUwxclBZa2hVUDFvS09C?= =?utf-8?B?RUhXSEEvaHo1M3NyNldOU2xMbFZ5V2tnU1ZwSktTR1g2N1RrR3RRKy9CT08w?= =?utf-8?B?UjU4T1FzaVpDNWlOQW4rR2Y5bmNDd3p6RFpzZXJyRGtXOTJTRjZBOWlBNjM5?= =?utf-8?B?enRVYjVrY0x5T3pjYjgzQnpESHRWU21nSTIrRWZxanBxNjVlNTAvNWVCM1NB?= =?utf-8?B?T0ZGdUc3b3hTd0ZBOS9YSVVYNXlTT2x2c1dyT0dkNWRCUktjelhLVFF4VjUx?= =?utf-8?B?SHF2bjh3dmwxbUhZeTNTbzZuRzBxY0t0ckg1MXlDOEtLY3NIR2U2WHE2M0U4?= =?utf-8?B?ZXFFR1pGbjdONWlUZlk5ZWJ5NmdvNStmenlDRkRWNk9XUjE5dnQrbUIxdTBK?= =?utf-8?B?ejBVNEhqN0EzaVpoZlZGTmE1SE11MUdEYzhVSHVkczR1TU9ycHNNWVo3dXV2?= =?utf-8?B?L0V6d1F0MkZaUWl1UTM3SlBFQXJWZWVnQXhwd00rWm9ZUWo4alpuMFRoUW1M?= =?utf-8?B?Uk5pdnloZEIyR3lwQVhtU01rRU5GZGYyTGx5UXlWU3RWdFBQcDEwRXFLUnUr?= =?utf-8?B?WHZmdHZUa2RYQnUyY20xRWlyeUpzMTVjR0kvS2pwZ1BJUFJRWjJETjBtUi9k?= =?utf-8?B?em1zQnhqVkl3VUpiNmEzK1BHMjI5dmxuTFFCY2h3dmxsYjZNY2JReVo1SDFl?= =?utf-8?Q?zP94vRl/OseTchBc=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7b35ea35-95c2-4438-570a-08df38cd2789 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Nov 2026 10:36:29.4203 (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: Nkp4UdYyHEwaiyUXmR3uN/VoM1WUfzRZp9iuymJZMSc6jfknr4uizG1Nve9FaX9S85e52clUhbOnGYlVoXuNgIa+y4xGaebVovB37GZ+CJY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR08MB8199 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 b365e413a84..d892655a21e 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); } } @@ -2266,25 +2265,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) @@ -2294,7 +2274,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; } @@ -2374,8 +2354,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