From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021139.outbound.protection.outlook.com [52.101.65.139]) by lore.virtuozzo.com (Postfix) with ESMTPS id 1B1328015B for ; Mon, 14 Sep 2026 19:13:22 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AcUhKQG+cxyv4DNrTHQv+8CgZw7IJYEQfeosuCm3g0lZeHwXZPw7T9BDZ5Y9UEnlqdv5KIiBwlkbfWqqBZmKt5J4/F7zViaZQKZxLR2P7ycRxabpwjmiscTdGHazcmgLPf0eLkhtGGEgJ4hktIoCWoZbZEs7T6DjyExXXi+lhet1wtFe4dRM/RL/Qgza4VjOqk36iu69wSXWVJ/JIMfcok6Xiwtufhzpp7Ouh/F56kLbtqaOuhk3KFR+t5YWtSRHBvRnapYOsuaY0Ohnp6Z7Ml1e2/NeU704028822S6gbhdJxJTIda4w0x2QJsTlLrFAjQccmX1w0ybnFrMBUfjJQ== 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=p9t7HjHWk841m0MdyBh7eXT4IsFulJt6V5gKbwEoToFvp3czzJqXqPSVtfw+3HDX7gnMeUvUSW8+MXoTexWsPF7pESlDh5M9st94g4jjWUGjECDO8L5M5z3fRWylbmvvQdsx96o3mImeM3f5dnQpn2hI44X/DDfR4QqrYxI0NL4uOGDUF9uTFksJ2sDYU8ysmCBnn3f3T46PTAIvIff1OEmCxnXpm/OLtI4zVOtyRU7NNHeqENvrstd1NW+D0F6d4wf8XjBBTwWejSlp2iuEeS8Em1e3L4quARN2r2yrQ2GQ+mYAOD9dypECJ1UKCnfJrUoVVdEv1MvYoB+7fyPlgg== 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=mNV0Lw+x206h6So5hXyiukMiotkBKaaIoD4+yOCIXZ+oX1QCo1aGcd93nmvq4WVA+pRBw0pEbUEHta78MgtyLAwqiZchfyCA8Mr6QgmlQd5knUsYNH1Exyop8FVO5kiayRt5xYSdtyZ4md66/5naDbQHPfyCvHEfQ4iWa63leCt9GtDMeueD/sDgVA1gh6YoBqJBf2yslDO1jPAtlolsMGnru63uMbk4t7O2azfuPc3qoS+clF8odnK3Lc5QZLMR9F2YM0aKma4xwbX6QPmx6kTEQduK3fqLTDLIx+awompplk3pEgI6QLO4HJmpQ81NF7NlLYdsbxp5gQCWjuwxhQ== Authentication-Results: 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 PA4PR08MB6192.eurprd08.prod.outlook.com (2603:10a6:102:ea::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.8; Mon, 14 Sep 2026 19:13:20 +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.0428.004; Mon, 14 Sep 2026 19:13:20 +0000 From: Andrey Drobyshev Date: Mon, 14 Sep 2026 22:13:11 +0300 Subject: [PATCH QEMU HCI-8.0 v3 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: <20260914-usb-host_v3-v3-3-c43a834ce016@virtuozzo.com> References: <20260914-usb-host_v3-v3-0-c43a834ce016@virtuozzo.com> In-Reply-To: <20260914-usb-host_v3-v3-0-c43a834ce016@virtuozzo.com> To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0097.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:35c::17) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|PA4PR08MB6192:EE_ X-MS-Office365-Filtering-Correlation-Id: f3d06fb6-2a87-44d8-333b-08df12943cfd List-Id: svt-core@virtuozzo.com X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr 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|52116014|366016|376014|18002099003|10067099003|5113699003|22082099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: YiZlLFJ1lLTDFED1CvRouk+SCu+CUf7j0iAVX3hpBQuaX2YnUA02/sRlJOW+E5AOdFB07HiKZaWnVovu0s80s9ii5SBInN+tO7eROzC/glT3gVakYjBk+8sB8626Q8HRMs9tFYW7e6FhlNco7NrcJQVRyNjRgWj4XWzwXQx0c9WoJJgObyO31Me0fGXvlPz1HY9HE6vk6e34/mBL/cUjt6A+stnmIG7o7l8eIOvmXKSytqX+1P9mbzVsxm2bCMHuoe1KMjQwx1FCs7J6pirmWKalL18zWqV6H3SSPeRDxyR0pZrrfSZT8RwHqLSGLK1DCnGZ7hLSiYYVCjYuKXu+JyPv1WLg0cUzqJvGGHm9O5UT9IU5wOKg6abCQX9nl8xlsJD6Xlidm/s66RYQsXoMqvBD7HPzTzSmW0+Ndw6MzWKuZSHTiXJlgAxT1exFWB7unP7Vlwj+M8s7tv5d1bjKX5nT0HxMQJmlLTw1IFUGSptoFOdZVvRap0jPeR0kndIKOdjDet3RajVVBH+vfNg0ZTkvOjuBCD7MUHH1InR0bnGevINccX3ADjdvofPUgiODfG/LxFqAo32q8cMyUoBnyXFpCM766lv6Z1gAjZz26ZDui/LnVkVvEbAcsw6e8gvQGAGfBd9cCyfy2HlO/863LXUpaVLl5JkkjsPqH0Qh0cV3Sa7Xpjg8xGvOKLjAM+FK7M3d/M2fW5862dG0SIlyINrdecVJ8nUFlwW+xeDmgME= 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)(52116014)(366016)(376014)(18002099003)(10067099003)(5113699003)(22082099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TmYzYVl4UDE4cEdtcjFaWFJ0ZGdVc2RoejJSblpVZG5VcWxrbmd5L3BQVEFz?= =?utf-8?B?VWJySmQycnBKaDFrQWp2S2tadzUwQ256UWJVTkJnYnZmNzQzV20rNkRGU3kv?= =?utf-8?B?SXdVN2w2bEMzOFRQUmlJTWJDbDA0eGtoTTcrYzZEazdRUVhnbXlva0Vyald2?= =?utf-8?B?TGhrTGRjdnZyQzF6b0t5VVNpUGFJQWRnVWMvNDRrazUrYTRCT0ZhMzhqNVdr?= =?utf-8?B?U3BuS2J4RGZFUlZKL2J5eXYxS1ZZNDYvaHVZMWVRYlVBZy9HcEFjNytBb1RL?= =?utf-8?B?WEdkNEIybGNyeGFXcVYwRVZPdnNkaXNmRlBLY3BnR1J3MHltd0lXeHg5NGVK?= =?utf-8?B?NnJzMENIS2tTTEVXSjVDZ2FTdi9yNWt1a1YyTTVibTlwK1haTVI5VWpQS3BN?= =?utf-8?B?QW8vM2hTNkNoNWVoOEdubGl0ajBXY3BuZEU1UjRPdTV0SlQrem0rSys2NGY3?= =?utf-8?B?VWJxQ3dya3RiQzl1UkdacVB3WUtzSlNTd09MQzNsM3I4YlI1L29HL3dsM3BQ?= =?utf-8?B?OXB1OStjVytIMEFaYjBmVjFzMStLc0dtc01VOU5UL0V2MldMS0h4TUNmSTJk?= =?utf-8?B?LzRDTVZDWTViejBsOXhKUWNWV1NtQXNYZVpSaHJwcE1vYzBsbUMzNzdicHVx?= =?utf-8?B?ZkE1QWczK1pDb2l4TjVqVFhjZFNKZjAzdEFJMkR3QVgwOFZJeDFYdm81NE9o?= =?utf-8?B?TFdCb1FoMmpQS1dRWGRzOG5XclYrMUJnc0JGMWN5djFXUGFjdGxjZEhHdjhX?= =?utf-8?B?aWJPRUYvNlFkdDBsa2Q5NzV6TVNyNlFtSTJHRDdmRWtHRXNETVZzV3p2TEYz?= =?utf-8?B?eHhuNmlqZEM2Mjg3NFJONkxycXAwSmVPM21JOTR6VlZUd0Rtc3lvdnBpR2pT?= =?utf-8?B?ZUhBQlNBSi9XV21qMHFTZGwrTDZDckFWYXFaYVZMYWZqbWl6QzZxa3VFQ3F3?= =?utf-8?B?UUZaNWdiU3BIUXNaNk8rNjJmd1ZQVWpaSVU2OGJOTFI3TVFlMlJRd0tjeU5I?= =?utf-8?B?b3VheE1hTGNSSXpHUnk1YVV0VE5NUHdsNm9yQ0krM2xzQldxVHZnejJPVlhy?= =?utf-8?B?bklQYkcwdS91cnNjVnltR0hNRklFL2JqL2pHUWlrK1pka2xMSTF2V2xIMzVJ?= =?utf-8?B?YmJhVkN3QlRicUZhNTdKb09sTkxLalh5d0xra0Z3dWFIbUxvZnRsLzIxaHN3?= =?utf-8?B?aC9pYTQrY09Ubk9SeEcvSmpOSlNEZ3BmSkd3VXgrTnBzejFld01yMC9KQm1u?= =?utf-8?B?TERGZjhaS1B5cXZqRWRieUlLSktpaDFlclBsaFo3ZHFPaS94b0J5N1Q0K243?= =?utf-8?B?OXQxZHh4amJkaHBDRCs2TmpBaHJOWVdJWFEvLzA0QkJvaXlsWVpSYXZrVmxZ?= =?utf-8?B?dmpWMis1d2U5NGF2WlFVYlNHdkZZemQwa2xwR2p4R1EzVmJvRkE4eXN5VDRC?= =?utf-8?B?RURjSDNhNndZUjJJdTBFcnVoNUdZY0phMHpRZUlhTFBtcFh6eCtJNHgvMjdS?= =?utf-8?B?d0tZSlA2M1ZUT0pPWVg5ZmpYMXJ0YzNaN01pU2h1VlpoRkJjdmt2WWZhVTdW?= =?utf-8?B?SDZCU3lMdVhiS1grVHZHODZUcXF2c3QyRExwZzdvM1l6aStVb0lBalBtVFN3?= =?utf-8?B?aGJhNjArV2cwNnBzSmJtWlBtN293Q1JweVNOaGFrdFpOMFV6ajg0T0ttMDM0?= =?utf-8?B?YTBGMlpjRnlRaE44Y1dGbzZwNHdVZ3d3c3FISWNIbDRjMFFtTTZuRms2ajhZ?= =?utf-8?B?NXIvMHFJK0lFNHRIa2hOZnZuSEFBZnZOWW5sMnhoZFdVMCtxM2s0VXlVeUw3?= =?utf-8?B?T2RjZjR2MjRaQ051c3dZdkxOUzNwclhaUVVhQkVYM1JNamdweDBhNWt6anZC?= =?utf-8?B?QVdudFdWK3JyYXRXdk1YYzQ5aVhmeHl5Nm1hc2FQVVZkbzJXVjc5N09TZm1Y?= =?utf-8?B?UTdzOUx4VUtpRGs4eG9LbkJHOVVhS3NKaW52clk5M0QyS21sclkyS3A2d01Y?= =?utf-8?B?S0laK0xzaHRCaHBOL3Y5R20yam9vcGRLdXdyWDVIVml2anZxWnJSS3hiMXJz?= =?utf-8?B?V2JOcXRZR3NkMzAra3JyK1MvZk1GNU9DSnh4NjFGKzM5WktYMUM5c2FKSTF2?= =?utf-8?B?S0duR2tlUUxuMFR4Vm9CQXNEeUh2QjBoNFAxZk43UUszOU1IblVFMjlCbDZu?= =?utf-8?B?bmh6bmhkWmpQYk4vYnFpSkR5U3UrdmowYWx6eXFrazBKQk0rMkVhZjRzZ2dj?= =?utf-8?B?UnNQZnlPcitvSWFqcktYdzRzNmY3cXQwV2xHTm9kdGpnVUV2MFduZ0FPSEdG?= =?utf-8?B?SzZGdE1ESHc4SEM4L1R5UExmMURodDdRNDMrcU5Sc0hNdmxsRXBQcG5ZRHI4?= =?utf-8?Q?haIhp2iU7oT1T9lY=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f3d06fb6-2a87-44d8-333b-08df12943cfd X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 19:13:19.9610 (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: oS2PLHfr3HOPDnHw6vbOPyFIp6J+buUQ8smu4fE69KGBjWU+goEq7O6kf/LKgQhOelxUjHhGSmpWmldKjGImgmDQf6qYkP12taXAcSZ8eSs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB6192 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