From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021123.outbound.protection.outlook.com [52.101.65.123]) by lore.virtuozzo.com (Postfix) with ESMTPS id 3761F8065D for ; Thu, 24 Sep 2026 16:41:38 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bP0AG8lzjx/OTo2NPudGSWVaD+6bkF+AlbMy8QOHEJKuIqjERrAObiBH2gk2YUO8e1aYCcxpKXvfYUskl6RhCU74dbLyk6zwYctcNaf09FgdNRUtxqA23OEXS/lPwghYvhBf7PgDhOKXNDrykNEPAfCVPkE9mhykXe24Jk5l0E/ixBsVukrkF0P1CtpD9Wb5xdouXHrZASgy+471CrQeQEz6tYJpp41C5/f7d/DZjqJaWWhVvNdMbtnA3NYyRg8CIVohc+2mC5usP/Iala7hhJDoi2GP50Dc/X1e+KrfEPs2YEazNVvHJXLG5+my3aVCvgz6L3s8vJUtyWh2t/NZEA== 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=o0dul6NKm0cSpNn3v8g42v1ZxLtOiFim0kP9UTB7S50=; b=u23iJQa4sgPIMtKdnhAFEfoof6bTWFDVMZEq6uXd9WBsYTqjRoaO6dLolApXfg/2j7c+OFALQmQ54r6PVBsun7PsLB4EqRU9wWD63PehVDXflz2c5sxu+QV7j7xU2S9fwh9M93CaTBZfKjI+FnpjKXmiE2zgaA/2L1KGN+4qFdNK2SZk3CL3dtch4vol8lo+TX+xF0yc8fRoFvRzxP2sAmTFPPHYze2BTtF/S2LGKzQMCvnen1umWIRdi4l9yIHzH/4MwlQbzuGrBCV/DnUh95w2flWWuFE7/dlrd5leB0JUKGj+Bv0Yq2H7YKUOVGbWK/qXm/MGcVJTJyy5TdRojA== 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=o0dul6NKm0cSpNn3v8g42v1ZxLtOiFim0kP9UTB7S50=; b=zpM4b1boKrVqYrRJt/33vbrzNnLvNiH90KD+WUAljk0R/dZvDYiL2Ul78SvvU5lp8W/v/ZY8w483o3tKf1vPePCDDkdQsfGF507fvxQS3MK4yTJky3s5+LuqkE2aUo7m9hSQyrvXqlMxPV7ZHAMdjgkD9hAweVldxp0afKWoMAupR1rOS21EJ6t2uY8RKGvlSd+On8jJVlmcGTxSBp0u6X7sNucTq49qD+GeryHjVhE3JinpfNBGfS2wLO5Ud7lePHZuAQ4cr/iO3I7f42yJLR26sPDI8AohWA35dRLewDLVspUTm+2RNyJPuwhgWjaHlZrrsWj78Emb3vz69yD9kw== 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 BR0PR08MB151385.eurprd08.prod.outlook.com (2603:10a6:2c8:30::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.18; Thu, 24 Sep 2026 16:41:37 +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.0451.014; Thu, 24 Sep 2026 16:41:36 +0000 From: Andrey Drobyshev Date: Thu, 24 Sep 2026 19:41:26 +0300 Subject: [PATCH QEMU HCI-8.0 v4 03/12] usb-host: preserve hostdev FD during CPR migration #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260924-usb-host_v3-v4-3-1cc48bf630e7@virtuozzo.com> References: <20260924-usb-host_v3-v4-0-1cc48bf630e7@virtuozzo.com> In-Reply-To: <20260924-usb-host_v3-v4-0-1cc48bf630e7@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev , den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0030.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:356::12) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|BR0PR08MB151385:EE_ X-MS-Office365-Filtering-Correlation-Id: 8783d1e8-f368-410a-d340-08df1a5ab312 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|52116014|376014|1800799024|366016|10067099003|5113699003|18002099003|22082099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: cO2sKCIxvD5p/dLveRmMrUFuStAwR88qU9SoeR/DpSQPf6NEHdrFu9nP1H6S1m+rr9cQPgwdQDR1WV3SbSMwgLqlJYPIWstxLBAvwTHamBvhMpBHhMvI5q/5OEEzwt5mtaNaP6PTW+15EanvFgfcJbMnpcQbYvdIgkLzZViVnZ6rqcVzPwAYrCxk7PCawXN8cWdffDHT9wVIc5ar13z6RIesL3F2RJqPbwWdZz4meKdcBiZgDWP3M+lO9h+s3Y4EHAjnqaq+7rjZ7haor0uWVA8U2WPx0hmcprk/pqGcg1R8NfxyZQerAK1b70IUWaLuBezvyDDO9byv9YIAxJpz3aOGsTzSql53J5/tnVDzvn7OyYL/PyXqq+TW6R5yY6fMlT2cOm/vyI3RnvMwB2o491SpRZ/h1Vw3w/9Dqao1OmxL+ec2cCbUzWGySneSAX5dKJdEiiDaS1wOmOv7zjjPN62CVTP3JsWzHOhcxT8YCKVazwk8fLYSksowdkY0YF0MP/rsHFMv14A6G7rQ+QHXJdwvD8WHWxc8R2jk7q4okix4cwPlRBN0pg7Vf8aXDPFYH1qtFcn7jzS4W8mDcX5fOvhMi9bqLI8uYrTi0coK9qBLMY9MEcXqAHyJEVOjVKRc/GXPyh10R/VZgiVfUjMKuI2szKSQ3GxxdcimszuYkOcVbJ/I8WJ2St/7tqEs+j6nFdVv8XTnT7wJI4BD60czGQsmqtt5o1WeWPYjmc2lUao= 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)(52116014)(376014)(1800799024)(366016)(10067099003)(5113699003)(18002099003)(22082099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cUNmVWJMMnordEFwb216NlRiaS9rNmlHZ2lPYTdlTEZkNmdOV2taa3kyZ0tm?= =?utf-8?B?OFVXbG5mT3JScGdyWWllMzdqeHpVdTBHbHo3cFdYSTl4NzVZd0JISGtLOG9D?= =?utf-8?B?SGtBMktGR1dFMFd2VVZDUWRUUFNvdkw2UDlXY29IcnZ5RG9xbVRidHhkUkJl?= =?utf-8?B?WjBUNnRsOVQzbEpuWVVuTXNnNEQ3RlZXajgxRUFpOWk0TGJBM0NWdlBJaThU?= =?utf-8?B?SXRTZmFzN3JuNm5VZnJkU3dDcVhFMlRmWkdkeXo4TS9UQld0aWkvNlZmNFdh?= =?utf-8?B?eGFyWmFzazY3TXJsYVgxM2tnQ21PaWcxRjVuaUlrQWI0b0JyYWZkdnVFT2lM?= =?utf-8?B?VnJsRTd5V0oraldVM2d5MnZocUoxd1luVnFma0NJR0JIeXJ5R09uQXN6V3Nv?= =?utf-8?B?Ui9pUlhzVkMyaEc0ZW5uczVpYnNkUUtIaEpIM3VjRCttSkN4QmxIVEViY3BY?= =?utf-8?B?ZEhJMi9OVVpseVZMdWxqd2QyS2ZKb3N5Wk5YYUNBUVc5S0pNZWZad2J0S1ND?= =?utf-8?B?QkpSSUg4aENvQURBM3Y4Rk45NU9FVkpjR2U5clBxRGZEK3hxakwrQ2l1N0pi?= =?utf-8?B?bGtaUUhzRnQvZTRGRjR6amJhbnp3UHVockdLSmZURzQybkRWZ0hlbE40a0lT?= =?utf-8?B?MHNtMDdRNDAvUWFXQWNUcXlUejJQTkVIdy9NVmhNdDNiREZQUCtpVkUwRGZ6?= =?utf-8?B?VC9vbmNZZEZIb1NPcFJSeU42ZU0xdWVrQnU2aDVBWTBsUWgxV2dvWHRqSWk2?= =?utf-8?B?VXhsNTBpa1NoOG9zM28zb0lTSG1EYjhoMVcxREZpTG5pRklLaXM5bWZxbnIr?= =?utf-8?B?VzNXWXEyTlpIYzVIbEEzSUNTRGtsandoVHVxM1RRZUZVWGE5ejNFWkpIT2Ux?= =?utf-8?B?L29ITTdFNGpmK25zZUovd3ZVRVZ3VHlGVDRraWVwQWVubEpmc241aURJQ0c3?= =?utf-8?B?UFl2czhPTmVGU0ZpelIyQ3NCWkQxOWs3NkZMUGlmS3JwK0ltb0pOMUgyTUFE?= =?utf-8?B?dnVsWFdtb2JaRXFZZkQyRXJkV3BGOEpJQktuMFlaTTgxNjIydUl0b0lzMWRp?= =?utf-8?B?N2hQQ2tMejQ0WVBqOC9QTFZuWk5kSk5UTWlLclhXN1k2U3hXU0ZmTTVCenhM?= =?utf-8?B?SWYvOVpqV0k3K3pIeWZzZVJvWkJtTmRvRHozWFgxdy9XNlhGYWQ0Y25yMExX?= =?utf-8?B?U1VId3dOWUQ3SVV1U08rUjZQTjNhcVYwNXJkZHpETnUzdVorTmlhSWw0Z1Ev?= =?utf-8?B?aFEvTFBJcm5OSWx6cFpRWkVncFdmQ0JFQjBwUWl2QytwQVB1d0FhMUpORnRu?= =?utf-8?B?U3JlNklocThQb1B0WUlaTHdnYTFhT0M0QlZTNVVVait1RVg3ZTA4Zm5naFBv?= =?utf-8?B?ZVE5dDBrS1RWdDFqTGViSUZuSzE1ZkhtZ2ZtQ09DRklzeVdtdmJFQ1lTdDNv?= =?utf-8?B?aU9pNzEySnZXMFZzSHVaQ2dsNHlDd1FMZnZHYXFxOUZ2QWl2dlZnMFVTZ1Zw?= =?utf-8?B?Y0s4eHQrb2tMNzdkT0Fyd1VUTDRRZXc3b3R0QmY3dXc1MjY3dlVNa3JHYXdy?= =?utf-8?B?TlQzSjYwUHRIdDVxZHBnVUtYYkU1ZmhGSG02MmRINGExRXpkSi9mYVNEVDZZ?= =?utf-8?B?Tk9ER2Z1K2ZZME1wL29oYkdEY2I5U09SM3FPQ3F5ZVhGeis3VnQrNU02QWVj?= =?utf-8?B?VUN5bVBnQjR5bXczZmdRblAvVStCWnZ3cDczKzEydTM1S0ZzcS9kZUNaZm5J?= =?utf-8?B?R0NDWGZ5OGFQU3hHcUtkOVdMN2lQRjhmV0dGbnpkRERMZnBBSFl5ZTNKUUYv?= =?utf-8?B?dnNkOC9VQm5uRW16QXF4YklhWlNVN0p3cklOU0hmOW9yRDJWWE1XS0N5QjF5?= =?utf-8?B?aEdEV2c2cmRrMXg1dDk3a0RvWVNHekNWU1p2RFhlem05YXlJZmszWTdjeWU1?= =?utf-8?B?NGIrK2VKMEIrU0VleitFTU01UVN2WmNGVk5JNFRFRmFMY0dMZ2lMZmpiZUlQ?= =?utf-8?B?RDYzMXJ5aGxTaWx5dnUxL1B3bU1STXIxajB0VGRIK3N1dUxSdmJYM2RwWGxh?= =?utf-8?B?MVR4Q2Z4dTVsbFdPTG1QN2x4Zkp6VFhaUHAxUkIydTFaeEFENnR1SXFnZTI1?= =?utf-8?B?ZVJUUkRxd0RoUVdlcng4S1NOSlM3dFlRblVqOCtqNWZ2cTlpdXQ1M1N6OUw1?= =?utf-8?B?UXFsa0xUcGlham96MmlaVkVjS2JCK0tRTUNZVE05T1RWNlczbHgyazZQNXdl?= =?utf-8?B?LzJuSXpTQ3h3c1VmN2RndmtuRGpyQjh1ZHpBVm5JRTQwR2JvZWtpa0xjeVZh?= =?utf-8?B?aFAwRG1VWkljN2c0VUFMTTIzS2tYK0hHUlN5alYrcEU5MjFxYUlMbVNzMFpP?= =?utf-8?Q?g0KXAjnrbz9yo4PQ=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8783d1e8-f368-410a-d340-08df1a5ab312 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2026 16:41:36.7503 (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: q7rgBsePxuF1rMNDGKspktP532RCmGIcAEFg60EE+Lc2RusuWhRrO8+1389uYSTykSfGcipze+cIaasF8mk4ivCfbkYeW7SmnbUg6Dj+sa8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BR0PR08MB151385 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 5c3da00d8eb..b946b0ef350 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" @@ -947,6 +948,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); @@ -1073,6 +1089,7 @@ fail: s->dev = NULL; } if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1134,6 +1151,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; } @@ -1220,9 +1238,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; } @@ -1761,6 +1782,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