From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11023137.outbound.protection.outlook.com [52.101.83.137]) by lore.virtuozzo.com (Postfix) with ESMTPS id BAD6E8017D for ; Fri, 25 Sep 2026 14:11:34 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cbmvUKHprzlwjKZeljrN/9JdZli7ZWWfoWzai/wO34tTTOqInr86Zqd1UKRZO5ovzCFAAatDg8LB7L2RKWbBJjLoDhTtLFwXNP0qKBBZO1T+0za/bI2Zn1GWwUmgq6USf1hlQICL7Fakd8L9JAmBAaPrOStxgfIMM9B5fL/KHtXn7RKQx0KZCOgWT/udKQ0rkWZqQYUS51suxKVhWOeZ8C9V3Uqo9ZTaVuGlFi96aKAoriDV8l29XHZvwswOpM0m3PBGGCpnq4ZfMZau2mSTIpjquOj3LS1Te3sZNWh/1Gho2ajrTrt/JxsvYuX/2EIPyN1Xe16OMPOlW/wvStptDg== 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=P3K0q7TL8ejFHUPvzccoTJPi+gT65jms01UJuShiMqI=; b=ce0Vn6OMHAs+3G5qwjoNSdBwAcwxortKToMtBpm8ISMHDG0RXZRsdI30icUkj3HrMHR94/VNPkToHFo8aBF7OLje1J/W38VADk+vKLgjRQi8cVnh/IoI21Fp9cxomtximWBF98pZ1UGmkTUxw+4pdtPMNOrkdWIFN5bMAVRrI6MZnKYEMlPOAAvg+8SnYBMsBess1kDI1dEDDr1tRZqf5LCKygzqyMzC50zsS8RON+sUYrYZ3o4Hyj6scIhsXRlo/izq4QLhza3Nm2Q55n/beyuMD5Q7YNuk6WrhH5QfWZ3zDjkayzvvxesXwPPOL5UT0+qcMGXx1KvGatvmiTvdmg== 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=P3K0q7TL8ejFHUPvzccoTJPi+gT65jms01UJuShiMqI=; b=wldnctV3Vnz/OcR8zub6CoeviZFejIjmHOQCincwPgCn5HdbrON9oUsFtPEflopBePoP5939Sr/W8gf3xeqfouHUvo4wm6C9H6X9YqyqDvQWGVodbyWhakcRLcxh76QCyv49hVo5fZvVmULIMmtzoezQOm1w8PIa2072wrhgzAgmkauGU5BkEQ92QEFs4X8GfieDum9AdVCTlI2guV+Vpn58efyWE0ZOzNbAam2obt2Lx+iYs3vxt1DninuL8GvspAOXoP3ogfrAZGngMVnPyIZIthn2svushIbxAxHGRqMTdZxx7QUKwV25G/uaYo1MwOKjD1owjozIJGV9721q2g== 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 VI1PR08MB10173.eurprd08.prod.outlook.com (2603:10a6:800:1cb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.18; Fri, 25 Sep 2026 14:11: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.0451.014; Fri, 25 Sep 2026 14:11:32 +0000 From: Andrey Drobyshev Date: Fri, 25 Sep 2026 17:11:22 +0300 Subject: [PATCH QEMU HCI-8.0 v5 13/13] usb-host: make CPR migration blocker conditional #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260925-usb-host_v3-v5-13-e5b21724db4d@virtuozzo.com> References: <20260925-usb-host_v3-v5-0-e5b21724db4d@virtuozzo.com> In-Reply-To: <20260925-usb-host_v3-v5-0-e5b21724db4d@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR06CA0178.eurprd06.prod.outlook.com (2603:10a6:803:c8::35) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|VI1PR08MB10173:EE_ X-MS-Office365-Filtering-Correlation-Id: 30fb97d0-4096-4182-68f3-08df1b0ee686 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|1800799024|366016|376014|23010399003|52116014|10067099003|5113699003|6133799003|56012099006|18002099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: 3jYyW8l8ucCbG21W5ZtNOSJkwBMaFO5oRI6fjxrIXpKr3vnI/E+8vjkpB0zVXqAAMPQPucI4l3/sGUpEwDNvzqrySFBH3IdM3P1TB1EtXUZZNQGBhEVGYYBzF9PIItkfuNxMqrUuCOEhWXBM4wEsFwh9lLTN/69CfKuDqMvAX/cV3bS+RHAjx2tqzJ1fLfA0lPdPF5dFuX50HFAyBT36Mjlv4x0wkXmjrMrBKvSmmMc+yYurxcwg8DU61IYZkiYNWQMa7DBbYw7Obr2q7noAgredxEQe+XCpM21UH/OZWJe+oDUbvracA3x9f6NNamCab9fF9Xg/V6OQ1vj0exUXinCkAn+nfjtsSj9f/2zYJj20JhcVnYjGRqHWPv61CBHzkri1l0hskZAs8IUiG1PZrr76WbHoNQsL512vI9mGbstpKL9SVJRxdZpkNJTG5mGN5BX5tz4oPIYDKC//Rpb8RZ2f4Ytcayc7+wrwwLzT/4FerlsW2UF21ELgdM+c8cS+t94t9K9Hqdkx6xKQ5NODyR1wEcWEWkRdD5X2YDHiNPezaIwRZDtLGpy+rC3LDJZbAv6HZmWTbkqHzxLFanXCLJuUxoFwzh/YTTSGG1WtBMRsduiLol+YZFvTbz/KzbmM+EaPI6aon3v52JBKeKsDextIsM9BQRybJ2RT+QYCHwbaRDxudYWSdNNeofURS0zBbRWLRXgmDfOnNZvgZwPmuw4SKAWbe8YzvZ03PqBEZDA= 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)(1800799024)(366016)(376014)(23010399003)(52116014)(10067099003)(5113699003)(6133799003)(56012099006)(18002099003)(22082099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?alRVV3k0bEczMnN0Y1pqaWJsTDM5ak1qR1VMQU9FaUxkcEE3K2p6a0tvSVNl?= =?utf-8?B?UTd0L2I3NXpBUjJBdWhmR1FVTjJZSkRjSWxOUHNMaUxFUldGMVRaTldEbXp6?= =?utf-8?B?N1RYWUJWWE94VjNBcEtzWnYxcnNiWklDaU9JbkhyVzgxZS8xR0pTa1JZeVhT?= =?utf-8?B?aDN3Mzd5WFpwN0ZRMmFER1B3UUxQZVB3T05Fd3RvV2ZpZHE4Wk5nbUtoRFEw?= =?utf-8?B?eEVaWDBsai93QkdXbElCekFCbDZOLyswTHhKNXFKaXFTay9hMXhRMG5ObERG?= =?utf-8?B?dmhObTc4eWtqSUdoNVo1UzJlVWF4aFZSbWZSUXFLVFdlMGxTWkNqRHpwL2Rr?= =?utf-8?B?MnlNKzc3d0JwZ3pjdk96MXk5aUZBOTBPWCtseEcwMVR5eHhnRnhET2NDYzlN?= =?utf-8?B?OW5xMjlXeWtOUXg2ZTdPNjdaQ2NWdnFZd3NVVFByeEM1WmcydVBzcjZSMUty?= =?utf-8?B?RDZtVlNrOXNZbjdseS9WSGU5MFdRUmM3YnppdUdPeldoVXJuNGpLSGNwNVl6?= =?utf-8?B?VDRCK1Fnd2c0RDFpT1EwT0FZUDg3bzEvS1Rtc3BSQ29FS1ZMNk5NV1V0dDho?= =?utf-8?B?ZCswT0d5VEhDMHp2TnlFNDQwK011bkxaMGZUdlpDMnJycUZsV1ZlRitSR3hx?= =?utf-8?B?VTFObWRUY1lwNWJZaTJhYnErQkkzdEl5dkFMeDQ0b0l3aDZRd2gxTmxIWXkr?= =?utf-8?B?OHFyd2ZKNVVNUjFyeWk4bDk3SXVmTm9uZ3VldmdlQ3hZNXNYVVJzaTluSmxw?= =?utf-8?B?OFVDUldLb0Job0wvUUgzcGpubU93YStLNlltOUQ0OFUzbk1XeFEzbVFDZUYw?= =?utf-8?B?a1R0Y20yQWhIc0xUam0yVlN1aDBvOXNwKzdEOW9XWXpCRXpFMkpjMCtqN1ll?= =?utf-8?B?UVIyY3JZdjQ1aWd3UjBEaFFMTkRXZkZvT050WUY3RmJnWWlqR3BJMnZwL25B?= =?utf-8?B?Nmg5WGdMSWVjWVNocURhb29xTXd0LzYvTW9VYWRBa2JTbFpXNmRQUXErQUFW?= =?utf-8?B?WEJGSlEzKy9qMXpOR0E3ZExlaGVBMjBTYWgvdGRnajQzK0MvYVJYYlM4T0dK?= =?utf-8?B?TlByWFVzbVV6bS9pdCtNV3dSdEswQ2dZRytXQkp4UlA1cFZUL25aMDNINE9y?= =?utf-8?B?UnBHVE9ZaFhCR1crOWdmcEFpK2tzSFVuaGFiaW15OGNBWE5SODFUSG5sWWpJ?= =?utf-8?B?Vkc4aWpoOEUyYjVqcjllWm51ZVVjVmVwWC84U2k2ZFJlY3F5RklHbW5DQ2pB?= =?utf-8?B?c2l1QWtTcGRYbHFndVNZaEtkOEJhSjJSZnVZQmV2YnBLamo4LzY0S3BlTDZs?= =?utf-8?B?MHp5WkhJOHNrWGF5MGMxNEVLT1NjdDdEY3REVGhUdnM2VkFvV3lvUTZEQ0lO?= =?utf-8?B?U00zNUZZVDNMU3pIYUlHempBNFlvSjE1OTdCZnY2dmVvbHJMV3daaGZiRmRn?= =?utf-8?B?Q1NGMHhFc05IMHNGRGVFbDRBeUNwZDFCcmZMd0lRa251dHVUb0E5elQxWkdS?= =?utf-8?B?QTV3MXRPUmtaLzRZc2tOdnJacFZLL05NVTNGTGJUOXJOYkk3eEJjbm9DS2tn?= =?utf-8?B?R1J0T3hPcm00Q1Nhc1BwQ09jV3NkSTRvTjJldXhqbUFQRW5lMEpNeUlBNGhX?= =?utf-8?B?RjIvSHpYKzdIYVNFNUUyV1hwelZDYzVJdVhqcFVqcm51cE51dUZvY1lkcUlJ?= =?utf-8?B?a3VoQXA4dys4SjFNQm1CWUVXSHlxc1NMTUswbHNwdHNmVU9halF4U1NjWjZV?= =?utf-8?B?NTF5dktNSGVhWUJRRTdZK2d2MVdNR3FTV21lOGV0ZWw1bXg4bVJDK05SQU9O?= =?utf-8?B?cjBjdHR4LzE4OHhwWmpnUktjMEM0ajk2djgvY3dXdmhieXFFb1dmRVN1Qi95?= =?utf-8?B?Ly9XY0hJNXFlSlZtMGRubFl4OUpyREE3akRzcXM3OG1nTzZtRkp1VFJnY1pJ?= =?utf-8?B?dGUwSklENUI0WW1qaEVtSDNqTUZEUHZzTWd0S0xMeFU3ZTNUbml5b0tRVGY4?= =?utf-8?B?Y293YVIzeVArN014NHFyQ25HQTZ3czBEUHBzci9yREpNWUJpNWVJdkVoa3Zm?= =?utf-8?B?SmVJR05LZkx1cTlBTDNDTnNrUmhNZGxQa0JQMUI0NHlMZG04TnJOUG85elRv?= =?utf-8?B?Z0FkeVUxenFqcnI1WEQvZGpITUVXZGtPaDJFR0c2bm9tckh6UFd4dENMcHZm?= =?utf-8?B?MW05QUpGRENEMnVJcFdGT3A5TjQxeU1yWmRCV0ZLUnNzZkJpTkZzRTBGYkNi?= =?utf-8?B?dXNTTWhnYlliOTZGaHhZeTgyMFJ2SGVWQ3MzMHF4UmZTTGcxejJWZWk1Zm9o?= =?utf-8?B?WERNYTYvbEwvUGZUZGRVZkN4VXJLb09odnFEZXFwNDVUMnlYWFdtNER6VmRH?= =?utf-8?Q?+aPXt/DI6ZJhbns4=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 30fb97d0-4096-4182-68f3-08df1b0ee686 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2026 14:11:32.2171 (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: DmmwDqZjqkX0YvO/YayoQ0YIjJtwO5jPrIhP5bk19w2/HHHQlS73Wl+Z1889695m8fyANVNo9CQAg6hfSn74+8Km1dLKtbJMlsz1f1oi/8g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB10173 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 8078de01260..0623d6a7183 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -1484,24 +1484,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