From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023076.outbound.protection.outlook.com [52.101.72.76]) by lore.virtuozzo.com (Postfix) with ESMTPS id E139E80067 for ; Thu, 24 Sep 2026 16:41:42 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nJRDPl85WeiCNVEjI+VJuvlW6+fYgtSzxEC36TbxbhkoRVbfhqKajs1Kvqp6YVPuPFSEX3LH49gK7cBoINTyL771ZuoBm2jNqMH1zrkKrtNPUHEiBj3By1FB8SQtuO7vRCV9lnl4yZL+iom5zu+q7u2YQ4iuHLQo9F1fC6a2P4xpZyH98Es9/UYFDHGPPKXv3IsUpNi8JgFPP3qm6nCNossaW6dPKvn9oj11TKdfulPbkvbHrZjmvwGR7jqzWwKB3I2rpKyUHATl+TCFpyCsQWtgXYJnqMpZQrrP/qGcduCA+8SlJRIgI78n4oAbkXeanM3XXQKE7+Dvnv38yyNB2g== 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=JCQxaWdCYhpl1aFh+4bGSioGBdiA/30cza5dgoPbrw4U+hswvsm1XqRG0NnfyaOQ6BHI4RkQ2Nxp46D82x2mcw9PasKDxxgX/DypX9LF2p4wkyWUDpn+UjRKLl7KxNuiZhzmhSO0mwxI2G8m0HgjWxBycHdYtvKWfw9gIeutH0bynrOgILUsB0ypTRLIPAdXMSnCqZ76p3oWxBGHnL7Mlz5kwlSJC/LBhZx+QTJ5EWywjY0hjSSIjS8jvHPlVFFAm40qh3NNEV1SNKpFXwbBw/q4VHJ7oCVIg5B8zu8Y5a8vZS3E666i7NybzOUt6fKX3uoa2239pxj2AYwDYMOcPg== 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=uD1QFriZhKTn2Gr2yRoSkokeF9qRwIPqjCrftcqdhSCX7fKFhLweEX1sMdRVzoM7aSQqBkUCESZl2zUEABIa2QlVTM/Q5TBmssRmx7x0TUnSubX97dHAS8ZvZtCmkQBiRaPVn8cd6fGn94Ko51gNXitxXQI9gx4XYHlcJBuqCYd72/gEm0n0hAhGbSsbBXAyUIacHfk13WqtyIJLRfSH84l76Yb84XWQd7OehhlGrhY3WbsRlh72P4cM2bAlhOotVmavZTXYLLcW8ubZsrWWzfhVY1LK370SQIOQ7z9HSY9OyaTy4+cokxAR7aXCnOEdpludZMtpQVJup4xE6PHH2w== 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 BR0PR08MB151385.eurprd08.prod.outlook.com (2603:10a6:2c8:30::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.18; Thu, 24 Sep 2026 16:41:42 +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; Thu, 24 Sep 2026 16:41:41 +0000 From: Andrey Drobyshev Date: Thu, 24 Sep 2026 19:41:32 +0300 Subject: [PATCH QEMU HCI-8.0 v4 09/12] usb: migrate the interface altsetting #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260924-usb-host_v3-v4-9-1cc48bf630e7@virtuozzo.com> References: <20260924-usb-host_v3-v4-0-1cc48bf630e7@virtuozzo.com> In-Reply-To: <20260924-usb-host_v3-v4-0-1cc48bf630e7@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev , den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0030.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:356::12) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|BR0PR08MB151385:EE_ X-MS-Office365-Filtering-Correlation-Id: ee874706-884d-4d40-5c9f-08df1a5ab5fe 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|52116014|376014|1800799024|366016|10067099003|5113699003|6133799003|18002099003|22082099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: UhqC2Iamh6GmicYKtiua39Vssafp6ebtn6302Y0vlRRO1n/Kop8K9k+nCIpI3tT0GQOjoZlxFJvAx8xUttO+H8/oEu124nAo65yorzXW8XGBL7/WkJxkZQxFDn8sTh2CUQ+0anNtYRyqpVM39R++nhaBh6hWRQAz/GJOax0zfRXqm0p24kummBMXd4PBlXJI8nvQtKikncJ6pp4nYvEtAey6zkAKZsDwwi9YstMBdwrj0hLEaWIqUOrAjH/PhUbF19ABhueIAJPwdpxrdnb+joTREFzDmi9UC4ks2IwNdQ9G9INfYFLt1VNyqgILHSZ3/8l00zx5yn8HSVynyODSHLiSNH7GrZQDAuqac62MPfJfPgAVnIdvDK+5cBzsq6G+9KHAehGb3kbbMgs/gWqqet6ftr2V91uGP3jUwmZeD6ixmh1k06Sh05bMBa8SsWrOtvDIadzrn80kn4J4nf2MsqzH6uaPQEbTk9gFb1wh+S/qRNVQ6TgBZSTtjqrcKNz4LyhtgzdPI0UldkhA1nfV9+9dDwK6JSGjTEVl//4WSgkCqiAgdrMOzOt+TzFklYXYloBFu1SrzbuBgAM77c80JmuX1luxlitzo7oQpMsMWCyLL3p1sgJZW3n4uq9p2k4ygTr89nWJizPKuflTuDteZEGUXGPOfE4tmAxZ3Z0BRnttUlCQ8FNfeo2sNvChUUp+foURewXIDClROT1YQROSs3mhLV7NHgI/haEye0u5Z/s= 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)(52116014)(376014)(1800799024)(366016)(10067099003)(5113699003)(6133799003)(18002099003)(22082099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?YkNQUVF3eHJGK3VVOE9WemlEaFd3U2l0RlRmWVF0MDV4RnZxWXNrNWwvVnJ3?= =?utf-8?B?R2paQXhOZlF1bGlhaW9IV1hoOThZOEJkbXNpcG9GdEJsZVBOczhUa2pKWjlH?= =?utf-8?B?LzdiZHQ3SjdVM2tGZ2FjQ0ZaRUFKVXc2eW9nbVJrVnp3MnpYSjV4SjVzeURE?= =?utf-8?B?akZLT3FiWlR0OWFLNndVZ29OajM1YVFmdWlaR3NyQzFMWlFVU3Z0c3k3dENB?= =?utf-8?B?Z2p1L1RTSHlLYmtDbzZFdlFTNlM3bEN5bC9nSHF4VEJMTlJWcnNBWnppYlJz?= =?utf-8?B?Qmowekl4TFRpU3RvKzZSOXBueTdpNHVDajA0R3dkMlc0YmQ3MUNPUUptSmU2?= =?utf-8?B?V09Qb3RwRWhLRlJJa0VVNDVIRDUwbDRpOXA1N3FPUFlublJiU28xSUpYZWZy?= =?utf-8?B?THRSMkc0SW9KU1VDSVVVdU9wQ1Z4UEVCZjhWNE1jSDNLVm0yS0t5M1B4QWc2?= =?utf-8?B?eWdWSkR6c203OHF2QTFZSVFjREwvblJNcTcwWmlGYWo0S1JsaGJLNlhreXZ5?= =?utf-8?B?SU1iMWZMa1RNc2t6bHMrZ0Y5cWhmMW5mcGdvMlVGYnRuWVd1aVRHKzU1aDJK?= =?utf-8?B?dGlqTHRvQ2dxYTVqWk5HWTIzMkZ0Sm55UDNJdFd5dDMvckt1NktzWWRUK0ZV?= =?utf-8?B?WmtaVm91UnZGR3JRVXVObHpaSXBhQjBvdWVYRWZTUGxKR09WbnhNWlJJYWE0?= =?utf-8?B?UEVZRmJ0cHc1RXdYeHh1RndubUVUak9Wbk1WZ1M1dll3M2hzTENaY2hhSm1Y?= =?utf-8?B?bVZ5L1BPcTUwODhOeG5BdzUwUDZOQmhvQkd2NURJMDRaQXpKbC9EYldkdW9s?= =?utf-8?B?bExaWXpjM2VTSmNpanJaSnpEM3doWW96MlpGbzRFcGsyT05SRlNkaUZ5Rm54?= =?utf-8?B?djl6aDhKVVRGTnpjUXBYRnFsRDUza2kvQUV5S0xpOThjYU9mQks1ak1DU3du?= =?utf-8?B?dXJpQXRubkJVc3RsV3lUdEptQnZCOHJSTG1FUkxoT0lnVFFSR1E1MGdMVFJh?= =?utf-8?B?QlBoK1lYZ2VYMysxb0NtcCtGWmJHdmY3NTE3WjlXNjJlaXVEY0FDWG9HM2h0?= =?utf-8?B?ckpKQ0hRN1R4MHgrcDFKYmtlcUNtR2hCMEdTdzY1SVdQc0t5RTlyWXo0ZWZW?= =?utf-8?B?NmZXYWRkOFpJbnpzRWtINFBuU3ZiWG1Vdk1YSGU5Y0VCVjlmaDNJTjA2UkZy?= =?utf-8?B?Rk9Ib3JhTmY2ZmJLOXU2bEE4a2cwYzFva2VMcTdjeXVrV2tSeDhROThyRHBx?= =?utf-8?B?dFhRaU4zT0Zza3BxeHpzVTNWalhlSk1PSyt5dFZCMjNxRTQ2U21iejZCc3pm?= =?utf-8?B?NUJBT2MyWDJ2cEV2TURiZVlqSHZKSVp0MTFtcHkvdEJHWHhCaXA5Qm0yTTVt?= =?utf-8?B?OXVOYTJNSmgybXNqQVR6aHA3by9abFQrWWF2MTRhb09RUy9CS0tWVTlocVNJ?= =?utf-8?B?WERpekY2RWFnQ1B1QlIwMnVYQmxNaDdaOURoNHBQcG1lRjE4TzA2T0x1YVF1?= =?utf-8?B?azUxRWNvbyt2TnhGaDZXSXlINVZTdSszeDNIYTR3SE0zS3pYaUgrT01zdVlW?= =?utf-8?B?REFjK1dkZDZpK0lHZnVpR05QNVEwQUtPV2hINWNzcVRManVPOVFHR3N2L0dr?= =?utf-8?B?eDNaSkdVNzlYcm1jN25sekhpeWppcHhjYzhRTnpiT0pCam5TeEUrWi96TWlj?= =?utf-8?B?Y3lOaVlSeGlEMk5Kb2FveVc4MEJocUp6T2czM0N1cGJQdGhPeFNwelN3bC9F?= =?utf-8?B?N01ZajlqZG5hSHRGVnNtZGJpUmhzekhVN2xzc0RhdkJ4Um9EOVA3Ujk2cXQr?= =?utf-8?B?M2VzR2IwMTBWeWFJa050akdWVVhROW90dkJCMm0rZk1mbm5kVDdKUVVBLzNq?= =?utf-8?B?bDJvZHoxWk5oU281aGoramQ1L3NGanl2SmxYL2hOYStCQjZVN1AyU2p0VWJO?= =?utf-8?B?UGdwWDJMVjIwRVEybVZnMFdHOWRFTkRVME5mRnc2eXlXRXpPUzVWUkNzZThv?= =?utf-8?B?REtReHErTzdNWFNOWkkrREJwUW1GcE8yaHBaMWVBc3hJQXJJcS9uWXNMMGZZ?= =?utf-8?B?S2RxVVVyaXMxZFZMeml4TVJoaWhzZXl6N3UwM01mSXA2R0ZuaGo3YlF3eklt?= =?utf-8?B?SXZIbEI1dlNuSENFMlZ5OFgxSG1hZFA0VVZzWGRuVmd3TXFXSHNXaGNvcUJD?= =?utf-8?B?TmE5TlNRYTFsa1NDTlZrNWttR0w0NmJ0dlcvVFlDYzdyVmljeUkwalI4UGlU?= =?utf-8?B?MHB6VVJyTURyOU03dWFBNEt6MkE2dVcreGZiR0JtNDkzb2FGRzRXdDFLNkRP?= =?utf-8?B?VHpzNWFyYU5QRkE3L3NXb0MrYmYrd0lUUTF2TGx4R0pIWitENzRPR2JXUXMw?= =?utf-8?Q?sDEgZBdgzmkFrXEM=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: ee874706-884d-4d40-5c9f-08df1a5ab5fe X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2026 16:41:41.6735 (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: Vjn754rvYrhRdlOveyk7UQpmbUkdIsIaL+zeb0tcASkhxa8T14mvWvDkzSCudJyJ2p+jHh6I6su8yR5n+u0V8OzRJ3ed9PwZ1TF0OgoIiEU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BR0PR08MB151385 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