From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11020098.outbound.protection.outlook.com [52.101.69.98]) by lore.virtuozzo.com (Postfix) with ESMTPS id B7F9680781 for ; Tue, 6 Oct 2026 15:36:03 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UgOtzTGWsckt03uVPjsmmjlgMi4+qDknD3U3hKLrDO+o2C/BCE4/aIqteiEa3kPC07umomY3vTMEGN1xnHdAEu3eI3t0/qIWmvN9W+KDw1rUUit5y8Hzt+jrw+eIBWFH0PVrtjmQ6RxjEqWbAd1UolDw/Huivig7tvmtdczIwONcDNBya8vtiD74nMmWiayRPlLXcNpVkibuYyGqoiVj1KToLBFVEC2p6jKqGqCBiYG9TTE/TsgQigphTWZk93Muh47GwDx0IsERckYvayBCQL5xLntMdN8Exutl0ZeFHIetiB19SrNNGE4imGJt+budnUDAThTKMSBhBZyC8tVBkA== 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=bmEOgQNjmY9WcCZyhPR+2coCsLf/1tE9W4FXqqrUl2Iaf3IrbvAvg5YNDSZdzL1PSrid9me0H2ojtr8tfrY+VVadHlZk7riEd//pkk6BVLv4WVMEbfigXQGzFkENFsDOrjiMv7CtjOReoptZHNJmchsMrX8tuiorqDwKJHPOGfZzmsxjws2joepunwmPeEOc3p+WUB+YqzT/HhhabM8LbBd4tdG4k5KELnoLM5NvbKnabBFciWavrov+E6ty50VjZfyabtK5GU/2Wr8u9lhN0pSHsD9pMEA/ncTsZbvXNrP6V6GHD6JJJKaMiiCK2x7nRpkJapPIq5U6l37lFyYfbA== 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=V/LZxh/ulodSH0ky8hHkzQ6R2DZXstECd7Fzrg5NNTQHINhXkhWO+SZE3OOswkRZK5foxYCGuA8koL3hmjuKY4qTyFvrfSkivAxmAgV/LYzUPK1h1cv+tREXGUXo/7Yqp9pVSfgcxVyomDeJCmLCHtoIAvwQTcT8nnfCvsNAZQxRV2xWRUWyZaIGHQ/Pu/9sKA3Gilq4PPuwHoEw6YRFmtMlnhsU/4eUM+d+USDmxkUamqYkUnWAfILgfVuu2/aKVP3ASJvQ7ChpxIb0fioblM1jOCqtdb+bnYCU6dSAjGRA0U1TxofoDyU9CDU79Qbpr+epbdXh2LOIGUYtN6uNYA== 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 DU0PR08MB9774.eurprd08.prod.outlook.com (2603:10a6:10:445::18) 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 15:36: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 15:36:01 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 18:36:02 +0300 Subject: [PATCH QEMU HCI-8.0 v7 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-v7-11-044f668789a1@virtuozzo.com> References: <20261006-usb-host_v3-v7-0-044f668789a1@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v7-0-044f668789a1@virtuozzo.com> To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI5PEPF00000985.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::81a) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU0PR08MB9774:EE_ X-MS-Office365-Filtering-Correlation-Id: 6a5909c3-24c5-436c-6679-08df23bf85d4 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|23010399003|1800799024|366016|376014|52116014|5113699003|56012099006|6133799003|10067099003|22082099003|18002099003|38350700014; X-Microsoft-Antispam-Message-Info: xaP2C4/j/1Ob9Pkc0LW2ZRLSZC1MOE6IRUOO8KD168gP1JRtbFHqSiYG4MG3BVLpXnD38T/c6fmyhEtgwv27I2MRfx/+0lRU7dx/P9Yjb/9rq/H/vrOpl1HeNgw7FsEJimEqTC7EtiTV0YceoMUHIz0yAIkZBsmMPl5N7oyBxmReevJOGCAIBbm4F1Lfjt5J73x0EKadNQSTxRcFDXVMUabEh5x6QlWAZ/GdwoGUkA1fp3VWr4Lp2jJzjXJF98K5uLyVj1Kh42O2sWKdmQzNjiNhDHrpOTdfopFyxSSq1ue4/0oQTTqxanbwNj1nW8SfgRjDWF4UcMqEoU7AfMrvuBT7+Gu2aCbu+Wbw6wVAtw8qIypAJKbzehdelgdgKJls9eKeePMBjs1onCfTdGkzfaaCIbOVHlSmFOhtv80+nJ6/bUnGQe215Ve3wuVr+UqwtGU3LTIdNlIgRGrVhkL8hvsV2lCN434KEannY5NiUJ8LxMNO77BQtnH7qCbE3VN82tqR5FKs5aAYZ6DUlwTkYeNkagX2IOZs3CbBqcCXny/uRff2VadhS5hwHiaJ6uIdAjs6yl2SONU71GKFtMvytXNs2w8Lya6rqscOGc6Nrni3Qm5ZTwgrTUUYSfZSrQeweojM5q2U4ZQISPlggisjHZe582UXchAjXkUAxWb9dKPOHyXPWijRCMoFdlKActlc/DO9fh7fXGAe6IPntm5NBspeA2hmKSw5IC5v8U6fV3o= 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)(23010399003)(1800799024)(366016)(376014)(52116014)(5113699003)(56012099006)(6133799003)(10067099003)(22082099003)(18002099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TE1YV051QkZ3djVoeWYwTXo0SytkKzI4RUZyamJOL0lOR094bGVHbVVpQjVY?= =?utf-8?B?V0tGQ21LWXFzQzdYZENqbVVTL2Y3NkQzNVZIQTZrYWZDMVZtbktxNmdKVy9M?= =?utf-8?B?MnpOc1FsR0x2WHMzamdDelROTGJhc1NST1NGemNPZ1JrZ05ocmxZcTBDZXFW?= =?utf-8?B?M3poNXUyZmhNdWYrM1JmUUZaSjZpR3NNS1JmY0I4d2k0cERKNkNoNmtQS1Jy?= =?utf-8?B?VCtEYjJqUmFNQmFWWlRXTVZvdy82WWlwMFFwakFOTnl5VzdaMldlcDNxK1FH?= =?utf-8?B?Ly93Z3UvdlpZQnBLTTh1L1pUMlEzOE5SR0ZmVC9EWk1UUnVOZFZ1MTUvdUJh?= =?utf-8?B?UDJ4UTFKbnVTTGdqOC9NWHFrNExNNGI4cXlwTllxOWJtbEdEQU5rZmJzYTFi?= =?utf-8?B?Y0l5Mk5BVFp6R0xtM2lUSERRL0dOQzJyRFNjV1RGR0phTjIvR21LSjVMM3B3?= =?utf-8?B?QjFXUUUyamxPc2RXb1c1QS9aSWVheCs2clFvdHlncGtQZEduS0RzdktrVDVu?= =?utf-8?B?Vjk4NjRxWXc0bSs4OUI0RktCT1NKMW40bmFCNnlGekdnK0QySCt2MUh1ZjMw?= =?utf-8?B?U0tUU0toSEJNMlZuNVU2Y0gwYkdSMVNkVzg0UUZLWTZkdFJVQjRUK2dsVEpE?= =?utf-8?B?bEpjY1VwRCtadHNBb2l6cW1KNS9mWGtCUHNKR256cGFwQ2RiZFBPcTdLYVFV?= =?utf-8?B?Y1N0OSs2VTBCYllGV0FMeGNmSWpjU2NpNkNPeUt6TjFTYXlWMys0bGgwNEZY?= =?utf-8?B?Q3JXM3JNblhoYlMySjRoZkxFUHlBcHBqTjk1eHRTTDIyOXNReEtNeGM0Vlpj?= =?utf-8?B?OE1xU21ZbWFjUUJiWWY4WHNISzdnOG5qVkwrNE80RE5QZjcwSU9MYlR5YjFN?= =?utf-8?B?SmhmWkJZd0haWXNrZTBMOGpXV2IxSFdpcFRPci9RamVRazZwc2RBRThWd1d6?= =?utf-8?B?ck9JcUxUakNBYnM3RVFxbXllcGJIY0pZZ2FUNEgvQU14ZjJQVFhBMklZeVNH?= =?utf-8?B?OFhzTTRWRTdmVEdPdXhzTWl5MGk2bUNBQXk1RlllamVRbmNKdFR2MUsva3lJ?= =?utf-8?B?ZllRUTB0QjltWmt5Yjkrc002WVp6MmFWOVdvM0xKOUcxS2tQYXhXWTZrR1JW?= =?utf-8?B?NUpZV0NwbDhkZ0V2TWRhSDJIUWZzeUtwaDRxQitEeWpCbEY4RVVFOXRxbERQ?= =?utf-8?B?WTJPdThaa2JjNDJBdEIyY083eC9pTWd4L3JNVWtyOXFKcTkxQmFJZHZhS2po?= =?utf-8?B?UFU1TG9nTysxUW42YjEwWXlLd2ZReTNldGYxUTlyYjUzbmhpWjRScHhreGJY?= =?utf-8?B?VXZDWC8rOUticm1ZRVkrV1VrMHZsb0s0MjluQXRqM21EL2FsNkRpY1lsSmlC?= =?utf-8?B?b1o3bXZxbGI5bTQ5Z1VXVXVDQU9hMkxaN0NZVXM1SXkvZGlBMGZLVzBpclNm?= =?utf-8?B?OTRaaThBajN4SVpzcWQxYm9sUGhtYU9VQVpTSy9OaXJ2SDcyRXB2TWdMKzJW?= =?utf-8?B?SW1McDZLeUtINWQ2OVdKT082aHN2ZzYzTXBJSVVKeUVEVFJncUF4amRraUhP?= =?utf-8?B?a29GS3pEQnM0Q2U2R2xHaldESHRSUzlWUHJWL1ExbUZ5bHoxNG5TUjFabkdK?= =?utf-8?B?ZkZ5cE5hR2NOWkY5K29SelJoNkhKVmRDWEJURjRXZEtNTHdCcjI1MDBhRHk2?= =?utf-8?B?RlZDTEcxQnVyMnJTU3N3dy9BblM3cVBubStLOVlNbU16aFNyaUZ0UWZ6MUh5?= =?utf-8?B?dFdIc0VuZ0FtZXZsNFhVMU9YZVlkeFZrcXlIRWVOL3ZsNDQzaXlNMXRXdnZC?= =?utf-8?B?clRaNENUL0s0NzdOZ1UrWU45YnRYaEhuRW5TekFRUGRwS201ZUsya2RkN1Bq?= =?utf-8?B?TW9GZm1OZWxPY2N4d21MTU5ZckVHdFJqSkxqQ0QrcVJ0TlNBZHBVbUJpWWJ4?= =?utf-8?B?RjQzeFpiOGQ2YXhrdEVUWUtTTmlKRHViTmY3V2lRczNGb1NoTm5BeVNNblRm?= =?utf-8?B?aCs2VzBWU041QkZRK1FhWlZXb2kxRytHYjJyVUtNNTBnUStJdi9oK3hLUFhO?= =?utf-8?B?R2dSdVo0REsvdEJpQ2R6U3NuRi9XZjBCdzg1ZEFpZ25saXJCNDAveUQvVDdy?= =?utf-8?B?OXRQT0xxWUlKSTJUcHcxRTQ3a1hka3ZRUThvcCt6QlkyMWhQUWpnck9iaml0?= =?utf-8?B?cjR6a3lTRngzaHpyaWkrL0UzMWJlMU9sOTJVZHJVYTk3d1NRNkpldHF3V2V0?= =?utf-8?B?b2tPS3owa0NjclJLTGJDSFliZUMvSXJQNkEweWhhOEdLM3duNzlWMHN3aHR6?= =?utf-8?B?cXFYNnJUNXBHeW8zWHBOaU5aU1BkbmVNVmlIQmhZdi9ESUk5ZVlMUkJNSlJm?= =?utf-8?Q?MDZH94gwgWcmJ3Mg=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6a5909c3-24c5-436c-6679-08df23bf85d4 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 15:36:00.1741 (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: EG/dtcATrNBMasfrX50Mu8oWKz2+4NEvw8PvPQY0KInN3A9P6WO3RNwgEo2mU5NDRV6SiZhj4orQj1ugDKdnQjCz8fwc0wozzBOl2uIkR4A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9774 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