From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023082.outbound.protection.outlook.com [52.101.72.82]) by lore.virtuozzo.com (Postfix) with ESMTPS id DB12A8017D for ; Tue, 6 Oct 2026 10:34:34 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IUJmyH83ZV735lFwXA9bDXi/y+KMmuPSZepvEYbbq4//6h5/BBWtDnlZboc62st8tBq7CPIoVhay4xbpivgzycPctIlQ3oo+0XeO2K6FfO8HgoB9gvTad8/DajwpNgnVsKtCRCXx8JJnIF4DpiK5ei3gdw9MjW5A4Stu6jfIGqtiDMf1Aa3j5/LSygbuT1eGqi0mVQ8C8/F/xDD0twyDPiS+MQxvh/6cU23pPFpceyJ0rESk5qwQL4q/BgpIgCtX2JKavYajR0nwLlfBqgy39cNdtb88eIVDc/BL6jkOhompSr01IT3tqpSrue2XdkRdCoDziTHFZxB/qZuDm74cnQ== 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=MIGRw7EY815oQTPOkOAwEVYidIRQbtyvYWMBjXQoaZg=; b=b5yl4ligEZxxnmpo+jtOtFWHGBFsGzMF6o5IK95Xd8IpCd+dWGvRM8WGLTnZ8qsUGLTTX0RnItH8Ptzyr4l41EoC7wZlwpsC6N12SYw7+TXJrSHylwYz15WEGdiGGLZr+8XnTl2eO8pIQHDpA9z7jpugr9jIFa+DRXxk0p4Yyo3RwhEszr7eVjXhfBnWRZZvUYAlomBJZlW7B4YIR9+Ik/pGUPIUkeugA5r0sYGvvI/z7U2/tIAzxYkiQYDfmeh/D0RG3WP7ZkRWk2Yc+x9JbxH2f+i3sKhD3uiDFwXpYAL5AAFTelQAp6rFDgEjAB8TkJEFKl8uTcqrm6MhnRGjdg== 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=MIGRw7EY815oQTPOkOAwEVYidIRQbtyvYWMBjXQoaZg=; b=ymVMjsBr+tkc9rv3A01P7cfJkt7/uPOAnelQrc5LfQHav7wLYIC3/Or2ZulXasoC6Nb6wjSO239WTSOYRwXT6joVr2oSFcuNoTfGDicCgA8Vh2W2zb1D4FzYBRjo5be9+6oYNGrqE3N6EAeTgZwpg1quOpsASzdgY5vw9xfXKtKjPdtc0R7tlfkxUmCc0djmZk+QCzJIoPzk6RLqB6OWJiQ5/Dpyi0pN1C5FX8iF79fQNLquk4nQ4j0yrRVguum7G78YobhnJn+IlyPAoHBfWIhvt6a0h2krJzinPja8qip7d/3vnp3d8P4aTj/c/VJG/zXJhA9JoOXhyebedhvO8Q== 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 DB8PR08MB5515.eurprd08.prod.outlook.com (2603:10a6:10:11f::9) 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 10:34:32 +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 10:34:32 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 13:34:27 +0300 Subject: [PATCH QEMU HCI-8.0 v6 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: <20261006-usb-host_v3-v6-3-8688ec9576d1@virtuozzo.com> References: <20261006-usb-host_v3-v6-0-8688ec9576d1@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v6-0-8688ec9576d1@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR09CA0115.eurprd09.prod.outlook.com (2603:10a6:803:78::38) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB8PR08MB5515:EE_ X-MS-Office365-Filtering-Correlation-Id: 9a85a2bd-6569-450c-57a4-08df23956856 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|366016|23010399003|52116014|1800799024|376014|22082099003|38350700014|18002099003|10067099003|56012099006|5113699003; X-Microsoft-Antispam-Message-Info: tq7Jozk057bKF3QYW1wNZQMtD+Xcv6jtiFFaGWgNExkuOUucOnxkKV/FkXQ9mjwactOz3iyS1NgzlOnM6wdgRscTJTLIAEHxP11NNfxaDfYyBZRxiSGVK0X3wj5sf6dON1JbRRcGudo08Us+SWp2H9F+ejspBmJrV9qUEVBFnDEl7SvMVixGhoVZ7Nylvm9tFFeLS0oumplBf2zFi4QgH/sIyoalWhNb/a4rjqd4OqJYpYgZ8a4YVouN/SBg0oyFI27IQQQSA6gTrnxJ4zMejqFrh+6ZFENZn/cfkStwFF8w64COd3nJU6pPS0qFvmKiWuiis7EGlYvaX+AAme95AT9o7EvzvVEDZxonkMA4yOpZZursvFu5cch9yoIZhRaEfyFOqHEUVYakc6S5SrQnVD44vlNjpmBT5hdvOAwU/BFEny9aO3KTLcjLsZT0Bx6ouUkkarz7sg5JiHRS/8ZUKOqiQEVoH3J8zyz7gePUaVMMAvK21vYT/nvqxzP+jr8nPXb2ubn7443BEd4BHgdw3VonagJ1Wfjqu1AJqpfh1sH3tyLUtDUMquIlAYhwYBGG+1hybLYuYalj7CbzqiEEZ1VQrdTWk/2jPtQlQssvbyLectAmXBCUqx2p7jGvDdxzAUjjc7mHAvuqtSay2P9nKQBU94NIp2d2iK9SaK9UqpyIGhe1tWFYOqyxmDZEeuuyoK4Y+q1ORXEnaoaKlIYRfca7vROPkMclQt4X8Ye/uHg= 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)(23010399003)(52116014)(1800799024)(376014)(22082099003)(38350700014)(18002099003)(10067099003)(56012099006)(5113699003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Y3lPVXRXbVRsZDN2QkZrNGgvM0V4dVdZK3Iwc3N3RkJqb3pHTndHUFdVY2RO?= =?utf-8?B?cHdiUVpKbVRrSVRhL1lJb1VjMFVQdzk3amVSZkJTdkJTTnJvK3o4U1h3Mkpt?= =?utf-8?B?cHlIeGFPYk1RdUhYZGgrT3lOR2E1Ri9PclpVNDN5S0I0NGpjcmFrTmIrTHNm?= =?utf-8?B?YzlDZVdhdytBU0VWbXpyMUZqNmZ0QllyTi92bVVNdFp3SkVIMm1RbHZzeE1L?= =?utf-8?B?SUxOcFlLUEs4REdybXFRb0xLZVpzYlpwSTFxUDZEVk0wU212ZWxjMERVUVlp?= =?utf-8?B?WnNodEpZUzN5VktVVEFqazVJSVJ0akQ3WFdFUmhSRVZTZHN0b04xVXI2WkpJ?= =?utf-8?B?bWNWS0RITVYvMTBucGJBVTN6cE9zSTlTMW16UDZGMThrTnlQaHVBaHFXL1J2?= =?utf-8?B?UGFRSFF1RzNzeE9QWk90dVFBbk8yOFZEQ0l1eEo3VUU0aEVXNjVqRzE0eW90?= =?utf-8?B?UFppV1ZSQmJNRDFaSk91R0JyNEhkaDFlellsQkI5WkdNMUdldjk2UDRGMmFn?= =?utf-8?B?RXFzVlY2OXJXRTArTXQ2RXpFWUNzeUdaaVJDRzNVclhCSnVBanhRZVozV0FS?= =?utf-8?B?eFRBN2swcTlJOEFLcjQyWk5zVmdySHZDNmFQcURkVDBjaUkxZlU5a1p6VDBm?= =?utf-8?B?aFBab2k1V1gybGY3YVlVQ0c3ekIxMzVoSTRqUHFUakVLTlIzcmwvK0hoNmw1?= =?utf-8?B?UzVFREJxMUJpSVAzdXZaaFY1UXZLMzBUdHI0ZUZ6WktBN3ZwMDV6d2VHbVll?= =?utf-8?B?ZkExYTkzeDVmRWhER25wUUJ1M1pSS2RMYXR4QVRQZm5IKzkzNkFKZllrWGJV?= =?utf-8?B?TWdaYW1sZzFzeWx2WHRCak9qQ2xwVlgzQTl3eE5DUXo0YU02VHQ5ZE91Rlhj?= =?utf-8?B?dTNlcHlKc2R4QVBZc3hyYm9oVzhtQWJ4UjNBQnVkeG4yUFp4YkVrQ2NJNHhv?= =?utf-8?B?N2FmbitYTm1sZ1dxWEcrME83WHlWdkZCb2plTWtteDN3WVF2V2lNN0g5MlY1?= =?utf-8?B?Z2ZFZnh1M280UmZPTFpzcFdyUC96dG04dExwNnVpN1Z5M1oxY1Y0dnJJRCth?= =?utf-8?B?dTh3dVNtTU5YbW94bnVra1k1OStQVm5FZ3hzbUhLa3dDaXlQMXRLWmQ1a0ho?= =?utf-8?B?NHVtZU1FKys5cjRwMHg1QWtEb1o2alVnOGp2MjdTNVJBWnoxOExjOUxnRGc3?= =?utf-8?B?Zjk2S0NLUlJiVG5HNy9HTXg3M3Z1amlEZ0dDalVRbm04ZEJtM29xai83SVJj?= =?utf-8?B?N1M4QXJKbG1oOWtLK3czaEFtM0VFY1pVUVJzZ0tpOUlDbHYzVnF3cnlTa2dY?= =?utf-8?B?RUZ0d1RzMDZQU1RqQzVTSXBWTW9sRGRUMmpFL0J0MndFelNVV3g0bStvSTRr?= =?utf-8?B?OGpwRDI0Vzd2UFlSQVhmbm5jQWo2UXM2aitYYnE5NFhmczE4QWtDb3lYZ1U4?= =?utf-8?B?VW1RZHR4c01LZk9yUlJGRHVIejZUb2hFOU1mWjh5VjNFdVNzQTZSSGZ0Skwz?= =?utf-8?B?aHpwdFlISjFaODk4VjdwKzZJMjNwK3k5ZXFWOWlCQTluUHd3SHJpWjAzUjdD?= =?utf-8?B?Y1puSWJLRm1oaHQrSTNSNE1iZ0NTRmw4SHhxTGQza3NRWUg1QUtLOG11cWs4?= =?utf-8?B?NERWRFRQTXJsUjNMNmNONldOZmkzMWhhNk1VWXgxVURzNVdiMlNtdmdWajRx?= =?utf-8?B?endSL3J4cjJRUUc5Y05ORlNGZEVXTGhsU0tBOTI1a2tFSndnazZua3FwMWdE?= =?utf-8?B?VXM3dW12NjBjOFdUdlJ2bUpMOGlPZjh3a0hvS0VtaGNOZWREV2FORkpYWEQ3?= =?utf-8?B?UVNYWGo1NzNBeUVodlZQOGRQZWFXelZuenlrczJJY3JXTFFFMnI2TUVkMlZQ?= =?utf-8?B?S2V1Q215RzgyL2dkbVE0MnV3cmtnb3dSWHVQUHQ4b0tSSFR5bEdUL1J4L1p0?= =?utf-8?B?WDR2aDdmUStPZEg0SEp5TDhkNk9EbS9ZbGM2Wnl3RUFOTUg2VGovWmRQRkpj?= =?utf-8?B?OXZTVEpibU1JOWFEZk9BRFhjbnJObEJzSkllOFR2UTMzZ25haDJ0U0VxTmlm?= =?utf-8?B?MEhFYWVRLzhqcS9YVlZCZytrWEZsRlBJYXo5S1Y1U2FpUm9BbWxJWVUwQ1BN?= =?utf-8?B?aDRoK1Q5S0lsbXJicWZTYkRxSHQ0ZEROakpzSmhpWWNaZXliZWIxeDArUG1p?= =?utf-8?B?UzB2bGJNYXVnTEZxbU4rSzk0UUdTYVZmMnhOdzhVajkrcWdXN09ISGlINmZ5?= =?utf-8?B?cHYzdGJRKzl2M1BUaTBWL2srN3FZbXVUNU1vTkZnOUpBUjEvR3czMFQ4N2RV?= =?utf-8?B?NTBsMTdlNUZyMHhvQkRzMHlKQXRRTE5PUG1LNkZwanZFTk5zdlRBMXg1bDM4?= =?utf-8?Q?9uDy8jJjRZ1+Ggtc=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9a85a2bd-6569-450c-57a4-08df23956856 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 10:34:31.8701 (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: I20R5Ki1RdOADTl0RcVzhgO9ZggRBpqNA1rgjLmE07oNQrTuwg2UcEHTuNlkUA23HWfRFCnbUx7p9Rcnbw8LkSM4GNZA4TS9xmxBreuInxE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR08MB5515 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 770bdaca4c8..f601b85b4d9 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; } @@ -1763,6 +1784,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