From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11023122.outbound.protection.outlook.com [40.107.162.122]) by lore.virtuozzo.com (Postfix) with ESMTPS id 76BDB81232 for ; Tue, 3 Nov 2026 13:57:52 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GvRBK0yphJmzBvA6f/sFMY6Y+epKDjtIv2yS7Op9yjLNs5Ac9hUXwa/nF0Spm8doY27ClTBGA+w0Edh3zSM/mcBVUUcKGs3QpgpCKKx8uVXwzBHwJ6Bndz8I1UqYx+1xiW71CirHaSPbWOSfyo1YR3n11smCZhceWqWtHsP+WZL6skQ6P9R8xIYRmQw1fm1oHbO8/9Mu6nM8IgtFS9x3iuyWIjzMXMImwI7xnPMEGLaTqO7+nqzkkVBL2I52PsCNLPd4QLesIopmCgCQv5/HWpufPnH3NnUaub+KZCmf23g1yEHuMuWjeYcs9zsB/0U34x1poBD+Pgvi4OGr0AOzTw== 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=RP84MdOrPafyadgXP1/Ag+Ua+TkjQB7qd6feTCAq34mZN+vC/1vkN+Ozn1tDful28SGEKnLG2j8PVHbqpEfYmRWJgt6hqYLR0FU0FPcmIMdyXgWpzzsyezlp8hILBOykdIdXjzvXW8uucIPvkuqVNjXJnkGLH2LIntJhKCYNHRBYwQv6Kk3HfuHIkxERwZt2A++aDvZpDHUjKjfmEsuKvHzg7Rl9NUVSwE5CkF4OwDznMksPZxg32Uc4tSKN+t/SSMI3H9/CWa3lk+nyqaKf5qP6CiVDhJR9tVXTMjBs/c7uEhRf36YJfEvCkTjS5MyUBCiWdcGhyGFSapFpIV4+rQ== 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=Cay+nLITlPyc0qN4b1goxrZAntEDLr7EDEqv7H/fxJw1VfVFtlJ0coJXpl6XI8OgzkUyDhwiJ+uEgtLI2d7f8y56grQ1AcW32ayIy5Oi5Mgtu62uP8aWHmpu2HV3RPIJssEDxGh/qo0aEexi9irUXr9nlJC1gJ62gikTOoQZV1Lx75pr3O9VEME7h4xfQXsSykeoYS9kOeJou+8oLBLr7nAEiYRP4g7WfAVdrqlk0uw+w9+dGpjaB1Rsi3Sk8DIqVccs/nKfA8j8NXg+ahti2IyzRdUaB//9uckCaGB/WO9dikurHXpE2itMjeEnK5yad6MDJGJY/uq/UGopdbhrXw== 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 MRWPR08MB11805.eurprd08.prod.outlook.com (2603:10a6:501:9a::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Tue, 3 Nov 2026 13:57:48 +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; Tue, 3 Nov 2026 13:57:48 +0000 From: Andrey Drobyshev Date: Tue, 03 Nov 2026 15:57:36 +0200 Subject: [PATCH QEMU HCI-8.1 v7 21/35] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261103-vfio_v1-v7-21-4467fdccbbe6@virtuozzo.com> References: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> In-Reply-To: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI4PEPF00000153.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::86f) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|MRWPR08MB11805:EE_ X-MS-Office365-Filtering-Correlation-Id: cb25d59e-03de-407f-8036-08df39b26847 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|366016|52116014|376014|23010399003|1800799024|5113699003|6133799003|10067099003|22082099003|18002099003|3023799007|38350700014|261102123227099003|56012099006|261026140227099003|261021121427099003|261026121527099003|261022105027099003|261028144727099003|261009223027099003|261021123027099003; X-Microsoft-Antispam-Message-Info: W9sdVdwjWBX2Et02m12qFsFroWGpe72ahUyP/qy8JmlJWFvq3PEMhulxa7Q7D+n1j3W5BcGhODxSkKW/ZLlbzKvsCY0vPbhcJtHVHJ3FsCl4QU2Am4jRJTbfE0poYsu5dYC3wI8Lk9sKoVSH7TyshDuLRIRFxnni8OiILNWAwKzy7w8XwAR2QsVZKPxcG75Oa6YEzgs20NhzJpWxEOf/qb2bunptVAq+JGyHoDDEX9uReqa8W2vWTlcAgKfx3ZNlsEGFhe6D+pvWC/H4n9PxNOVnUoakVouNMWsG3LQOCjhisEjgBjK1h6y15H3xWHMkVuHKTLR7BD36rPvkZ1jSRifZAe+iAcwhbDT5w/mUWn0z2IR3aXXB7u+aH6QYn6TXWD7LI7kJoOeLdCaT69zBTA5nn8vXdFss+TOmUqx0Bcypz6nE3HXcIXzA/DMQzLIs7aPc6dCG3TCuSAYNxo0h3T0t5Tm8hZo/e23jr9KXj3o+WpZCs4qxtl2MC9Bz4cRphnEL8WN7w2KQzWyu/hpx3OWoiY7JKYO8rvDZUNImCruxJqyC2hQp4L7NfBk9G4O1FCvMGsKpP3w+aoH19UN0md8LKhQ4ib4wJFZyjGFtI7NGTszMiJEA2Xejvl+vhfG3jZQ65UajcXWsszfXb7gPmmgJ6mLB+AUxxKEXbZechzY= 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)(366016)(52116014)(376014)(23010399003)(1800799024)(5113699003)(6133799003)(10067099003)(22082099003)(18002099003)(3023799007)(38350700014)(261102123227099003)(56012099006)(261026140227099003)(261021121427099003)(261026121527099003)(261022105027099003)(261028144727099003)(261009223027099003)(261021123027099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?akplaVNYOEYvMVRYc1laRnZhU1ZsdUx6MGxLZi9UNHZzQkxRajVvRFlXSGEr?= =?utf-8?B?TWVWQUlLK0IxV0NGaEk3TzlqTFhvZkVSOVd5ZHVRZjZhQkxBbVRxSEl6VkN1?= =?utf-8?B?ZEZ6R0t0L2FXL3M0bmFCZ1B5S3Fyd3lOR3d1VjJNOTJGTEIwQXZNWTdhUm9p?= =?utf-8?B?Mk9ZYVoyd1pEMUw0WjZFeUYwd1JVdDd6OXRCVC93RjJHYkpydlJpZ2JpOU56?= =?utf-8?B?MGVoYnhYRm5WekVvOVMzTTgwR1pkbTY3OFdVTmF4RXJyZzhMWk5ETFAzTFQw?= =?utf-8?B?eGh5Nm5oYzJvSHRzTlFTR00zVnI0SGZqMTFzbEtkTDQ5YXYvbXpQeUZYNlNX?= =?utf-8?B?aGtOY3p5MWVkSjJBMTNhSVM4SVpoRkxmTVFRTHhkZXR4am0vOEowYU5uTFk5?= =?utf-8?B?ZmNaMkllV3NrdjBQSmMvZS84RC9pWGFVZ2JDREpFV2VwcG53cklFUXE3L3E4?= =?utf-8?B?QkxpVGhVV1lOMloxdG5kMVY0TW1pdGNwVFl2S1JqS0dxbXM1ME5wbnIxVEdU?= =?utf-8?B?L3VZS1FUQmQ4Y2NZYnF4Tlk1TVdHVEdEWWlxTmVyWGxHZktMVGlzMVhJczFF?= =?utf-8?B?RGNDVW5DYmQ5Q2xpL2lFRldRNFNtdHNvVHlDK0xWeURrWkk5b2dsQlloVW0y?= =?utf-8?B?ckJ2VXVKcEtKRWlnd05CSkM1ZTJIbjRwMFJyV00yVmNGbGliTzJkREhEZGVN?= =?utf-8?B?bUlZVE9UTTdxSFVQVCt0STcxMlpDbHZRUzJDREhmdVdGc3BQMndPQ0F5OVVQ?= =?utf-8?B?NUx1SG4yMDBUMFZ1VUdpTXV1YnZZOUZSUEFMMHYvOVlzZzFTVWxKUEdITlc2?= =?utf-8?B?endUL1Q0WE5uNTFtRkdvYktZSlNIWlZUamZsMHFUeEkyckt2TkNNbFkvMksr?= =?utf-8?B?UERoODQyR3R3VlhrTnVrV09ZanRxOXZ1WWJLV3d2WVpvUGdlZ1lSbVVISmhW?= =?utf-8?B?YkwwRG9oMkVXTTZ6YW04emVJQ1BVSmxIdTVPdGEwWmphdlVTYmFGWWtqYTFM?= =?utf-8?B?bjlDdnNybVVIM2RZRlEyV2hnWTE4dVpFQkdsUmRKaWoxY2YvMThsQ25MZlAv?= =?utf-8?B?ZWZDUnY1RjlPaUhhTGFHeGNLRkJzNkc2R1lRM0YxcGVYeklkdy8wMVhmdDRZ?= =?utf-8?B?VVM4cG5kT0xEQVZFWUkvc3c1NTl5VVR5VURDL21WUDBla2l5S21kYnJTQWhW?= =?utf-8?B?OFQwTVpwTTBTRXlXUjcvek5xcUExcnQySzg2bGhSRGR6L0ozZVdXM2JDaTV5?= =?utf-8?B?UHkwejlrREplcDlCTGF5ZDZNOStodFNvUEEwcy9uM1RMZmZORXNlRGppZ3Jv?= =?utf-8?B?WVdVUUtlelloUTB3VFQxTmc2dFJ5cnlXcHBNZ0NaNlBSYXRjRUtOQUJ4VnlS?= =?utf-8?B?QmRVdDBLamNjSStvYy9uRHp2c29pSmMyaytyRGN4dHFQb2RWWWhsbjNXNVVM?= =?utf-8?B?N1lKVGovZmNtL1N4L095b3prbzlxUkNDZDFZSnJxN3laSFoxVC9vcEh0WkNs?= =?utf-8?B?blQ2Uk4vYVJldEdhUUtiazAyM1pidWZib3lXOUlINW5ETEVuQWFPcWdMZ0x3?= =?utf-8?B?MUFjRFZrRENuZjBOcTlPQVlEQTBRUlNBNTZQeUJuUGhKeExaUWJaWmJXa0VM?= =?utf-8?B?MlhFSDJLcVYvT2xPQmFYeUFjeFNGVE9qNWQyUXlwYVI3dEg2SlRkV050d004?= =?utf-8?B?SHFpR1hMT1hrTE1NSHlvK29OT0ZBMERkNmQrenpUc3N4bVVvRVY3Nk92bm12?= =?utf-8?B?V2JBZFhOOEtUUXFoNHJPTE1ISEpnMTdUNTZtMEZUNU51ZHBYTXRuZ0wxRTg2?= =?utf-8?B?OWRRRnQ2RUdYSnFOU3ZWTTVwZlRoamNhRmQ3QjJ6dERiSEc2RzA0cGlpbDdq?= =?utf-8?B?M0VqL3VxT3VLM3BBNHI3Yk4zUm1pRlV6bVNvc3ArZ2pXNm5HQ1d6ZStma1p3?= =?utf-8?B?TTNReUkzaC9FK0RHY01nRk9IQ1NOQllCYllIYkduTjRSQ2FHRUFPM3FFd0JB?= =?utf-8?B?UUZmanhBc2tzTGlOU3VZOWFyRllaVEtaa1JwT0xxd3hpNWxzb1JRMS9WM0RF?= =?utf-8?B?ODZKeWVDalAzTmdSeGZCTFJwQm5HZE5wSVI5cUpVOUFOeitQUFpHQW8xUUFW?= =?utf-8?B?Zkg3dmRTN3VRMThYWVA4ZXRnQWlHTmFVODVUcWNhRWhxZFF2cWJEd1FRM0xP?= =?utf-8?B?T04yVGhlanNUTjBFdE1OdFhETFlmbEZ0MUNMV211ZHoxbEx1dkR2aTBteXQ2?= =?utf-8?B?Y1psV0JyYXNnU3NWa2g5a2VqSmZqbXpsRy9taVBtdFl5bm9KVjNCb2NqZGpO?= =?utf-8?B?dDJrdllaVDEzdE9ZbEVMajAzcGpKVU0yZEFicHNzYXhiMCtZdVNvTHNud2Vy?= =?utf-8?Q?YH08Yi8J8GVPmbKE=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: cb25d59e-03de-407f-8036-08df39b26847 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2026 13:57:32.7748 (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: u0Id3Yx3h8aFHriUyGOamCPw3Abq6g0N5VLt/nqv/WrFDI8qSigT1vrIcs/huMLoHPzGmDnkoAoy8RX/XABpahWxERYRfpIVrFBQgwdMb+E= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MRWPR08MB11805 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