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 0651380674 for ; Fri, 25 Sep 2026 14:11:35 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JlQ5I82KDKvkqkCskDT8AuIyrL3iLHyZK+FWSDh5Ae9y5Sq5qKrqN2yd61HDR4iJpfC5vokkThOcgKyjw+qWbUpgQn1eN4w+EXz7i6mTpiHJVW2R7/S1rR0cwJdivq8yRkjt9gPwKLrdwQgHleLCePk3i6H6MWkMmtUuV10BxQ6um1Yk6F2OWibZxSseZ62kB/oNEF78ktfBzZaHxozlfCyvBhjqOaE0yq3PpQP89eIZO0P+kt6qpVWDOX468ZCE9+b+U8hSxSPBiKLsDEkd9uZ7UK16dYeILNCHTLlNmG1R7GHwkSJqtqmD632lp7PyJ9E6FjNsLxCgsLaTSwZj9A== 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=xB9El4AjllwrfQTNsGsEFH3xAU3J3ljHCvjCjw3tWIEL0m4BzBIiUuR6JqQ/YRPA3lkAAs6tTKr19uGma+RgKkpU8+OewH/MyDYvsyz80oLewDf/sXzW9e1jgZRPb0/FfkOGpXk5d36wLcErPGWXGTtgzGa80BKM+wAeYUxOaZu7/cgimIcwaMpxkhyMAV4BIjgnINbHbdzSEEOWFmPx2JdG3UBxTy3G4rI8u8JCpDGyhx9tI0dsXXJo1ZoTfVvkqOKz+1EinSWRQV9rlCbLYcqd8sDRK18pNd3nIGSswGjThJhKFxnLwUJxGRnDd7ppvXMq+UEWQqc1YRzvbCS9Cg== 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=pg+h/L9mn6Z3WKVxR2UiKa8cKASmVz/JzNiszQzaHjDuoZo0WGeNQlFHIZjKelMQSNUgqMHLPtX3bBlqlI7bCxtiIc1E9PJ/0X/2CywW79X5Ute2IwrL649A9FuA3RAsHkiCGe6DSUWqKD2BTBOqWfINiNV7wgKA293+Q8WyLpdhqNkrM/snLtfLknL/wA71eQtbaofJ4+CRhAOb3llxZj93WQdE15qGIOtgakE/GSoo+VIIep2fsG2n5X1KP02npjBKBgOf2OY5esHAYG/sqe6rFiZiqtv54s3yZy0DTwWsndqgrImn1R3oIlZk5WX0HP37z+tUu9ssYHgL1p6ViA== 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:31 +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:31 +0000 From: Andrey Drobyshev Date: Fri, 25 Sep 2026 17:11:19 +0300 Subject: [PATCH QEMU HCI-8.0 v5 10/13] usb: migrate the interface altsetting #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260925-usb-host_v3-v5-10-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: 80857a31-086c-40a3-60fe-08df1b0ee5b7 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: 8POMvhkujdouSIY4cba/aswR5k8w50u97B9ddvx85PLzq3RyD8aMyolGHJ6eaLeqTTcl0he2hVp1umhVdSvaizofuvCQ9Uspbe9QZFC/LHwhbkC8RMeHjVTvVAfUKRW+AxqNbVO5GlKg5sm5BcG7YrLVSMliYv6/kN5ySvR2DkzIIlboQN1aBHi3nw9lT+OuV6SP2JwUM7wJdcV1JQJ8U/MguyTXSKt0lwNKzbz8uL6mH59iclJGxKtByEVpyemj28VRdzKxuQpQ0+fCp4u3HXeSbVzRM07lUfwqiyRaZNHOjEI09bvY8gGEhqNQE9e1K+2QyW2pJvz/jjf71rtxYsmQvMxz31tL8BPf9bPKRBKfgg04dEljnmBEiGsd08xPk5kAzkCOu//Eprg/oKBmqPIL0UTOju4EYTZqUHpRw3eIAwGA+TlCfr94aQu+5YUj50+KfvLRDF2+883TNIqMCkRS3xe4lgMH0nwlUiUyxbDwnElONRcfu32REZpxVRBmXI5WY/vqKWTthJIWugUPdAaTcCrm+cvo+HmtqVYY4A8mxH4zfKhu6ViwRuUFFMHvYy4w1lJcDtbJtKwZPM+EBHQOtOHSrVERVIyBN99MK0wsPRmzRmmCM5/Rr1Nu4FvUgyi5dKsX7D17OCfl4ch5w3Ap2EwMRmLgoanCfvBfo2Y21vczy6a1+uyLmc8GFj/3cd/Z4hmbWqBOh6NkvJdR07aTYD9ckXUcDFvd0tp6J8I= 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?bHRueUVjTHM4K1djUG5jNFZOMm1YdW43aVNHN3dFUUpCWnJjRjNLaWE4d2NM?= =?utf-8?B?ZHlJZUJlVDZ3Y09iZGR1VUc2YUFLUSs1T2g3b3NMNGhjNHVZOTNUZ0NFbU5i?= =?utf-8?B?OGhvTkp6eXd6bWMyRlprYmpTUXNSYjhLNzVaR2pWdTZzUHM3VkNveHc4ekY4?= =?utf-8?B?R254TTZiM3VPb0JqbWFrYmI2VXhjaFp0dEwwOTl6UjRkbzZFT3p1cXJtNENl?= =?utf-8?B?V2xiL2hzMkxlZ2hCY0ozUkI4bldnSjBsd1F0eU45bVlzMFRjWk5CRXFMM1ZM?= =?utf-8?B?cXArNWtTMHJwaVpYZHpaQk1ScVQxUnN6Slpuc3B0NWNvUGtZTHFzMU9kbjVy?= =?utf-8?B?Nk1qdHdTM2JWQXNocmM4cnhqamw3MXhZQTN6bGJvdlRpQ214Rjl6WnYwMnBW?= =?utf-8?B?dTlSTUd5anFCYS9oa0NxSTVNbGpMMXlFc0RDWE41RFVzNG14RThvTjZWbHdM?= =?utf-8?B?bzQvT3ZoQlA3Ly95NnV6Z1EzUVEvS3pWck12WWtiNzNqT1BIY0tnOSs5cm5Y?= =?utf-8?B?dEVnWDlWci9GMktCYXIvaWRoRnRFQmlqVjY0cDZOc0tVY1VoV2szLzNQMkJw?= =?utf-8?B?U1JaK0VoZ0pERE90aEhOakk5MDd5TmNyL282RStBRzdZV3V3R3RkQThaUWdq?= =?utf-8?B?ckQ2dDFBY0c5cS9WSFpBSVFLSW1xOTBKR3VuMVYzQlJnWEV2alUzWHdPdnEx?= =?utf-8?B?R1ZGazFXMnBDVTc1bkJhTDlPZFU5QTZqbVhqbjBIZkI0M1VqQWI3bzFpT2ll?= =?utf-8?B?dHRUSWM3SG5pTDg0SHFCNkZSUDdveUFJVmpsRFVDYW8zZGdXYVVJZXExK3h6?= =?utf-8?B?ang0Y1lDcS9HM0I4WkZYQzZXUWtoRkpUaVUzV1pCU3Q5M0NBNDRpZ1N0MkNr?= =?utf-8?B?L3NuVXFIQ2ZCaWpOUWR0RUliT29BN1dVQjJONmlyS3JyLzlWMWNwUEwwN09j?= =?utf-8?B?Q0N5ZW41ZkpnaUQrYldKQTYrRkhHS0VhVlRWZklNSmxvTmhtaGVoWEFWQkxO?= =?utf-8?B?UXRKUTFMeFBZYS9SK0dDYVpGaXdVbU55dnQra0diSmN1NnZxOEZtcnRPODd1?= =?utf-8?B?VVRvV0IwRGdnMUV1U2pjYmV4ZytmWEkrVCt4aDNlcHg1OEtEdVZzUTdwSHdT?= =?utf-8?B?UVhhSmU2STRsZUh4azVqRjFtTHczN0cwYklmUHRaY2IyM1RrMWhNa3FkUE5J?= =?utf-8?B?SXF4WFMwMDVmSG4rK2ZvL2syUjI0dEx6RlV1LzlzUTNsay9Renp6ZkVIb0JU?= =?utf-8?B?dGI4NHpUTnphN0ltTFJpVUFLWlJUZENHNzcwZDFoRXVyQmducjYyOVMzcTNV?= =?utf-8?B?WHVYR1ltQlhzL01ZcDIwSE5Bcm5oS2xGVE84d05rdndYZzJPeTlJVW5zRHJi?= =?utf-8?B?K0pQYnY5R01adHduR2lQVzRPVVdPQjJXdWIwcVIvVzFheWtkS2hHTUhQclB0?= =?utf-8?B?dzZoWkpjaW9mUXJsSFJvSTJFVTB2MEdrcFJOdkFPdEd2MXA2U1VHdkVYWC9H?= =?utf-8?B?OERBMEQ1Y2huQlUrS2U0WWV0S0hlM04vL25LTXZxSk5sWUY3RHdjNDFyMTYz?= =?utf-8?B?TmhQaWVhOUplRml1d01rYjAvV24xLzZaWDlROUJWcU5VVzJBMXZmditIejl5?= =?utf-8?B?NXd4RXIveTNwT0tLTTZZbVNIUkE0UUtVYnhxZ3ZFNWRUNUIzYTU4Tnl2dy9H?= =?utf-8?B?SDNLTHhwVzBvejRCNzREQlZpdGw1WjhvUHFwMHdQMVNXMWlhdzRRZCtTK3FM?= =?utf-8?B?cWFvMXNLakcxQ0dVUzZESG56UnRlTmYydjVjVFlBbWJwbHNYWXlrczYxbDQw?= =?utf-8?B?bDBsMkRaektMZG4zbkpocERIWUpneEc4Kzl3L1BOeE9WbDhmaGlFdjJxenlU?= =?utf-8?B?bmEyV3pLNWtMeWh5bWNyMjRVUTJmbG13ekpDdnd6NS9tNGQ1Zlc5cytDQnFS?= =?utf-8?B?MXdyK0ErQXo2WU1yTTNjMjI5eUZkSzExRzVYTnIwZzYwQytQK2RBQlJGUSsv?= =?utf-8?B?L0dQY3pzRUJKa29MRFQ1MHNidjVuMGlXMHVuUG9HMjNSRkpnSSt3SzNRNWRM?= =?utf-8?B?T0lOcSt4SERIM3VGTngzd2hDWUdQUmNBRzN0dVVLTUhGYW5FVnVwa215VjU4?= =?utf-8?B?VHgra09pK0ZLQU13dXo4ZG50Yzg0MVZ1aEU1SFdkQXUyUkR5QTNXNTRRMjVR?= =?utf-8?B?Um5POVFxWFpyL1B0M3J3ZXVPaEw3M3dZaEtOaWg0S0VLUmUyRzRlSGp5NGg3?= =?utf-8?B?N09HWHlCZjNLZGJrOUpvclRuL0wvVWhiaVdSQ294Z2JCbFFuMEtPRnFaQlB5?= =?utf-8?B?d2JMaEJ2alBzci94alhRaHRKT3Focmh4MER1aUFxZHN3cVlaOUs4bVpCa1lZ?= =?utf-8?Q?IeaLEgYdoF+iE5gA=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 80857a31-086c-40a3-60fe-08df1b0ee5b7 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:30.8760 (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: znTuOpWyliZ0WIsOtphjlEaeU/ngETkzjzfefbe33W+G5Rhd9cRdHf87FljQSYJMVvK3P9vg/B1OnZkeHIOVamxX26nIqj8qdlMJ0D5qwEM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB10173 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