From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023095.outbound.protection.outlook.com [52.101.72.95]) by lore.virtuozzo.com (Postfix) with ESMTPS id F4105807D3 for ; Tue, 6 Oct 2026 16:28:04 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hvZhW/rZtsDncWM0bDTTohTe9vsCAbcJSn0KvBDpkX0NUwO6RDfymvKHOcYDztcXf95Vx1ITlQuDGG6PgzuURwt1Mx6EiDOXaKvcAWCtQfplijGEgLR0UMIubw0NoS+3AydhmbbBbg09cvtFEI+5wLLrH8ODpbhlq3GLGC1BXYMahb4y60RKSTNI8dqNooRsNgWerjqOE+Junx/QURMW9O/CWvXiragprBLJHAYcMbjU056ZafqM5adKjfSPb9mP0ajm2TyKtp9mITAtlhsrggFvE4TTQiXm2NnbFc2gm7WJg7LnLfOzXKPhbkSOwZwm3cwQf5nG0UIULLmnjzR5Rg== 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=2SGMXO33If9ePYI94OvrsZVdHWg8gEHSN3qW9Df1xXE=; b=pZGtXb+Pf/5MvZGLxr7jHSO/zOSuWg/o2YCyg88oK5dOL6Q74DE6qikulH6bNIJYWPPQD/aCt5hqRcOrIhuZXygBFCjuEttbiIYr9Yp8F4wgXw4sLk3OTTpxkOAE/0B28B1Hb+lSOM90h9EO1yBXPbXDpUi/rvAQYu08lgOj5FY6aKkcGE3TMnR3gcHcjEyH+/M4MTu3lm4cf0LxvdTLulTmK0F/cQaGGtndN0iSWEsKYP4vjutqR/X3IP5rP0AC+UcAjfJdgtWdZc2r62YcqXUzpVA3hEKSusRiKuwOeqDxZRaNIiVL2KtPkzFaS+7teRjMRNLKxJD78JIG2egRLA== 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=2SGMXO33If9ePYI94OvrsZVdHWg8gEHSN3qW9Df1xXE=; b=Gpa7TqhMtabnSnSTCu92fF71oU2plE3FueRCMhCrW+6tQVtjWK/TbNaoySPXteOxg13+uP2behGngsaTZsH2opVaUZP1TDd7XBcS/HJc3rSK1gjevutp0xJvlu3bL6fEM6FLytGYCTD5hM7bUnOVAojJiSVDXpjBjFKNzJHxzzDBXCjRE1KKlB2cOS+SJGsb8eOxNl950jZHRfKGR9orRNoZb1rvnfv1FoldqLkdiUvhOO0rfGLBBH3sBkFKG1LSZJjIEpvjFDILKf+thBOU/TpHXQPRr7vMJNs8iGhd9u8Cf/FMcyvG08j+rcWpGwWnei2YXDKAtihNvY6iTd93OA== 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 AS8PR08MB8899.eurprd08.prod.outlook.com (2603:10a6:20b:5b6::19) 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 16:28:01 +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 16:28:01 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 19:28:02 +0300 Subject: [PATCH QEMU HCI-8.0 v8 11/14] usb: migrate the interface altsetting #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261006-usb-host_v3-v8-11-72ae4fb8977b@virtuozzo.com> References: <20261006-usb-host_v3-v8-0-72ae4fb8977b@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v8-0-72ae4fb8977b@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR08CA0230.eurprd08.prod.outlook.com (2603:10a6:802:15::39) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS8PR08MB8899:EE_ X-MS-Office365-Filtering-Correlation-Id: a8fc6c95-43ae-462e-2f8f-08df23c6c8ae 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|52116014|376014|23010399003|5113699003|6133799003|22082099003|18002099003|38350700014|56012099006|10067099003; X-Microsoft-Antispam-Message-Info: rtxJimeuVUaglctVY+IBBZvavQIUL+7dIRl1cCKgBxF3/SNHisPrqaC1m842GfbYdwMSpRe5VmNfdVexKMOAFYKZDJEcBOqi7zOUJxM7VJNFlIYYop1fZ9H9bfNF42oXU5Diotnblj64H3CkPz4jb7dLU9PtxLQWuo+tuLlyW8/cecHHBJgD5FmY5j9rB/UydXpBqrOFg99734gyKECHCivfZox3/64Q/oQs7QhVnbJkOrtqxJda3xHCNE7L/5dMMsjiT2YZ2AA85zbMRq8nLq4C4vIiiF74yURS5xp5EvNn/0yGPW2yG0pLmnHADX6zURdw4Vcmnvp5zm597pjh8Vcl5tMuNJcSB9EudsWoVof0SYfoTiAhKSwfbKy1IBIMRV8YwHjXD/rtbHfD8pTWUL7WCC2CJgckbEQyf03lN+1NxcrJZueZciwi8Kg9rq3UMjuKIuq7gcOBf/Z+kEgWCI7tWeyQbcyCxfzs4ltAckREjA9RtrYfcuViMFWZdOcMWYPx7cNiZbh8VvMa11rTQbcvigmfUuO9j6fdacdizGSiUbVfMSr4lgNjKx+btnl/ghHceOwq4QYg6T+fYLtZ3ectlR6QBaRfSY/grGdSxKxv2R4sEi8OE3IghDqI/GF3xuVqi5vTPO54/riSnNDwNJlCG8t3P8HZHB1O5iP2nSjxqo9x+4wVE5HGpEHgF1ETapPa8ahHPua60v3BvlCt626P+HsebOepNMay2nSUkW8= 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)(52116014)(376014)(23010399003)(5113699003)(6133799003)(22082099003)(18002099003)(38350700014)(56012099006)(10067099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QlNqK1JXNUFHUFlSdWtqRW55djc5emRvTmRITjZJTFF6cXQxclNqQ01HVkgr?= =?utf-8?B?WGQxRGNZYzZ0NkFDWG8wSGZ2NEpXdnU0QkVFY0IrR0kza0N4STBVRzE3bHdt?= =?utf-8?B?TENaTk5XWEFMUDgzNkNWcmF2NlJkaW9mZll3ckZrZE5pS21HaFo3YWNLVzM1?= =?utf-8?B?UDRnamRmbFN2dWszQk9sMkxmUDVlS0tJWU41NkdqR2NWRHZHMzJxbWZCczVi?= =?utf-8?B?dzl6WnpkK0ZpTGxONWlrSVZxT2JvdkVma2ZGbjMwcXBENUtGR2lBdkxCSkxn?= =?utf-8?B?ZXl6L0FFMDk0RmhMN1JtcWlIS3hCOERtNFlwMHZLNmtvdUwwN1FjY3FGSHdu?= =?utf-8?B?SnhpWjN2WHFqdHRyM3dQTWIwamswY0RlQVlabjVjZHBVMGFMUEFlKzdoSG1D?= =?utf-8?B?ZUZMbzViSStHeXV2NzBkem9adzhyRm80U3hvMWNXSUMraE84OHhXNkxpTzJ6?= =?utf-8?B?Um5URDQwTWUzSDZMdlUyN2JyalNjN0R1aGpaQkJzOWxCdzQ5VFplb05BODRC?= =?utf-8?B?UHVyMVJQY2dIYlNicXdFUGxTQ1pHM2VKU0JXM240MlNQR3h5enRSTTUrZ0pz?= =?utf-8?B?NVdaREdvSDNmY25BNFdwa2pMQ3BHQmxMZGZuWFJLZXhsQkVjcU8vV1M0TlMv?= =?utf-8?B?eXdjQ2ZYS3NUT1R6OUNBbkdicTQrOS9ZazM3OWNlMDJ6L3FDSlFEb1k0Tnl0?= =?utf-8?B?WlJBVExGcDcyUVJDSEpHYUJOYjNXY1g2QVg5dEVDVUVlMzM5WkhjbzltQTdU?= =?utf-8?B?eWV1czE4amZUYjY4SWxOZUhqT210N3crTkNuYmJRMk5POHE3TzlLbkZIVmNC?= =?utf-8?B?WGQ2aUE2VkVUbWVRUWNBcjBNalZFZlRscTN1TXg4OFEyR2tGWldIUzE3VkFs?= =?utf-8?B?ck9EaW9pekVXS2MrSzRaNmxRbFE4NlZUb2JZRXJqaHJxQUd5RXM1b1grd2dw?= =?utf-8?B?SjBNc0ZONmN2bnE4YUdpZUFZbm9FRHpnRkZUQW9WSWcyazhaYStGcDR1U0cx?= =?utf-8?B?dnhocWN6amhHbjlhR1M5OW80NmNwQ1NXcUFTNWc2VWg5TWI4MlUyOGNUY3p1?= =?utf-8?B?MmdacUlEUXRndThzZncrTXd5TUFkRE9yQjRkYzFEbkpBLzlqVjJFTHR5YjYx?= =?utf-8?B?aGFGUDF2VVRuMVdvem4wRm9pbWN1V21oUFZPanBHSUxSZGlMQTlGUzl6YVor?= =?utf-8?B?anNueU16K2ZPbGc2elJZdzRZY0hVSnQvNkdwTGRQWnEramxQdTlUVmQ3dklK?= =?utf-8?B?NGRhZ1ZJY1E3Rms3Z1hlL3Zya1UyN3RSaEJqSm5lNzQrR0ZFeHJ6YTBPZENo?= =?utf-8?B?VGRaWjFtTVl3YWpMckV2SW43d1FrUVppRTdJQWIraWlZemF3QlRMM2lYbmEv?= =?utf-8?B?Z3JvcTdrVzY2MFQrbGV4YkdjODBJVjRzVFhqWXZkdHpjWGxjYkRDZU1wZ2p0?= =?utf-8?B?bUlPVjdqemdiL1phQ0tob1c1akdLSEZ4NFBuRndQaTJ4Rk5LMUNNQ0ZnLzRX?= =?utf-8?B?Qjk1YXJ6ZmdIdHdxL05RRC9aUTZtbGNIOGdqVDRzVThlSXh5WWwxM2syYTdW?= =?utf-8?B?WFFwTy9DTklYY2k1Vjlkb1FaNHg5UVFncWQ4bmM0WmV2T29OVHhRMnBSY090?= =?utf-8?B?RmZaK01zZ04rbTVqYjU5WEs4MFphSktBNUMxTkg3L0JwUGd2V1FvNmxPWDlu?= =?utf-8?B?TTE5M3N4OVYyQXpySU8zT1VWSW5idGV3Skl6bEJuRmtyQS9uRTJqTjVZNHF0?= =?utf-8?B?ZGxFa3huQ2FaTkdxSzUwZ1pJMjNSdkM0MTlsL3NobXFCblpodkdmRkppRmdU?= =?utf-8?B?MFpwcGRvc3NpY3hVSEdjWFRQa0lZRFNtaExqdjUySHlNYWVsS2hLTGtVbEJK?= =?utf-8?B?WVUwQ2xVazcyZUNpK3d5RStBdVFHbXZGZWZ3Nk1RZnNLaGpHeDJpSDYrejBX?= =?utf-8?B?bDExbFFFRlRMMytuTFJZenV1TmQrQlFQYmJ5MDRrdEJNRm9BbW9XSWxrM0p4?= =?utf-8?B?Qk54K0N2NHBZdWdEdWVOSTR2cGpVVWVWeDRQUkxBNVV4bm02T2VvYzZOSG5r?= =?utf-8?B?ZjNNUDAvRHh6NVVncWNSSWdxZ003Vjl0S3BHWWxiTEwrQnBWWllRWTZ6eXhi?= =?utf-8?B?amxBS29mNmdrYU1zbW9iUjNEbm0vaGVmSmVFS3dSUGRROWpEcVc0WjVyZDBR?= =?utf-8?B?Y0NJWWx0NHMyd0pLSnlGM0lBdDNwMVU2ZWlBYnhneUl0NXd5R2doM3hYenky?= =?utf-8?B?TForclAwMUIza0tZLzY1amx4dm1pSnhkNFh4UDdOaWQzRGtGU0Y0Q0FJN0ww?= =?utf-8?B?YU5EZlhhNzgwUXplOTFsUnR0QXRUTk5qYnlCTUovTm9Wc3FQZUROMUJKQlEv?= =?utf-8?Q?aUhE+37Vi1rnSA7M=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: a8fc6c95-43ae-462e-2f8f-08df23c6c8ae X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 16:27:58.8770 (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: wiKW6bRh35m7yva1Snz7cRoAvf3zqLo53dLIhWBj2UVMTJRel1AmiY+263s/hn0YyzhG+Qs9kLBT5TDU/aS7u+61xnwW0lG7byZ66YLYGsg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8899 The active altsetting of each interface is host controller state that the guest selected with SET_INTERFACE, but it isn't part of the migration stream. For most devices the target happens to reopen on the same altsettings, so this went unnoticed. It matters for CPR of a device whose endpoints only exist on a non-zero altsetting, such as an isochronous streaming interface. Migrate the altsetting array in a subsection, gated to the CPR modes: only the CPR target consumes it to rebuild its endpoints, while a regular migration reopens the device and reconstructs the altsetting itself. Signed-off-by: Andrey Drobyshev --- hw/usb/bus.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 8dd2ce415eb..ee13acea658 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -8,6 +8,7 @@ #include "qemu/module.h" #include "system/system.h" #include "migration/vmstate.h" +#include "migration/cpr.h" #include "monitor/monitor.h" #include "trace.h" #include "qemu/cutils.h" @@ -63,6 +64,37 @@ static int usb_device_post_load(void *opaque, int version_id) return 0; } +static bool usb_altsetting_needed(void *opaque) +{ + USBDevice *dev = opaque; + int i; + + /* + * Only the CPR target consumes this, to rebuild its endpoints; other + * migrations reopen the device and reconstruct the altsetting. + */ + if (!cpr_incoming_needed(NULL)) { + return false; + } + for (i = 0; i < USB_MAX_INTERFACES; i++) { + if (dev->altsetting[i]) { + return true; + } + } + return false; +} + +static const VMStateDescription vmstate_usb_device_altsetting = { + .name = "USBDevice/altsetting", + .version_id = 1, + .minimum_version_id = 1, + .needed = usb_altsetting_needed, + .fields = (const VMStateField[]) { + VMSTATE_INT32_ARRAY(altsetting, USBDevice, USB_MAX_INTERFACES), + VMSTATE_END_OF_LIST(), + } +}; + const VMStateDescription vmstate_usb_device = { .name = "USBDevice", .version_id = 1, @@ -77,6 +109,10 @@ const VMStateDescription vmstate_usb_device = { VMSTATE_INT32(setup_index, USBDevice), VMSTATE_UINT8_ARRAY(setup_buf, USBDevice, 8), VMSTATE_END_OF_LIST(), + }, + .subsections = (const VMStateDescription * const []) { + &vmstate_usb_device_altsetting, + NULL } }; -- 2.47.1