From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11020075.outbound.protection.outlook.com [52.101.69.75]) by lore.virtuozzo.com (Postfix) with ESMTPS id 226D580205 for ; Mon, 14 Sep 2026 19:13:28 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ouk10umGoTFG9du+31rqQf9EMoYbcBwWuS79zTLSwjDNc2TKZ2Oy50pBcOaWUUBlIpJnRBcEx3dutcy2oDGNWux4AH9WnXU2V7c1ascQvj0h0W0Of0/6LOFjgshSLWmlnqBAv6itT2h34kBPFbi5OjSGuMRJ7v2q7DRJhJjvpdrQ4loNSGL0/OdKTEWo8xk+rQSNWA0b33mLv0WDfZj0SY11q+rva3X5jPVvOAyGTJPN9RPw17dDr+ORGwP0iGMAymKLER3ahZKVc+HFJMzoRqNRl9uzCp4YXt3SSt0Nq4dq/gMMYpqXTSP+40n/yFAizBusP8VW1MTXN3Wi7oGgQQ== 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=m1OeFpiA2gjmXbLTqej4XmO8eDHTRWDmeogdePMeypM=; b=f9kloZS5eb6CC0BrbclneWzgh+VQEwp8YD9scsruAmAYkBp8gJITLckcA9VknCm8lLLemRJYuTbpxcmoW4hGyj84cs28QlZWhWgRYlX55zEPa7bK+0MsLNnbA/hYfVxhaVRgONn+IhDP5w4Jov8jIrmBHR6xvyajEzu/bIMTRNW0UXbv93BKu91ojxuttVew8DfP7EmoTeX4MS3IbsZ6QLShMecL1W3wkzY3ZOaWSQAhMkMEk1ePkfLQ5E8jeLYrw5REhxjcAPJkAroFka61HuO/sEqyYXEG/kPC1tJldg/aFNPdEDwda+7AtSoQoYuRGTZmYZrGx84p+e4GSFTxsw== 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=m1OeFpiA2gjmXbLTqej4XmO8eDHTRWDmeogdePMeypM=; b=SeSnHGSzpVbjBTsOJ6QwF+7LtBnU8UqBcgnU7/qxthxtXKxurDaLNAEhsZ6CQl9sFcZjuRYqUMRmW1LWtVwgHiZSglRdaBzjPvjVQwlFpbNTAtLhKc+sFhP0slJYa5jrHc28TA/rswm4ClSLj0Gemv5zHS9cGHHCgm0pIFkW6tLucydzL2XFK9c8wFYwZyhZ6RrEEWzLQLc+/36rBS3zKcU7BM+33B6O+B00ydB9CuZ4MLTIIGi5I862S19haMFOuwylA1gV4C2zSWLmSsC1ndbqmrDaSG939INswXDJSt0CsAApVu1jrXPOmKOJJ5CsIXkAvNJ5zL8ec4dJfyuuvA== 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 DBBPR08MB5883.eurprd08.prod.outlook.com (2603:10a6:10:206::12) 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:27 +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:26 +0000 From: Andrey Drobyshev Date: Mon, 14 Sep 2026 22:13:20 +0300 Subject: [PATCH QEMU HCI-8.0 v3 12/12] usb-host: make CPR migration blocker conditional #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260914-usb-host_v3-v3-12-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_|DBBPR08MB5883:EE_ X-MS-Office365-Filtering-Correlation-Id: 07036e18-86d1-4d70-3521-08df12944001 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|23010399003|366016|52116014|376014|5113699003|6133799003|56012099006|10067099003|22082099003|18002099003|38350700014; X-Microsoft-Antispam-Message-Info: /o45CCHJesxHd8ISMDV+BiohVl8ggFoA/VTn7LReMyKfvIvlmkEoNaORkuen0P3Hp/D6x54h+ZEChsfQqqXo3OV7AITcTAnb4BKaNQXw9gvzhBkKsTZ8aATiC7W9OiOfyzS8oawdi2S2/Yd9MLI5Xp1kEEARc28l3zZ9dds0YPi7K2LetAOEUbKeaVpdU6d+zJLNBwlUQDKe86af4bCs/6IpM6pHJkazaMxIxctn5TqfUnihorFXSQQqKga2N/qhv8y0Wxd6ezOmQ2a+TzCSa3QZUQOFg6+sOMHynAnxXSzMryG9yeXP1I5DQEaY17AzeHmEySac2wDP9TOlN4tZtkG4Wy5DxtqrhR7qLjiHswgflQWr/ZwEUWvIk/yD1VbwesuHVprekv90iWUA2thE9xGvf1K0DDeUYGljp0dvsHNvo9Wp0fpRqCQEtJCTs8tv+yGQ7/92XZZ72eacQ5hs87aap+bOf82y+sxcuTQTl4BXcwQ7U77TfNo2e2OiMouLwgW+2JNkLKDbeZ/Y0kXP3bGPGgDMecuzysbo5RpnaVRg5lHy9+6YUS3UipUZSbCLNre5SkkErWftZ9w3PVczgRRqVQtSvon/gV7u/C4bL9rGegrK5QMIRTXmjD0oh/vv4emX0H+1iviM+mICdnfUrHgBXpSw7iOzjNT+XZ4L149EoxvSPm6pL+SZiRtVIgcAOR8hWMjQ1aiz2DK4Bs+jTTv1gBW2YXtKuFLP80UVvl8= 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)(23010399003)(366016)(52116014)(376014)(5113699003)(6133799003)(56012099006)(10067099003)(22082099003)(18002099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?eGZxYnFCckVFT1c3UmNnaWVnZU5VNWRyTG5BT1p2cm5Qckl3MW1pbEN3cW4y?= =?utf-8?B?emR2Q3dOS2J0UFprTEFwM2FrOEpBdkVMM3I5U3JoaWZNZWsrZU45OUFmTzIr?= =?utf-8?B?a0ZKZ010VmZVcHIyTE16dmNmbjFQNTJzWCtnSlFOTEtkMzV0SVVNNExSZTc1?= =?utf-8?B?TVozbEV2eDBCNXlvcll0U0IrcktnM3VSaWtod0Ivb2ZPV1hXWkZRMm1hYUd1?= =?utf-8?B?WG1WQ3BKUDBxdlU3eG54QzlOVHp1TXZpZFVkK3N3ZjdOZ1V0czRvRkI2UlRY?= =?utf-8?B?V3hjbmRkSDlNVzg2RFVtQzBrUEZEMElSc1NaWS9pM3lERWxFbjJhYnY2Rmx6?= =?utf-8?B?STBxS3kzZDRmZzB6azFZaUlYQWNzOVpMNlRjYWhIM3o1UzZybVFGdUNqL1lT?= =?utf-8?B?NGN1NVlIb05oLzlwbzQ0SXM4V1NmMGE4WExlR1cvU2NRNFVZMHZqYi9CaFRM?= =?utf-8?B?OW81TW9nUUJtdVFKVUZJelBkeUJUcTQ5ait1a2tsVmRhQUJpcEp5UERISGVM?= =?utf-8?B?NzJJZnFFMFJ1NXA5M1RFUE0xc05jdEEvWk9UQzJGSkdHbkQzNHI2WVhQSHJP?= =?utf-8?B?RDZMY1BsRnRySStvMFBmTE5kRzJpemo1b1M2TkFhRHVpNkhaVXRIYnRrcTNL?= =?utf-8?B?OTJYWERLMERYWGIxNjRuelVBc3lLcTNDb3E2WUV5NWo3am53ODVVNVRLcVd6?= =?utf-8?B?ZGJTMDgvQ1lsRkU5RDZTMXQvVXIwOFk2WWQ4d2h0MmlNTmh4dW9hcVZVYU9J?= =?utf-8?B?c25TZkdNTGRiTG1GaWsxUmJaWVlzbmt2SXpWYXZrZzl3SHFyL3JJRSs2YVN1?= =?utf-8?B?akE0TjRDZzY4aSs5SXdlQTMremhxdDYzQTNRc09FT1M2MmdMUVdSSXU3NFp6?= =?utf-8?B?NWxMYTRMdGdWaEdpZUxFbHFOVlJ1UmNxTkp3MHlYeDlib0hKbFl5bVNNS2t3?= =?utf-8?B?WGo3U25mSm0vd01NNzJaRGpVZXdMcEdFc3NsK0lyMjBHQVZrYlJTVlRpSStU?= =?utf-8?B?N2R4TDNOaHlaaUE0azBHbEkyMTNkaTFlQ3BLWHkvUXQ0RUsrWVVQTWw1cTB6?= =?utf-8?B?Mk9hR1hjeUEwQzJzMys3dnp3REN6T1p1TDlGbDZIbm44WU1MVEtJb0lINjZ2?= =?utf-8?B?Y3hkcEZjRFNvVTc5K1lhUnJ0Rmg5Y1FpdzdZamx4MUpaa0pXbkdXOWZuUUJp?= =?utf-8?B?SmROVVdxZHF6emhLcnVXcGN0ZmcwbWV6cXFMK0IrZjV4WlVTZDVoWm9xdHFM?= =?utf-8?B?Ykx4anJ0UXpRdnZGZG8xUXl6NGtxQ2ZydnBMYWFheS8rVXBOb0tEMTh2cThJ?= =?utf-8?B?VVlpaU4zTjhvYlVvOVhHNEZIZTJ0RTFHV2xMaDJiZW91SjN4S3J4RXhIeEFQ?= =?utf-8?B?SFpGdmVFL3daQzV3V0xJK3JYLzRPQmNiczh5c0NWN2Y0WWF6MUxPRXBJU3Iy?= =?utf-8?B?TmI2OFdaMTcxL1NXcHNKVndGQ0I0bVRUTWZ3SUttRWZYbzNTMGc4cmp4NlJU?= =?utf-8?B?K1hvdEV3bmpoME8vTXNQQ3RDU0FhNjNrQlcwUVBJYm5UNzdPT1M0U0hJTTVt?= =?utf-8?B?U2Z6N3VYTE1uNGxVWjdrY1pCcFdaWTJUMEVobHZlZm9BVGtJOTlhbTZsRThm?= =?utf-8?B?VTNvYllUUDRnVXMvOUdNTFA5QUFKNW9HR2ZQWndrL2NGckgvWGluS2VmcmRn?= =?utf-8?B?aFN6VCt4bVgwRkszQTVuSS9OSUd6bmFIeExyaVNRSDZQeDNtTENQUmxrVHF3?= =?utf-8?B?OHByS0hEbkdYR3RuM0lEOVhrVExUZnlMWW94ZlBLWlliNlZPQXBsMlBvZ0k2?= =?utf-8?B?cDZoUFNoMlhlQkhIcFJrUi9FTHkrTG01OElzQk1qS2VuVlNZNWh3K0pLTkpX?= =?utf-8?B?d3ZFYXpVYnlCR3luaitab1hIVS9ORmZOdXFGUExrOGh4a1JlK1pPTlBVSEV6?= =?utf-8?B?RWs5cXBMK3VNVmd0M0ZqMWV4R0IwL3BYRXFYODdQcnI5Q3E3OVRYdUdLS0hE?= =?utf-8?B?cUc5d3RqMTdDSGovZkpkb2xiZFhZUVFOeFozOWdwdGZ3c1NGSWZ5MnpsWkhU?= =?utf-8?B?RGZ5bmJHbjhOeTloOXl1SFM1dlpVS1d3MStBTGpDVG1PYzQvQVg5NVF6cGdx?= =?utf-8?B?S045ZkF4N2o0dFAxdmJDeXlIVjA5bkRHTUE3STJSK3IvbjN2MHhhcVBwNHRK?= =?utf-8?B?QUFteFN1ZjkyK3Q1TGhjWXNUVE54UjJYdXBkejJ4UHZoLzcvOGo2YUNMb1hS?= =?utf-8?B?ZFZod3lUU3JNdVRKYmVjVmF4clI1dVZYRFhCTExhSWdTYU45ald0aDd1SnA1?= =?utf-8?B?b3Z6dFpUUzR6WUZaNFNXZVoya25MaG9DOVdXZ2Y2UzFwUTlyTUNSUkdTZUNi?= =?utf-8?Q?JyZb6eMrRnxNIL+Q=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 07036e18-86d1-4d70-3521-08df12944001 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:24.9375 (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: 7FCvrfqGmPhonGaJgREi8kfYXc4Va92agO4DN3eW1ceZhYfHrS5gtFhrpm5DUnqIeK0f506jNjnFII3QYO2SoZtkhFUmpidKuIlEdsEmnzM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB5883 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 a3fdde16c1a..578262518de 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -1446,24 +1446,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