From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11020089.outbound.protection.outlook.com [52.101.69.89]) by lore.virtuozzo.com (Postfix) with ESMTPS id 4354080781 for ; Tue, 6 Oct 2026 15:35:59 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HnubSr5Vqw48kcAM0tN2aV3B663UDBe0vH9hQhG5DC3MvRmQ36JD4uhk8w06+wv+gzsh7kQSF5iXkLrIl0PjzbndA+Yz7tkyC0dN0hNwt+lWuzVfRDBVhbB+uzWD/0+AnQpu4YkkLt02xVauH6u8MqqsmKZ5T2ScJoTV3iwOsdi5j0pr2CifHukCHsfRtYQk4I1UDWcfrA0YQTk7h+Okk1P6OsBHeGjm4EIUsi643KwQnaQdLVoDrV91e+AZiH0tWBUoMQkEMnMjJjiVb5d4p+xh5KUB9zbDssxYJk+7CplyKrDJ31pHLtLu81zhPDoxEQ24HpGaf5fajut3WRvZDg== 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=MnleLCFi1VxzkYbuucAHytsLeZHlWP0uraoaoASNSY4=; b=Re3YPyBRpZAnKfTdMlsuTcSqp76keJSOAa4nLPnsBdJrxyhYB4RFDaOGsx8mUnK9+9jNnVZgEHgF71akFkbU0Oca4YT2qRFzvpJu5SzI6GqKjRmm729aXgaUFg9tiLbY5pTGxE9Z1ye7OlVvpw1kPpasTEcOCKtmkg5d56O4nolkp1YhgHFmep7nQE9YgRmw0INiMn2drCwpM8li9pXtEjM/VSgs4pOXvcXTLwdv8ygNfEYmZJjJyjYw223k4qyN0npSvge/1098Xe1IjTdPp47agmguf1C76kpoGd7Q0GxVPSKYRI57Zqko1y41Z05CZF13w8nK52vQgumEJtwfrg== 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=MnleLCFi1VxzkYbuucAHytsLeZHlWP0uraoaoASNSY4=; b=nrs4UEjnTdQyxvgwFyJ5ylBSZLIcLgFt+LBR3gM6HvJpacSoBdpWMp26WOKYDto960KJARk1qeRFAyVaQdvZ3EeZSiNzDDnddc3vBhDB00CvwLQhZJRZCzArNKUsfmnkr21dMLcrg0OMRkElgRTrrL2xfjx76UwM83bapTLU2iEL3YBAKKA/63gNA2x37BogGWrCgJ+35hgJrb5egdQw5owOnDMJ/QYwfEbxJDHxoe9h+w2ntQeSPTnCnX6mt7DmRjKVDFJxU10xj4FlBlj8yV32HHLy4u9/3goB/w+y7bKrgO7iiCLkKxwUSJVo8rq9/8NJKt7JlwdED56BRM3maA== 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 DU0PR08MB9774.eurprd08.prod.outlook.com (2603:10a6:10:445::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.496.14; Tue, 6 Oct 2026 15:35:57 +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.0496.010; Tue, 6 Oct 2026 15:35:57 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 18:35:55 +0300 Subject: [PATCH QEMU HCI-8.0 v7 04/14] usb-host: preserve hostdev FD during CPR migration #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261006-usb-host_v3-v7-4-044f668789a1@virtuozzo.com> References: <20261006-usb-host_v3-v7-0-044f668789a1@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v7-0-044f668789a1@virtuozzo.com> To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI5PEPF00000985.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::81a) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU0PR08MB9774:EE_ X-MS-Office365-Filtering-Correlation-Id: 8a4273c8-9d6a-4c9f-cf95-08df23bf8423 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|23010399003|1800799024|366016|376014|52116014|5113699003|56012099006|10067099003|22082099003|18002099003|38350700014; X-Microsoft-Antispam-Message-Info: SGSUu5mvfxRPtEVchLNfVeHMqUBInPLl1s9n/H3vV6swvWrzt2VwCIgdlESHO223OTwxEIQlGWvGmyeglF+Gpm4JJLh0Hz9YTFSn/5qvNCPnDtVzI4r6m1k0PgVGn7vtHH1lGsseII32G3eDjwEmmwd4d1pVqKf6N6TLWBCtb5RRkAMmi8vQjlbaJ0uScmbnOuiUZ5b/WssmmRis4Uz6j0RLuOpt5zKwxrpBtHAdjGgozDE8irGsqjf88+9t5S7pGQgclody/jWvIw59yRGCNePIoc4PT9eqALWDSwCpKSMwyeUNaLthx4EjKVLryRUzKdRNomrL81ndONXbyNzRRQEXmVL9lgLEBxuoH5cKmXrHDkiZRHDuzmBZO1BGR/QvZYuXjFuuYvQxYFJ5rV6OtZvtRyFSXI660R+qtIFUI1toZznIc5tXOjepXbtzXFX98ebNkeCfz8ZKg/HZGpX6QqKReQQsTfvfI43bVv2zgnPCw1/CLgy4GBiyx9K4842pvuNoTvcairthL/FZOVkaoJQkozlfijkixUDHzut+A8TW1r/015tSnQWcMw/ce86FL/pegHpIuUwRj9ZzIKev9pU1ZtmUHMC1v6LRJtPL2EELZ2ieo1rOKWOFVMrkUz/Rd7PqwEAvp5WUpzJsJspN37xpsgfNxIQknlZolUrRxRUaw5oo/KfIujhtQm1o5kG/KoHTAbz0y7EYitpwFkUWXcjuTVL35Iz4Zhakq+0Oo0Q= 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)(366016)(376014)(52116014)(5113699003)(56012099006)(10067099003)(22082099003)(18002099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?YUtiTTFrNHgrMzduUGNnTFZuSEN6dkxuZUZETXlFeklsc3M0aHZ5UVd2V1Vw?= =?utf-8?B?K2g0MGwxUWpPai9DdU1jWVJPODd3My9MQ25BQ0VrMFVqVXdvWmJLdlNGR1BN?= =?utf-8?B?blZXMTYwbDcwdHFncVkxTmlCbnJ6T1I2c0ZIOVV0Y2lxVnltWjJLdzhrZG9B?= =?utf-8?B?cWZRQ0JvRWNUaTd1RFhaYW05WTVBT3RFZk0yd3pCZWcrcGI0YUlvbk92UU90?= =?utf-8?B?VEx4MkZRK2swRHBhNDdYMVJtNDdhaGhtRk5qSDNXQjh3UEp0VmhwZ1VQcm44?= =?utf-8?B?RGxCU0JDV3FDZ21hSDAxMThsbXdCOWRDM3Nhczlyb3I1L3ZqRmhOUXJPSndt?= =?utf-8?B?Uy9la2VCTWUreVpZRGQwRlkxTEJmeEhCblFFY0FVaDhkeFJvSE4yL0NiNSsr?= =?utf-8?B?UVNQaGY4ejJxd29rK2JTY1g1UTFkR0FVc09UcWg1MWFqcU1ycUUwMnZUeUlt?= =?utf-8?B?TmMvWnh0RlZ3c2JnS01uQ3Q3cWxkb2I4Y2pYWnRkeE5BNUFVNkJvYncvRVVL?= =?utf-8?B?MjFPcVAvTDhFY2ZkMkdCZkdFSUc3WGVObFNKTURlMWZnV0F3Z1hKalZLODZX?= =?utf-8?B?RUNEcjJaajNacStlZEJ5Q1l0Y200cUlIbWJKcVZ1QU1kQnVSK3hqV2hSNm8z?= =?utf-8?B?K3lYNnVtZ29TZDdEUnNUNHpZbDNoQndmNlBpbElhQXFDZEhqMEUzYnloS3Vt?= =?utf-8?B?NHJRRmR3OWxsUFhrOVNKeVBKSis1OHVJRlBTSjJZK3ROaUNpakFWdWhPWVAx?= =?utf-8?B?SzFoU0UyckpUREErVENMb0VSQ3RaSU9LM0RiSmpmYW5ONXAvdTRKYkxza094?= =?utf-8?B?c2o5ZjZHUlF2T0pTRERXSE9BMzVNUnF3aGhKdHBSNGdST0ZzSXhmVGxvcXpY?= =?utf-8?B?bFhWZ0FUc2NJMDZWVlJzd1hDaDFDbW1qS1RyVHRPazlPOXl4Qit2UzdYMGIr?= =?utf-8?B?WitqNVh1SktYWkpwYW1abjByaldMRWlBZFNqeno2LzRRVm5Fb3JPbnIwYkVp?= =?utf-8?B?WmNVUExNZ1FiZnlYZHJEWlNZcENFRzUrWEVaQ0VIUEljVGpzZ3lJOGdOWHc2?= =?utf-8?B?eFdSdWhwUTRWUVRwaGJYQ3NHQ1p4VU94ZFp4SU9YZ3BtOTZhSTVadlRWR2FW?= =?utf-8?B?TUYrT041amdVTUJ0NjFIZEdGK1JORkoydU05bHpOZ2VXYTN4K3hoYW9iTmp2?= =?utf-8?B?c2JFTzNCelpqWEZQcHRWNVNXNFhMNEJwbFh6Y3M1dTVBb25abWE2SHhUVXJn?= =?utf-8?B?Tlk5aHpaWWtuZzVRZTExVDZYZW9PRDBGNVhqLzJKYWpOdDB6ejl3aXBJNThw?= =?utf-8?B?QXVXS2ZjTXIvc2t4aGV6dUsrcG43VEo2Q1hGMUNZc1JPMENYSmpaemVaUXlk?= =?utf-8?B?R0t0NEF5OFo5bmd3d2t6V3dLVWFZS25ReVBVMXdBbDl2cHMwWFhCV1ZYc3Mx?= =?utf-8?B?QUtnNU9VVHR3ZC9Pek9PaG1sZGd0cmxmcGQ3RkJuRSs5Zy9DR1A1WlZST0tP?= =?utf-8?B?akRmM3VOa29KMG1jTURkRXlaUVh6Mm45K0dZVitRTU1wSDFqRHBMKzRkTEFF?= =?utf-8?B?RTNXN2NnVHZraXE3dWFCT3orR0x0ZUxCRW9mK3Q5ajdweklMVVFncjA1TjNJ?= =?utf-8?B?RVlkUlVITVArWVNxSS9aa1NyenpCUjRyZHF0dmswaHp1Z3lwWHdlcDRFSElG?= =?utf-8?B?cVFvYm5lWVljUVMxSkkydDVDN1E0ZXczTnVSQ3N4dmpVMEdlbjhzSHNsV2hG?= =?utf-8?B?TDVCZDRUNHFpV29KTFVBdnBuVnNNSEVBRTFBSVNrdU5zWUVLT0Nray9UdFFU?= =?utf-8?B?UWZTS3k3M09WTFdESFNXaUZNNytsN1ljcWxEQUorTHI3bjcxWi9JS2Y3bklX?= =?utf-8?B?Q1U5SlluTkhvTTBjcld3YnFnWXhFd2pTVTdFSWZRQ0d6MHFXSU9hcmhZY2lK?= =?utf-8?B?SU5VZ2xicjNqYW9DMGN4NUFnc3RuY2llVHNjT2ZtVnFvc1FXaUdRdmQ3NVhy?= =?utf-8?B?WmxSbDFzc1paSW04WmVBTnNHN0tUZ3lrT0VXcTdVZHluNVQ2dy9aZENXYWlD?= =?utf-8?B?VUJLa0JCNDNSRTNkSmNXdG5yZElqRk04K3pDTDVXTGJlN3Vjbjg3YnUzeTdO?= =?utf-8?B?NzRpUXlRRTVWRlZ3UzY2V1M4akREK09QREhrQ2doYlI4WFM0UzhUcUZXMldD?= =?utf-8?B?Ui9wbytSWXRNS3J3bDlxWWIySWREekVNeEMyMTdEcHVHV2hqdTM4eFZsWVh4?= =?utf-8?B?NVhQL3c2S0dSUXFVNXFmM3BzbFZrRlJJWUI2bGgweGxLdUJmVE1mMWw1Vjli?= =?utf-8?B?SGppdGR0c2hPQk92Q0dkdkFlN2pueWM1TCtoTmNxNnlqQTZjTWsvMTFic1BM?= =?utf-8?Q?ovHJBySDzpDbHo/A=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8a4273c8-9d6a-4c9f-cf95-08df23bf8423 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 15:35:57.3923 (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: LIn/bOnRpbUwcLK6NM4LC4P7AOzijATlmLdg5TzRM9IfDPNJ/trV3qrYIKs2RFh8TGKKISV3sjfo7vok1LAg8YUt5Jo8GOQtqSsA2BarXHQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9774 In .realize(), save freshly opened host device FD into the CPR registry, and then reuse it on CPR target. Also, add deletion of that FD from registry to usb_host_open() / usb_host_close() cleanup paths. For this to work, we also need to skip the .post-load() code which closes, detaches the device, and then rescans the host bus to reopen matching hostdevs. For the CPR-case migration we don't want any of that as the hostdev FD stays preserved, and the guest shouldn't notice the switchover. Signed-off-by: Andrey Drobyshev --- hw/usb/host-libusb.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index e3bd7bcf749..beab8edc619 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -47,6 +47,7 @@ #include "qapi/error.h" #include "migration/blocker.h" +#include "migration/cpr.h" #include "migration/vmstate.h" #include "monitor/monitor.h" #include "qemu/error-report.h" @@ -949,6 +950,21 @@ static void usb_host_ep_update(USBHostDevice *s) libusb_free_config_descriptor(conf); } +static char *usb_host_cpr_fd_name(USBHostDevice *s) +{ + /* Prefix the key so it can't clash with another CPR label */ + return DEVICE(s)->id ? g_strdup_printf("usb-host/%s", DEVICE(s)->id) + : NULL; +} + +static void usb_host_cpr_delete_fd(USBHostDevice *s) +{ + g_autofree char *name = usb_host_cpr_fd_name(s); + if (name) { + cpr_delete_fd(name, 0); + } +} + static int usb_host_open(USBHostDevice *s, libusb_device *dev, int hostfd) { USBDevice *udev = USB_DEVICE(s); @@ -1075,6 +1091,7 @@ fail: s->dev = NULL; } if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1136,6 +1153,7 @@ static int usb_host_close(USBHostDevice *s) s->dev = NULL; if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1222,9 +1240,12 @@ static void usb_host_realize(USBDevice *udev, Error **errp) #if LIBUSB_API_VERSION >= 0x01000107 && !defined(CONFIG_WIN32) if (s->hostdevice) { + g_autofree char *name = usb_host_cpr_fd_name(s); int fd; + s->needs_autoscan = false; - fd = qemu_open(s->hostdevice, O_RDWR, errp); + fd = name ? cpr_open_fd(s->hostdevice, O_RDWR, name, 0, errp) + : qemu_open(s->hostdevice, O_RDWR, errp); if (fd < 0) { return; } @@ -1764,6 +1785,16 @@ static int usb_host_post_load(void *opaque, int version_id) { USBHostDevice *dev = opaque; + /* + * For CPR migration, device wasn't released/reset, and the guest + * is unaware of the switchover. The detach/rescan performed in + * usb_host_post_load_bh() only exists for cross-host migration. + * Skip it for CPR. + */ + if (cpr_is_incoming()) { + return 0; + } + if (!dev->bh_postld) { dev->bh_postld = qemu_bh_new_guarded(usb_host_post_load_bh, dev, &DEVICE(dev)->mem_reentrancy_guard); -- 2.47.1