From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023114.outbound.protection.outlook.com [40.107.159.114]) by lore.virtuozzo.com (Postfix) with ESMTPS id C67E380CB3 for ; Fri, 23 Oct 2026 16:54:45 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=o98bgPbkEE9Vo5NfCjJFDTmcjzYvmwJfezHtkMPXYc8Cx/V6Ws8iHKL8L8dHyyecB6bcgV2nyAnKJxrtUs0dre/JD4Q/LvOHiAa2lMd66BLwTNdZp04+8FQFt+68/VN3t7cykyxOdjp7snheNr4RQoh44DRKqvsauJg5wI/P1u6iu75DgJ74G+v3b9ebgo1+D0ThBFdXpwxo9qOa6zlZraiobFP04H9yxLo7NPnhL2jJI0WudS5MArQkbX2vpaqK7AJsK5Uq+u/uzpAK3GlAhK/gBr5WqTbVeD2hkwj5b65PqczaT2x+bAbUKj3wvQgsCgk78IJRkwdawp3/oRB6Cw== 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=VNwfmM5ndtgQHBKedLeDS3DGUCtk+T5TDnV/L3Axiuko4CBBef/D5oPI0CoTEVZ3iSaxD2d6saeHFJ0dkhz4O3iNjeT3Lwma6KpRSEE/Aq02snR37J2cRIrCuwFV56pjdn1sQAFKlrSbsWoSiOifK5/S+acT7c6VsTysRK3X42Go8WM4HD50oN+leHXTrP1ouHtXhj+iPvGMZ5riqM3eAfvjT2rgD0fQW7IPV3wC+idu+/hkHfkQsoPP1pvTn+nv3Q5pyBVLoHYolKMwqvAo2QpAdGOZ50+bihkzogXgcNNMOsLLOaO+6/RKLwwIQ7+9+Q609zc5ynerQzoBgQsmZw== 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=YTxa/JPfxTyrN42flBfALlS9K5v88nTh9wGt2+h+q7lXombb/XprLLfNpPfY/mRHj2dHTWad2/Uw8jDAAiBpEzI0kcl94VGhyhoqJ9Vidpc4LK1evpWQ2qZomhX0CaCD1E6YefhS6ZBrxgwki7yedkwHaSvo96VJfyVRxdjLvDpgsG9TLOdhfD92owdzr/D5NsEQZgqiz9fen162MHZDnFsqly8XAm4fE34lBKSe0tSIdq0TKwepviuTxXvFmKbkolKbMSyAf/2jbIfxjNvwpOjnEdedjcDrPWK4altgJN4D41hkiYQCcOcEuZVhuU5w5MTVnxygmyXSTefdOn3xqQ== 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 DU4PR08MB11747.eurprd08.prod.outlook.com (2603:10a6:10:646::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.19; Fri, 23 Oct 2026 16:54:44 +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.017; Fri, 23 Oct 2026 16:54:44 +0000 From: Andrey Drobyshev Date: Fri, 23 Oct 2026 19:53:57 +0300 Subject: [PATCH QEMU HCI-8.1 v5 20/36] migration: Move CPR HUP watch to cpr-transfer.c Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261023-vfio_v1-v5-20-ba0bf3c6d122@virtuozzo.com> References: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> In-Reply-To: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0902CA0027.eurprd09.prod.outlook.com (2603:10a6:802:1::16) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU4PR08MB11747:EE_ X-MS-Office365-Filtering-Correlation-Id: d87841b4-37f2-442f-4228-08df312651e7 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|366016|1800799024|23010399003|376014|52116014|6133799003|3023799007|5113699003|22082099003|18002099003|38350700014|10067099003|261009223027099003|261022105027099003|261021121427099003|261021123027099003|56012099006; X-Microsoft-Antispam-Message-Info: sgPTLV8/UG27qJkPas12clL7o6Or2PuyZXG39YK3Sf+yBgYWQ6GZzdQxxuI4o2nBfGv0N+mGmQYBMPWo4oJG/rZ9uNV+vOpfh5ALD8ZWtruFJYNTlgeN59VProtnipljGSD8QOQ7yrEXX+LXjRVmJtALyYahlz31qy9xhW+u6OUVh1iRnudlNxSo5KgCEUhui4PRS7L8oUOCZuoiRnNB+ZbiIvY4IgzTRrVOft4eY2+KVFfDl/CgOQ2V1NqgN16BEFX8VFyancI7yPyT5Ho15laicxM2c//XxvTbJlivspefu+5u5xLdi/V8DVRDsuBYq5t7bKWwypZnqTDV+tTEro/QJsnFxuJqOhg9zYRomdaOrUCqr9Ckh/w0GgauqJ7Pwz8r/0b3iTpuH99lVehMJY5gGVNnZrVW9ONKRv1lLYiO5fkAqk/l6+p/01a9RTcS7Q72biTpJNutRre2XCLPsuHMoEjnejjr0dfHmMsC9ZFItrksW9Q8Nh/Ns9E7AD6X9DmdwZ3hzuv4tBdjvdU1tqjcqbjmon3Me3LQrOoVzaqRI2iyB3SJKn9S220+IZIIpYCZRSTpWyS4bLEu8W5AjOqKDzjVva2WcNxbKPocl4yksPTveUjZ7DuW3mRzFuWO/PFNIkUFtBlk10dVmOeSCkG66mXLjwAj28GAWu4tPEA= 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)(1800799024)(23010399003)(376014)(52116014)(6133799003)(3023799007)(5113699003)(22082099003)(18002099003)(38350700014)(10067099003)(261009223027099003)(261022105027099003)(261021121427099003)(261021123027099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?a29aVzFpWTJRcmZvb1B5RmdrYjdRU0RPbkkvMmNHbVpnUHZNcDdaRGd5TUFL?= =?utf-8?B?eGFwRHpjUHd6aWpsT3ZDSExZL3lpZzllUTM1M2pTTk5JNVlCTTEwSFpNOU5V?= =?utf-8?B?MzlmVXNYQ0ZaY0ZxZUxSSUR1SDVlbUUrWkduTm5HK2N1VG5HbTdSekVkcmFm?= =?utf-8?B?d0cyY29Kb1puZFpWdGFQVkw2VG12T2ZidlhBeFV0ZWROOVhucjZ4cjFIQTAv?= =?utf-8?B?bVNwUFJmN2dpUVE1Q2tERm9wQzRLcWI5OE9iYkc5bmxSOEg1UkwrTFlCNGxa?= =?utf-8?B?YjRpUWN4Vnd5S3B1TE5QNXppaFdlc1kwQXB4bGwvdnlDbER5NFBHY0hONXBR?= =?utf-8?B?NGxQRm9MTzI4QWZ0RWdsSW8xbDB6eThwSnYrY01sdmZWWGM4Q2hKS1FDUTgz?= =?utf-8?B?QjR4aUtYTWt2NWFVVVlMdTZPcmpBQWRuK0hVSzdjR0NtalY3YVErSHF4U21I?= =?utf-8?B?SzVNYUNhM0l5S0hkcElON0dJNUhkL1VjRm42bkFyeDFlVnZ3NkIvRld4MjBE?= =?utf-8?B?OVRneWxmN0NMMjlrWnlIalVZTVhDT2t6cldNM3ZFZUJlc1o5OTNRdW9uNWFO?= =?utf-8?B?U2F4WnVjY1UzTmp2RVFTd0Z6TnkvNTZlM3NhSlJJOU5KYUV4Z0orWXE1QXZZ?= =?utf-8?B?TDFtY21qUktCMFdaNm1sbU94TzljVVBOQzZIVnVzdXRVaktLdEtQOFpDbzZw?= =?utf-8?B?Uzd4TEhUZUdTUEtJTE1mR01IWUxPdHNaTlc4aVhNVG9tOURHTWhaUkw3MTJG?= =?utf-8?B?TWxVVjZtR1lHOTBwL0hxTXNRelltS041TldlNnVxNkJ6UFVheGJaZElQS0tP?= =?utf-8?B?NWg2QnEyRXRoWXFPVXR1b1g4Z2RMTnRCQ0luUGdWdno3Z3BVb2xTeUdUR2Ni?= =?utf-8?B?TkJ4Z3pVejI4RVJmY0pGTG8wSE81eW9WcVcveG1LdGRlYWFROUJvcjNqYlVY?= =?utf-8?B?c0NFeTZpNmZDVENQNVF1MjNzWmJWU21vK21uNUY4dnNLZU1xbktVbjFOY05j?= =?utf-8?B?ZTF1UEtQUVFOMlpnTUN5RVNvU3dVanNBMkpETFFJa1hiOCs1bGlhR1U5YkhJ?= =?utf-8?B?a2ExejJ6TXpYcEt5eElPSXJpdEhta2IrZWJJOUMzSzgvQUN4QUdiYmpldVVY?= =?utf-8?B?VjBic0JpaE94Zy96aXR3VlV2VlhMVzdrNHlROVJjMHBUWmpFd1ZSUXVrbmcv?= =?utf-8?B?cVNJeHB6Y29HSDVLOE9aOFlqR1hsK3IyeXF3cXg4N0kwWjQybU5uUUlmUzZQ?= =?utf-8?B?ZWVsdkhrZ1dCVTFCMFZ3S0liMDk4anlYS2ZWdURHWUVKbk9hbkFETms2UHFD?= =?utf-8?B?SDkyMXVkTDhZRithamQrNm8zVlNCSHFhSmFzcExzMWFoYy96Z043cWIxK1Ft?= =?utf-8?B?eE9ES2lrQ1RlRk02Q0tRTEFYZzQzTVMxMGlXajhWQ1Z3MFB3aUViZDhZTHh6?= =?utf-8?B?UFc1K3JGTS9TOEdkais1ejdUSFczRVhGLzV2RGxoVStXeU5Ld0dXRk9wa3Fx?= =?utf-8?B?YXNIZDg1dTFhQmQzcGlESEkwZngwUEt1NEw2TUNXdkI4MjF1RzZuQjBTbU9Y?= =?utf-8?B?WkIyZmZwUkFjSElpcTRWMHM5cVBWOGZ4Nmt5eXl6dzVUOW42Z1A5aHZhV3lj?= =?utf-8?B?QmhFRGtHM0JTVUUwRko3blN1Z0kzOWdKOG1nOHFkYnY2d0ZvTkkzMGNtb3R3?= =?utf-8?B?eURwZTMxVWlzbWtrcWNpdi9nckplbm1odzZMSmtPNllwM0lORjZmZkROZVRG?= =?utf-8?B?Q0NhcHovZk41TFlLZ3FjZWhrZWkyTDM1N1o2WEhuM0QwT1pXZWRYaCtjdUhI?= =?utf-8?B?TXR1K3d5aGxlbEVyWkhoS1IvQ3NQMHNBeVJmekFFKzFvNDIzd0pGejFHRDJr?= =?utf-8?B?OWtTdmhVQWFuTmFIMDlBSnR5b0xSUTRPOVJaSkNpM3BVMEtsUEx6S2xReWgv?= =?utf-8?B?RkZSUDBDbWlEYlEwZTNZZmY0QVlSNDBzUytuUURkWXd6cGFoc3VKYTRFRDF1?= =?utf-8?B?S21XSCt1MXI1ak92eUkyRkxyYjYzcEhuNkd2V3YyZG5oOGZubHo2b1MzWW9n?= =?utf-8?B?SWtRVzF6LzJqc3phWEZQNFNCTHVwRDFyb0JTTnFPODlZQUtZZUFocmZRZEJH?= =?utf-8?B?UXhUWjNsVjhjU0RhRWRLV0p2eFpOaUd3RXlRaldQTVZuMU9ORzlLL3lBaWNK?= =?utf-8?B?Y3A2ZlJCUE9BOUtqbWFXNHUyY1VOcG9sRkZ5aXVmOThwbXZ0Q0h3TElJRlpr?= =?utf-8?B?UTF1OEZXR2VOZG13QWIyaWExSnY5QXUxNjBWWDdPU0tLSktOS3RTVlBzK1E2?= =?utf-8?B?T2RvcmdQVkF3Rmk4UzhnYU5oWkJtSTlUZkx4VUdQZkI0QS9yVmtGYXo2TFls?= =?utf-8?Q?v8vii2rGvf9zIpiE=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: d87841b4-37f2-442f-4228-08df312651e7 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2026 16:54:36.4671 (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: PjC6enOp8mzJpXZdGfzR5mQI4PvRS5iI4YjMzxQg8yBWs16/Giny5J1SX/oiysuITcn4ZLzGkJMs0mOFrvRoLDJRnE3dwKPH50bB1KXnyUc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR08MB11747 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