From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11020119.outbound.protection.outlook.com [52.101.69.119]) by lore.virtuozzo.com (Postfix) with ESMTPS id B2C34807A7 for ; Tue, 6 Oct 2026 10:34:45 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DH7rkShuebYTAn6iz0zJZ0+l9bsbXuf/3F4Z9hQ+VKCaOs8Z0GQMlYNoDj2qRS6WY9lQt3GwdEHi8in5TlrSw8+p0C+ZME8E+beA82hoQnPRGE/8wwcsWTzkIx/4Z2n+USaM0bHd+cSrliLgUo+LIVxGyVnLitS/QYPrW3nC9rd8O+6iQphPTA/WZO2xodVwsVTtYWYCqQFhDnU5+2g4vrvF6t/+CBkNLDGJ38ao9wMTuGuS4U91ryTYw+vvWci91ZnZa33FZXUMyf9v9VJEY6IP8LOhKYMinNwoc6NHLctRmhxrCQVXqgCJSL4BAQj9R3Bw3tqbfbjAdGEUOYpu/g== 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=B9aCIw0ag0ZBuiPrKeN3Cxk06QUasph8pFnh3R/vmV8usT94pdJmrJ2OlirOl92ilBQtd6dM8OOeceM1eOJaWNps5sz7Rh66ClB1C5HDx9w+QoS8BL4dOCmdBlyol/ScIutxq2D07o+Z3IPQD40ylJt+ozaC8PhKuDqikdU3WJyHb+auUjdipAM1DQB43wNk7SO5tacm6FyasKMvqLGfXJztf9MY4nrbfY7pyQmhuFG6lLns572xya1fXO9Q0DVJ+kj2Jmzl8crJCC/GYjncFuAekTVbdaqDnu8Ejmv70dfkvtnzvfYvNyEjlsO1uLQGyc4EabK2QelezYVx6KAtJA== 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=yOMUBctHM7K8il/Z+3AjekatMexMU6u2bD+3/39m1V6HTKyHgDh0U6u4ZmI3kxzFqzvUCMHH1tChFPZlS9dOkOPSnLEt1grP1iNggAGLtaLi2vJ+KNPj0yj7COEaoC+pBxxAV6iOb5JGHhdsPRgx1WyxbMnPLXyxQ7YWQBnzYLatmjyto65SDOQUehDE89aTFNf7jFScUxsDMjbghF0Jd3FDEnZ7Ax8KmUhnUTmLHOtHVg8y+9RhpEl9ZSS1A2lGG/hnCu116G6UgGiqZPJzKOVLAWcsoDsmUN6jEwbTiBQbF/wA233XK4HFHOZERjyAuhK1+qtgyQIv8viQ7g5Wkg== 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 GV1PR08MB8692.eurprd08.prod.outlook.com (2603:10a6:150:86::16) 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 10:34: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.0496.010; Tue, 6 Oct 2026 10:34:42 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 13:34:33 +0300 Subject: [PATCH QEMU HCI-8.0 v6 09/12] usb: migrate the interface altsetting #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261006-usb-host_v3-v6-9-8688ec9576d1@virtuozzo.com> References: <20261006-usb-host_v3-v6-0-8688ec9576d1@virtuozzo.com> In-Reply-To: <20261006-usb-host_v3-v6-0-8688ec9576d1@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR09CA0115.eurprd09.prod.outlook.com (2603:10a6:803:78::38) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|GV1PR08MB8692:EE_ X-MS-Office365-Filtering-Correlation-Id: a1b7872b-93e3-4def-81ec-08df23956a42 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|23010399003|1800799024|366016|10067099003|56012099006|5113699003|6133799003|22082099003|18002099003|38350700014; X-Microsoft-Antispam-Message-Info: 1EHcTBsWR/KuGEGDZDJbUdrsObT+JnqXUHgQ74u+C4nDPK0Xdj33ojyQj7XWHCn+zS5vm/oz9qvlN89WMV0VDJr/iHw1Rpk7kSTtENLHsOmlF3jik39JXJoTD0+iDoPyzOd80UgcFkF7BKpoNfk53ipAesSBs+eOMv/GHvwQyh/H76aa++DuX8kmpnNl+VeU+MyVB5hQYmW8sLPUzDgM+TRJHdzPqsnpyOYaAPUHpmJ5ISfc3xsriyBVsml+A95pehNjrXpqoeiGxalwBQRx0UMwVxeUhjEC0d6dpB5pwnLIyulNrqBWol/VsB7RbxPiXoKHUZ8yZDUbfzmMnGZ329V7Z4xPQDsVIAudm69bEcs/GtrB0I65tFRjECIDto2q38ZNTxhL96PTyq3v8nKkHPc9gqt0iNmMtuQDSQHOjrpWNVHAZMNvDZbvCgyjBqopXNOpPmb3M9z/xqij0N+WewnmcYrW6RNGZAboLgkY765cCb8B1PpMcYtwq+sxqw/oAUJ1slLSI89+Fds/mNXeUbcztPjXZRxvF66SJggcakRCpUTBtfxf3Zq6qmFY23lH8d1LlgLbFKZH9wUB5OLVIBx04wdEjeiNgsY8yGa0gGktHIy9HwI3RTT3JONe7xDcyPCEhE/rZR2+BQ+xKOUzddm7w2rqP6O7Adoh561F0CETWu0pH4u2ux8u8BxVL+3kRCahmZbDx0JErWD8hPa8EDyCT6eQLC0wSCGgBxrI/B4= 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)(52116014)(376014)(23010399003)(1800799024)(366016)(10067099003)(56012099006)(5113699003)(6133799003)(22082099003)(18002099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VVlvRFpnaWl5QlgwZEpQZ0RUU2RVSGhwK0tTU1dJeForK3VNSFh0VjVFMnA1?= =?utf-8?B?cDNBcGhaM0kzMmxGcXVYb0w1QzlHSEJNMUtrVVljK1QxekdFR08xemJORGZE?= =?utf-8?B?amh1d25qQUdWbU9VVXJuWG5pSk1HalN6V0lDK2RJbjhpeFBBQm9EMS8wL2pE?= =?utf-8?B?Mk95VTFLVnc0Tkdqa2R1ekZsMjhvTU1rZitBTWZYMGI4b1plb2ZIZHFMUWZE?= =?utf-8?B?bitNVWY2bGQzZWVhWkdUV0hCcmx2TWhTVE1JVHlhWHRyWXp0Nm44VzdXaHlB?= =?utf-8?B?MHlHTFk4VWllZjVhR2x2TkZ4TldjUExtSElxNVozREVKbFhsTG1wUVlQSktu?= =?utf-8?B?OXp3UmM0NzJuNVJrV2RaY3k0Z1ArbEhFTDF2Yzg0L1NSb1ljdVhVM0ZDUEtE?= =?utf-8?B?MmhPMUZmeVdVYlBzdlNrUjFpbnJ3VTJoZkEvMHB5MG9RRWRGWFB6cGZPS01k?= =?utf-8?B?NVdrUHdkV1hCY2JkS2hwMjdkbXRVa3l3cVRzWWxLdGo2MVNTYk1KYzk5QzVN?= =?utf-8?B?R0NKT29GdnczOElRRS9oN25LSkhlU2E4TysrcHd0eWpzcE40QTJuS2ZmN0NS?= =?utf-8?B?clc4ZFRES0dwWDMzcVJzdkRoNzhSemo5MU51Q0d1M2pxM2lnVlhqcVlSMDY4?= =?utf-8?B?UVc2YjgrWUVwQm83OVFibnNuanNLRzhyaEttbjNSTVBTb2pjeEJzdzlBaUt6?= =?utf-8?B?VU5RZzdpa2VBOWd4bE00akFVVW1XdFZEZ0FsbFAxTGhmajdmYXdNUy9vS05q?= =?utf-8?B?TXJwNzBPeE5Td2JXUjFWTTd1OTg2aVp5S1Bhc2puZm1IU0RDbzA4dms5YW9Q?= =?utf-8?B?MWhJUVVJUERqTWxxRHowcVArdXhNUEw4M1ZCTDNFODFON29wMXFGaEhFTFFQ?= =?utf-8?B?aFZFZGtGOW9lQXpqOEd5eCt1dWNqTWFTL0ZIV0NhR1FkOHJNMVBPcy9kbzlx?= =?utf-8?B?RDdEd2M2VmtLMEdHS1FHbVFJS2ZRbVpqQnpsUXNSUW16RGhma3JzRlY2eEM1?= =?utf-8?B?d3NJV3hpdnYwSjJSWkxaZU9VaEJ4SUZyK1RVSEFoQnk4dUZVNkNNaEh4b3dN?= =?utf-8?B?S1RlbFM2TDZtQjNIOWZVQ1hhSElNaVVrVitna2lPQ2ZMVVU1alAweG5GYkdx?= =?utf-8?B?MWxrRnk2VlM3WmQxUXg4MFM4NDFVVFRyVnlKaGlsUkUxcFpQWUtEUzBOL0M1?= =?utf-8?B?WllWcHI4NnBmYmZVM0xCNndQcFNlODVGM2Vid1ZQaUJwQXZCOWduWFo2UCs0?= =?utf-8?B?L3BLMEJEcmNZdHE5bXNWclllNXR5T2RVN0Z6V0FzY2JYbStremk0RjI3YzEr?= =?utf-8?B?NlV5R0tOWWV0RkljeEo1RWE2Mk9Na3BnUENHZHVTQ1UwdVVHakhzY1hiWmh2?= =?utf-8?B?RG1CRmFWdmVicmhVd1ZJRGhUM1lUR1UrL2FobUthdExJQTF1Q0wvclVTeEx3?= =?utf-8?B?OCtwYThjeUhESVJHeVlXbi9lbGFJbzgzRzBRUkdSRGRHZmplZzN6M05RNWli?= =?utf-8?B?WDBUNFl4eGZrQ0dDandtU29aMG0ycTd6OUQyUW5FL2tMc3pSV1pkN0xYeWE1?= =?utf-8?B?YXUyR2ZPR241bndPNkFWUDlZTHhCSWdOS2pFdDJEdlM1amozRmZZTEpVV3JC?= =?utf-8?B?NmtlbzdDZ2JWNm5SQ3lKVDFWMjJTT1o0L0RNaE1SRVF4cXhBeXp5Y0Z1c0hh?= =?utf-8?B?V0J2MWxFTG51STVRZnh4ZDRBQU1OaUR6RFFlVVdaRUNCb29ucmtBUXZNaWxt?= =?utf-8?B?eXVrQ1o0MldYNm8wTC9GbnZwakNqYWozZ0JEVUcwaExXZTFsRUhHNEcwK2Mx?= =?utf-8?B?ckp2OG9VTW1BTUlieTMvblBSZnZYZDUxZVVVQk93U0wrdWJacDJpWmhJUHpJ?= =?utf-8?B?ZkNnNUFBUmZzazR1eUkzQVpLd0NoWXBBM3Z5NTdqMjB2VGd1SDNiOEVZaVpM?= =?utf-8?B?Uy81SUtLY2hOcTBrT2VFQ2NXYjFEdnczVTk2QzlQVHFFMktKQlZTRjFFRHZR?= =?utf-8?B?S1dxUU9Wd0IxUmw2QjI5OTVBcmRzNlZ1blF0QTlveVp2SktmaWZPdjR4ZzFN?= =?utf-8?B?NGxGZFpNeXhVNHZ5eGJQWVRjRHVTSGhxUWIvbHdHOG9HVlZZdExXQSs2c3I4?= =?utf-8?B?RDlmM2txOTBQTU5vTXZWM2x6MDk4aGRXRU1EaHg3VkJKb1hIa0daeW5kTXhF?= =?utf-8?B?bFl6R2NOalZmaktyb0dOaGVyMUFqVDJhM01hclBpOUhhbUw1cC92eFZSSEFj?= =?utf-8?B?MlBpTmhkL3lEK0pBOHJHcW4xakxYd1ovNHNKbmJiS3hXL0ZQb2RVRUhiVG95?= =?utf-8?B?NDFSbm9FZGp5T05nN1FnQTJQNExueDNYaEJPdDI1NzhWcUc4RkRwcVZTYVZB?= =?utf-8?Q?lhiJMZaUCZ9UEz+c=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: a1b7872b-93e3-4def-81ec-08df23956a42 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2026 10:34:35.0810 (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: SYrLYFJv2VBivxi8Etc97SmRzyHvRsePtauBOVa0JK0/nIyKWAV3KCbPvh/Ngsu6fgnbM5EpEYye/NgiAj70uGihi2bWKMhZVwb+Nw53Uko= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB8692 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