From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021117.outbound.protection.outlook.com [52.101.65.117]) by lore.virtuozzo.com (Postfix) with ESMTPS id 9F480803C3 for ; Fri, 4 Sep 2026 19:05:07 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=u+KJ0mCDJBZ3jO8OXNWeE62x/fcU3R3LGhLEKqiamRKNY+Nh1M4pwQzR/hCXXVthC02fcV+X8fqvsLa3MhemNvZjxqEgeypd+6yXWlxotWRnNs6BQ/67qfskVWLBzGTn6eV5tjMZ6aBrWB8XTMLfVqs0pbIaKyAnGVXw1KsWU/SeYmMoDv+HxOZeGinK4ffULBa3/eKvwkCtO5sBZmzrhqVxbvmVvou3WTkobkFuC5FQu4g/AfYn+apbmkLujMjT7xea0QmgrxpkIoKMSzcdSgLL737ZqaffbSJ8WW/SY1dC6iz39RKj39wTfQLDr48iaUcXpgAPqpFFNV/jRUxmSw== 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=1ycxS2wM5A2ITyFKiCi+sc4yPX4YVabOEsYb4TN6ifE=; b=en8hDw+xL+z39jKRcfj5G1Q0IPKZmDdikTR8Y6qYaPOWJiT2eq9JyxCvnKN5qt8RFT9mAN9yjduZZfsrTrx16t3Lev24L4ftXuMO2XiBOLf4stymJoZIEiZJL7OMw8SoFtSAjPGEHFEb5zuZJCX25M4qb8bybE5g+ph7x/oxwZdk06r47li+PhPi2+EHOKH5yaJ1FW/vUgwmHCIDMhMA7hz11WMtS0tA3itWX+89wnNPet6NwOlwbw7rBLoTqEynpIx6aLqB7g4kVLNRSkNEmSIK2q9isQc4hJJN0PswlvYzvP7IpB75zpybhy7tbsNiF/ODwrxJUVKjW3pwF9rxOA== 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=1ycxS2wM5A2ITyFKiCi+sc4yPX4YVabOEsYb4TN6ifE=; b=H/evOwUllxG5LcT/3z/8qyNp167+Ck6LQ0zOkZn+sOQKSq0ooZ12yPkMkkMSBmk2b6RAJBN4CEZYfK80Net5wG95Fyy8yrX/LQdiNRLImqIWREMhuxlecCsMPf7F2is5TD6zc9Mt2bfPcmdySMOdLJqeP88lt0NM7xC2XMCbCGcy524KuIEoGQEFn1gQxU88aqR33B6YC3Gqr8oWwGSI06cQHYzXZaKXvFQyW6o1pvLTRbEkmvvJ4WYguBkEjtxFySFAy5clyRlH/G7IFdMGDwr0OdjJZyxuSCZ3xiFDsJ5Z6gHStGqSbqsJpx0gX4665rbGjvFCmTHeIY1tWGfekw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) by PR3PR08MB5756.eurprd08.prod.outlook.com (2603:10a6:102:90::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Fri, 4 Sep 2026 19:05:06 +0000 Received: from DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c]) by DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c%5]) with mapi id 15.21.0382.007; Fri, 4 Sep 2026 19:05:06 +0000 From: Andrey Drobyshev To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [QEMU HCI-8.0 PATCH v2 13/13] usb-host: make CPR migration blocker conditional #VSTOR-137800 Date: Fri, 4 Sep 2026 22:04:43 +0300 Message-ID: <20260904190443.795902-14-andrey.drobyshev@virtuozzo.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> References: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: VI1PR07CA0215.eurprd07.prod.outlook.com (2603:10a6:802:58::18) To DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DBBPR08MB10650:EE_|PR3PR08MB5756:EE_ X-MS-Office365-Filtering-Correlation-Id: 048a0a93-46f3-4cb1-f30d-08df0ab76c5e 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|1800799024|366016|23010399003|376014|52116014|18002099003|22082099003|5113699003|56012099006|10067099003|6133799003|38350700014; X-Microsoft-Antispam-Message-Info: KS2QTXiYxNuA6iuGZRxczg+imV0nOPOq7frs4GT9IxS4BFS06s2by3vs70I8J3hrfgM+tY1iViTNw3NG7S1hKB958BqTRYJU/sR560MxFDqpHT+sAo62m90kiY3Um03A7WcxbqOElN8fd/CM9s1GNemKywC4sLe94OGdatjTROyFyRHoL/20+zGh+t0mAyq5ZAPMvxrdt02yFbB61ByOvIF+Lwev2jVb0hffNkhcMKP/FcuT/2Ec2p7XkEB7rGsnX++5PPaWNSXwqEr4NslYwZWJmzFBs/pdIiB/T3TvKeLI2b/gKpHlUx0dWb3EE9Ej8kSWxBwWfiALzhamGLtlEZRnyetEOqI+9q0Gt+G4RNjZHLfgME9ibtGSgaLg3gcgocoFCSsy00kA3nWpbxyMeXZlMSluXuumZvW5YbWimLPhQaZ3+/Ij6dUb0KtoaKNBYR5RqdEsAGjlGI0XP2Xul8BeQLVxmhub3a2kqL5z0he4jBrOdtqTlSrudO5zQSfb4WAg/Pe/qrrd37hvgXkKOuAg2yo6ipM1pCBtZbKicFULnuVfZDFdS2LL4edhthc6tPViU7RCDqufdcFWBDbCcPzrsGxTpcu/qtcFnwxPzuWJXdbtVLloIwFigZiRA+GE/aw4R/ICCNijHeDxHxcPLB5oZvehcEvlnV+PUN08/Rnrifz4tyjrexQZD0TjCtKZt+y30rmAReZixF/hBIAiCFKrYILRpAUE2F3ajg1pghs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DBBPR08MB10650.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(23010399003)(376014)(52116014)(18002099003)(22082099003)(5113699003)(56012099006)(10067099003)(6133799003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1pTe5yFx9Oi9E1fNgtZMyUkyQKCuWFnVZEaddrgRHgV8yg9rwN5L1L7OGPF6?= =?us-ascii?Q?vs/5VONorvmYezA73f3gbZCSzj7kVXCX3zI//VtnzBaiIl81px99ZYpBSdBQ?= =?us-ascii?Q?KhD7rhEPKDbFqCDiTZMBFwyj/4rxAxip9RYWtF1SWK9epf4zRJ7zMyQep4tT?= =?us-ascii?Q?udh8n7TkHDVtZzcdOWt0uoWhowHGpaYYh6WLZwgiLHNMqZLpWZ+4O/TS9SuD?= =?us-ascii?Q?GofAexfjXfaf8Ww6pd7pE36zQ7BWN2+yhhea0CsPdCpeUfhkL0yKLKuqu0Co?= =?us-ascii?Q?kiPmxpVY5pqPQ2LdPrAr/epdyau6kmoYzn3IhNrrku7G4AEc+bNb58KF9Jp7?= =?us-ascii?Q?v2Q4aTVbbSFv7jE4xw7QEcCzmhuetIJdPfIDvZV52nY8voO+x3bkwyoza4+2?= =?us-ascii?Q?k5EGiTtexumgoNmUYsOBNBnIsXHNmB0F+8WPGb07P43iGxTMKuDGpU3ty+QE?= =?us-ascii?Q?5SWEOYvDi8ZiXgYgPQaovI7cEODKtmecVGG9BvVBjdgG5syg9D3i7AYnv9Sm?= =?us-ascii?Q?ZHgco+gT3RExO4YPJOvaY0nbs/V7oJqzQrjShaMCxd7/j3ELo1rzF5kp3ueY?= =?us-ascii?Q?5+7Ico6Ivvgn9CCVobKDPvjXtExl4tghWbkm0uE6ifQM47iOrgS+X6gcP2nJ?= =?us-ascii?Q?i1fPCmvEdRBsS0zdNTt4PGfYgTFUktBOjdZna4Zx6FZSxnDkze3LH9/wHph4?= =?us-ascii?Q?ZHlA3b4pPwzP1i3h2UCKb3KWA8e39Qt3mHPu9Vmj4m3MszHbMONMSjAtfGSz?= =?us-ascii?Q?PrNIrr7tnpGn1mnRAfxTW7Aru1q2k+JSubaLEgt+SZKaMWqe6IFUPOF9/uB1?= =?us-ascii?Q?QkTDsK7NZX7h3K/hA4nNcgjnrqWVa57Pl7rkLeu7kuPR0vP8noDm+qBD4jlZ?= =?us-ascii?Q?sBNGuBTh6uma4Q2fVsRgtAdQNo8z1DIS8pZgpuza2ObBu5dQVZ9Euku8sTGA?= =?us-ascii?Q?diPSsqgyCxhb/q+nnN7TCjlM5eJKheABSKUVfRjUHHmbjDK8RWcg+MunrSV/?= =?us-ascii?Q?COl9Z/x0y7dJEvSZWspFM6ins6hLQP6LpZip4zIdqayQ8gl5MX2d15JwmEbL?= =?us-ascii?Q?VuWIDOzdpr8nYBLvZOG1v6CV2GpYeLI4ObhW1uzr6+6ijKSpjiVB5xCq49/C?= =?us-ascii?Q?GWOrIQH21rEX1Deq2qGhzEYYZdZA0Km4TLX2IIzls0D7KXV2Q4AHjJVuXOx6?= =?us-ascii?Q?Ezeyin4Jwhv07ZVDPWjKppTRQ3M0hYJhePB3A5TmsWLE0rP9Wf9sO3CmbQtI?= =?us-ascii?Q?c/iK+fCjyUdO4m3WIDU0CDJmEo7Wgv1nkxSCyvKOSMz6mPquqqvprBZU98qd?= =?us-ascii?Q?eMEDV3lqOBZAyN81Yn3tsx5KGSH0hW3Bpebtfn27mIS7Cda4qOcFso7F1g77?= =?us-ascii?Q?tRS2ybOUemYTP9aH/LotmLNBSXXxZ3SDwSXld2wPVyXbAbdIKTHBprAZUERa?= =?us-ascii?Q?uhRcQqfKlE+zDH6dguPGVrJsBPGkVU5uG2TcD/V4hE66CFYMCrzArgjowzYp?= =?us-ascii?Q?55771HdY6ZuLZBBY6lceec1FLfloUV7EB0wLLvejsvJNENSqlbGPBI5rpZlr?= =?us-ascii?Q?Qrmp9T5YGKoSIF+ezFujN5D+fxINECTd3p/vZmNsP0Xi0+tMpjRfVkcuIrEA?= =?us-ascii?Q?Dy+JL7NDmuKFUIE3lhG3ir5J8EIybOPI5+6KH/cHteYUbuXyzt7zLLIDXps0?= =?us-ascii?Q?/St+WnHz+YiCHtxI0OVRkVMUpETIMSmjY+5ng6+zdh1DXgpWta/z3o9doOZU?= =?us-ascii?Q?7caEEKaaPzkw9ynotiLww742GD21T6M=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 048a0a93-46f3-4cb1-f30d-08df0ab76c5e X-MS-Exchange-CrossTenant-AuthSource: DBBPR08MB10650.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2026 19:05:02.5758 (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: wwLhg3v/a6dQWYPrQDkfEmyXgPqszk/pjkwdDLMkuPNRgjczhaXn8jddxde7SfrvFt/yCtVqdwjrdE+FL+rhON7hjhrdiudyORBfh/VJ03M= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5756 A previous commit added an unconditional blocker for CPR migrations. That is to refuse CPR gracefully instead of crashing and for the previous commits to remain bisectable. Now the restore path is complete: the FD is preserved, in-flight URBs are drained and replayed, the device is handed off across cpr-transfer, and the endpoints and isochronous streams are reconstructed on the target. So let's lift the CPR blocker for the devices which satisfy the preconditions. Still, the remaining preconditions for CPR to work are: * We must open host device FD ourselves, so that libusb owns the FD. This way we're able to preserve the FD during CPR; * Device ID must be provided as a unique stable key for CPR FD registry. Use them to guard the blocker addition. Apart from that, prohibit CPR on WIN32 platform and on hosts with older libusb versions. Signed-off-by: Andrey Drobyshev --- hw/usb/host-libusb.c | 50 +++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index d12e04c2768..da0ff801661 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -1449,24 +1449,44 @@ static void usb_host_realize(USBDevice *udev, Error **errp) s->exit.notify = usb_host_exit_notifier; qemu_add_exit_notifier(&s->exit); -#if LIBUSB_API_VERSION >= 0x01000107 && !defined(CONFIG_WIN32) - if (s->hostdevice && DEVICE(s)->id) { - migration_add_notifier_modes(&s->cpr_notifier, usb_host_cpr_notifier, - MIG_MODE_CPR_TRANSFER, - MIG_MODE_CPR_EXEC, -1); +#ifdef CONFIG_WIN32 + error_setg(&s->cpr_blocker, + "usb-host device %s does not support CPR: " + "WIN32 platform is not supported", + DEVICE(s)->id ?: "(anonymous)"); +#elif LIBUSB_API_VERSION < 0x01000107 + error_setg(&s->cpr_blocker, + "usb-host device %s does not support CPR: " + "libusb API version 0x%08x is too old", + DEVICE(s)->id ?: "(anonymous)", (unsigned) LIBUSB_API_VERSION); +#else + if (!(s->hostdevice && DEVICE(s)->id)) { + /* + * Host FD must be owned by libusb to support CPR migration. That's + * equivalent to hostdevice= property being present. Also device ID + * is required as stable key for CPR FD registry. + */ + error_setg(&s->cpr_blocker, + "usb-host device %s does not support CPR: " + "hostdevice= and a device id are required", + DEVICE(s)->id ?: "(anonymous)"); } #endif - error_setg(&s->cpr_blocker, "usb-host device %s does not support CPR: ", - DEVICE(s)->id ?: "(anonymous)"); - if (migrate_add_blocker_modes(&s->cpr_blocker, errp, - MIG_MODE_CPR_TRANSFER, - MIG_MODE_CPR_EXEC, -1) < 0) { - qemu_remove_exit_notifier(&s->exit); - if (s->needs_autoscan) { - QTAILQ_REMOVE(&hostdevs, s, next); - } - usb_host_close(s); + if (s->cpr_blocker) { + if (migrate_add_blocker_modes(&s->cpr_blocker, errp, + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) < 0) { + qemu_remove_exit_notifier(&s->exit); + if (s->needs_autoscan) { + QTAILQ_REMOVE(&hostdevs, s, next); + } + usb_host_close(s); + } + } else { + migration_add_notifier_modes(&s->cpr_notifier, usb_host_cpr_notifier, + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1); } } -- 2.47.1