From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11021104.outbound.protection.outlook.com [40.107.130.104]) by lore.virtuozzo.com (Postfix) with ESMTPS id 4BCF8807D1 for ; Tue, 6 Oct 2026 16:28:02 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=H3q0moLbpxdEsuG96QuFbZa/ksZrARCTbYT4oxar7LeE+Hvrkh/n2dn8KuC1gToOYED65DZQhnfB67pUzhBZ6CUFsUrBjn8hh/EyrWFzquhTLNgGi/N0R4xmaFd9XM3V5XsmKg5LgiYpB/4SYpMkkEAKsutBmhyIxu4WKqdldXFXceizsJsHnN/iebx7jdTfb/NNuLnvmM646Q+qrUrPBKkl7MgaGCGCtoOkOlga9GQ19mdWB3DtIzVqBycImprfS3i5QOsnPB1Jw5YRcR2V5t7I5CKhBcb12pFVhujtXsoJ0TF8fgiQKbftdwt8Sn/PxgfTTVqE8ckl1YTQHRD/rQ== 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=KpLTYD23ob1FqxjJLVWe2hvUF7KH0/LY9TOsE/55Q6eZ52xJExP9vuV276exdKkjFbNXqieVYzByxRWIw6zzVtjYUUtNN/iQVdQArB7+v4OMvQwOQ8Sy7RX54sZTkqK23XhJBraQ5/jLaLw7XnwZYOPsONpZeqvGbHw/kXP9GgQQDxJxNlx3eJl561T3e9Iv9kZ1uxstG/xW+aD+5vYt/FDYwCtEIJDpjeXM79A+PNVriKzvx4mY+VHDk3atJ/Kb6e4fe/UjZPbFDiGC89YLJv7Zt/B74KeuGdWA083NfjI1UeanIeO04eKp0+WB30b2mKmlp7vLM8atWSvOv3Tb8Q== 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=ALukUBqVKCu4tZmtcEaY2EeiQV3ZFfKQYOFuUU2+uGk196kwCheFsEByiWAlD/hC4ZLwr4RISEMyqRVjWTmEkBo0bbP0OjXwWCZxEYuGnyNtSlrO5eqhkW9sHwPk9O6gbBZW0J3pMnYdcYNVr/YjNPwUg3bRiVdfQo7Yo+HUSSY0YyyB6djEWM8PuPXZM3+8bBFWrQoWzyzN4N4tdWBIN8pD9+zC/VKo1mcZ5bTlvQL3t9cMEPdOv+Tg8i/ROUGfr4kI0uNsdWIm8UPl/57CR6LPswCuPsMhYxDsb04EN+CwJcoPldk47w5u8+Nl+8kRg450wIpk/5I3lehpXL5ecg== 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 PAVPR08MB8848.eurprd08.prod.outlook.com (2603:10a6:102:321::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.472.15; Tue, 6 Oct 2026 16:27:58 +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 16:27:58 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 19:27:55 +0300 Subject: [PATCH QEMU HCI-8.0 v8 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-v8-4-72ae4fb8977b@virtuozzo.com> References: <20261006-usb-host_v3-v8-0-72ae4fb8977b@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v8-0-72ae4fb8977b@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR08CA0230.eurprd08.prod.outlook.com (2603:10a6:802:15::39) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|PAVPR08MB8848:EE_ X-MS-Office365-Filtering-Correlation-Id: 12c0076d-bc2a-407c-ad8d-08df23c6c70c 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|52116014|1800799024|366016|376014|23010399003|5113699003|38350700014|22082099003|18002099003|10067099003|56012099006; X-Microsoft-Antispam-Message-Info: rzqO7OF3nIEED7eXQB0Jg5xz0S3e/TlK0wweMqsg9UIaZOwfFol2BDmakdBWpPHSbcEsySctP4F4fM//SnqDsNB8+2GIYTkKKHEfFsAE2fXJL/SYBn+bKn++Q4MnO+H9QzcYjUywo/VPA+dDxIlai/kNKvl7nswz8VJLAbKihGoRPEIyrxJ5085bFnrc7krJDdl0+gHY0XZ6QSxjHfD7lzy0w9jKDp37R5LVcM/LmWl5kblMuZAvWbJ/cQ/njAn907H10oE5pOjKFcnKkWBNfkepudZKRWdpSZCkAx4uk2w4DlQh9C6Fd8Rhzgyke0vlBv/heQMEnz442IbOFwsr3TKECr/4BrR0e9mQgExNMLwFHyzS/i7ScRUiiuC0+wK3iZVbKGmZlObeFEXT+A//5of/pK8KFEN3scflp44PHuxf340d5DuIkhx21WB/rKpcvVb4EUKFMqRSt83CuldvPyvsdykjlAeH2/GPWpfTBIrkmlWaYUGKxX585IHii9blG+MiZgks2q8c+LxFj4KTxyagajVUlckywnOOFBBr1rC+59qSUnOJMRv9PUg3FVXvIaU1mx4iFOiCOAx66/VfAwu+GlqPhBY9Dc+GrhM0+j3sbmgAukocDudFDDJj6qG3e/RY7K0i/vE++Au+cRXfKMARNsg7AhAEw8biCGBBUYS+8uf2s/wCQcpixDiwsBHsl31jKrbguiBMqpWtsRX6+5z/hPaE2ZE/xoiSqb0MJAs= 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)(52116014)(1800799024)(366016)(376014)(23010399003)(5113699003)(38350700014)(22082099003)(18002099003)(10067099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Y2oySUlaemJVMXFEckxYOHJNTExhSmlLMExaZzFsY2lkUjM0cTdtdU9DVzZK?= =?utf-8?B?TURucEFWb2FISENsV20xaXRJWmZZenZ6NlFaNWlobTRHQnJvVThLZGlaWXRB?= =?utf-8?B?NldzaWVzMW9iRDNlUU5mN2txSUNMWmsyc2RsMVczL0xuTnBwM01lQWh3bHpt?= =?utf-8?B?eFhSekE2SnFvR3NEUlJrZE91VHFmK0lGbC94OTZRcWtTbkhONUh6VmdKa0tZ?= =?utf-8?B?Qmk3UWhmS0RpclJFcEpZOEhWLy9rSnNHUG9kZExNR1ZKS0xHbDNPSmdOaUkw?= =?utf-8?B?akowU1JueG9zVWMvTTU3dUZNUkJQb0ZsZHZqaVlmdlZmZ05PZVFENXpjZzZJ?= =?utf-8?B?YzlEa0RQd09xMFp2TDRJWWZ0c0VjZnp0OU9aZ2tBWDhub3JZWjU2dGk1T0hp?= =?utf-8?B?eGM3TUpiN3dxYkJsZkdESGVLZEJvZ0lRbTNGMEk5ZVRyd3pMRkVoeVBVQWtu?= =?utf-8?B?NkFIQ1RFOXB0MEY1N2NKR3NUMXN0Ukh2cnlrNUY4WU5kU3NMVHF3b2tEc2dl?= =?utf-8?B?MzFNOGNnOXpvTFlFUmhGUm5nb2lEMkJkdHhjRDlVVDVoOXl0VmlnK2xMQkhN?= =?utf-8?B?WFdQcHVHM2sxRmpCOUZ3aDNKV2h2bGluVlhmV0RFQkJUWEZ0azBhS3FGYVBH?= =?utf-8?B?cXhCV1hjc2psZFhsWWFSYUJ6dDJETTJyWlJSWDdLY0JEbDk2UFJqdXYyWVZi?= =?utf-8?B?elprWEk1UXlzTHZOVVpoK1ZVclp4a09oSXdxUW9lTkJNT09PR1NvdXB0aU1i?= =?utf-8?B?cUw0cms3NzM2VjR1MXh3Vk02YUM5b2tDbmFQemdWQTVDdkZKNVRmaG1wbzls?= =?utf-8?B?RVd1TURIUVVvd25lT3VQUGRYZjcyU1lRWHhxK3dHYkdraTZ4UnVERmxQUVNu?= =?utf-8?B?dGNZVXU0YWZ0NHIrYWFBcWVrNkc1bEorWFJzU3dXL1gzclNvUEdUa3pjMW9C?= =?utf-8?B?K0xsVnNyYVZ0N1VlQXlWZjlQSWlJV3pCNmNmYjJxMTN5c1BFYnJFU2tCUDkz?= =?utf-8?B?diswd0Q4TTdDSlRpeFNMaC80ZEVSaE5CZnpKQ1VGWTBtNmo2NncxZC9qR2tz?= =?utf-8?B?TUMrR3BNRWZYS2orTTZIUGN4UFNiZ1YzUEpFOS9MekRkWDMybVNJK1YrZXVp?= =?utf-8?B?MDErZ0x5OVRlLytJTm1PSEFQcDVMdEJlSGVqZmVuTUYyYWRvSnRQTE8rTVcv?= =?utf-8?B?VEU3SlcrbFJxVDVRWnY1UnE4L284OFJXbHVwbzZpejlBYnhpZUV4dDNoV0dS?= =?utf-8?B?ckxIZTB6a2ZvMEs5bDRQZit2UGZFMjBickdRaWZ4SGY0Sk1mNWpNMzFEOFYy?= =?utf-8?B?ajNBcUl6ZHhMSmdKOUFTYnJmdzVpYWdWVXFNTTB1QkxMTnU0RG14dlJZRy9v?= =?utf-8?B?REdsWmpyZzA2U2JHY3R5NXlNRTViOWdPQmpnOGEwczdlemlFcnZFalJFWWpn?= =?utf-8?B?cXNaUlBaQ2wzbjM4TzRhTjZMS2VVNFV6ZXB3bFFHK1FvVThRUmdhZGtHT2NP?= =?utf-8?B?T25qUndxRVVFSGxmVUhiT1JGNERRU2dTQ21DUkcrL1REZUZnbFExbjkxUWtu?= =?utf-8?B?eW9BOFk2bWhlNkh3TWtjb0VseHp6Y1FGREZhVTRHcmZVOXR2VVgrenZZaThK?= =?utf-8?B?TVk5SGZ2M0hlT3lFNGhBL0NrY1VoOGp2OXpDcUZHUmduSGs1elNpWXBaQ2ox?= =?utf-8?B?NVBzcXUxVE16anJNbm1LQTcrVHBFb1BkNFhoekpNZHp4TjNia0w5Z2tyOXpi?= =?utf-8?B?YVpaYnk4a0hHSUdjYmtBdjFUTnk4ZzJKNU9ZeC9qRXo1d3NXWENvRy8zbDZ3?= =?utf-8?B?SmdJTForeWFLc3JlVUd2cjVUZjdUV0p2L2twU0tKT1JMN1VTNlppaXVXL1R2?= =?utf-8?B?SnhxaGx6OUdXc0ZKOFdqNktpMmR5SHV2Q3oxWVI0MjJOTGM1alo1R3pINVlP?= =?utf-8?B?bURKWTBCayt4UEVTWXdXNXdkMGRUWW9wN3hFY2U3VnFSTlpHMXZ2ZFNPZVRy?= =?utf-8?B?NlhxWEQwZEdwRmlDQlVQVHRYbmkxbjlLUGZ3YkR5azBhdGlpOGs1RSs4RUlq?= =?utf-8?B?TXYrOFovaDdtQ2dPZzN4eWtKWUZINlg1cUZCNzJTekVyMm9TRjhiclZFVmdq?= =?utf-8?B?VHB0WGw5ckQzbDhCblF2cC9kUUkxR3l4ZkRmUVRwZ0VLTUFhKzhrUGhXZDR4?= =?utf-8?B?S1NMRlFZcW53eVQydXVMQ1YxK1BrUXhJd2pDVnc0eitKbUdVQVUyOE1SZVJB?= =?utf-8?B?U3NUNXRjVVBIODdQVXY3dW9UWUxDaXh2aGZJakhQRHZUTHdLcHRIb3MxcU15?= =?utf-8?B?aS9YWlIxYUhjQzcwT1E3bjhWWmJQeDg1Qi9TN1R0ZGs2d1dkNWdMM3JqOWJW?= =?utf-8?Q?LU4wNHI0zfuK3tzM=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12c0076d-bc2a-407c-ad8d-08df23c6c70c X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 16:27:56.0957 (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: c57IyGqAOLx+tekGp/DV1y+/YtfNhmZ+l4sq9o4ThejFXF9PIKwYYecndewMUE0USX9lbW7xZLau9XYMTu1Q3q2EsYqpzC3DNErlCIYN8cI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAVPR08MB8848 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