From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021117.outbound.protection.outlook.com [52.101.65.117]) by lore.virtuozzo.com (Postfix) with ESMTPS id 1814F802E5 for ; Fri, 4 Sep 2026 19:05:07 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cfL5cRH/9bWnhqFR/y4C3QLEzQ93KS6zZe/b6W1rQ0yHCNJpxhp2CdVcMwAV/Epfey0g5Bj29YwhFpMNBZnhDhSx2N2Pfjw1vuYXjEqduenzMh6srrTeIlHXhW1LE3LGI0dnvwoH2ZdJGF1n0EuTIUDCdZN0DAlAORRInGETiNJiFnp5Ohv3Vj6M77T43x3tIFsernd0VObLsqd5tTUEzxxT/WyuO2E3QnJ1FRSk7YeBchO0ayZSBIVrzvaGg1GhzDlihf3NfTJ0KHqRLZfYZBcPqjoSHUJWMYCGQhfis3aR8hXl5IGwCys5S8+MoADLl+pwEatzlAMGLhxcq+mZFQ== 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=kOGluRy3obft94p79AliTJRP20NZ/XILo4zEaekszJE=; b=qHVIbaZwb0hixgrAVH/zv9q2ZKZYFxSoTIcfvuAv7FsJ/Tye5Pzpur2J4jXQ9mTGdm8y3h6tlwpSARAP3LqfeBoKz3KFePDnn/McQYRtb92YdjuGkO2p5WVQ9TGdNYPsH18Mr+ZoAviEGHj4glrhlvkWUZop1PNG4K6pr/lQflN8ZeVpCUwWke+cIJO7M90Fwxk/wXtDaWq+ks6e71CJDv7GBVI/fr4OXhYWX7mkK6/43McO9WLGiznOuQ6T+k1TlsZ3cnZnp2I9sSLmluPzomqFmpY0M7YyjUAP+hydqVjMoM2Jsy+r8rP6qng/+SaLTw98YDg2HH1wdpGYQ4LOCA== 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=kOGluRy3obft94p79AliTJRP20NZ/XILo4zEaekszJE=; b=BUy7vGEKvpiP123zUBr6xJ0S8Cj5qZCiLrimFC3hHQ8Eu9jUX7tpP2JGg9j62qCY1yyhKHUQG5v46dDdbwJY9viwRcytRj5nJDqYVXGOsrkwQCGlq39vErd8Fn7vDMMkrFS0BMidfEMEhRO+9pCBoqjvQFMzfOx1qE5C7Gd5hJi73hoZ0yjlMQCDC8mXTwSy54e+aZ0TZ+foQwvnW558RtlNEIjLaSi2Zx/9qN20Yy3nw7O9t3w9cEsfOPLO/4ZPFIjW1ndSPvR22rxrVuWK24+0RWoGIglMaNKW1q0S7aHwXfm8AZtRV//a0b9WWYJkpuPQIhJRmnUl6pVyNGNacA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) by PR3PR08MB5756.eurprd08.prod.outlook.com (2603:10a6:102:90::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Fri, 4 Sep 2026 19:05:04 +0000 Received: from DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c]) by DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c%5]) with mapi id 15.21.0382.007; Fri, 4 Sep 2026 19:05:01 +0000 From: Andrey Drobyshev To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [QEMU HCI-8.0 PATCH v2 10/13] usb: migrate the interface altsetting #VSTOR-137800 Date: Fri, 4 Sep 2026 22:04:40 +0300 Message-ID: <20260904190443.795902-11-andrey.drobyshev@virtuozzo.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> References: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: VI1PR07CA0215.eurprd07.prod.outlook.com (2603:10a6:802:58::18) To DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DBBPR08MB10650:EE_|PR3PR08MB5756:EE_ X-MS-Office365-Filtering-Correlation-Id: e8cd74d5-0b2b-4bfe-581a-08df0ab76af2 List-Id: svt-core@virtuozzo.com X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr 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|23010399003|376014|52116014|18002099003|22082099003|5113699003|56012099006|10067099003|6133799003|38350700014; X-Microsoft-Antispam-Message-Info: mvPH1x/ke8EdgwV3/7EYZdGaDJ39oxSiMUbHGnu5MXvdA1IWRqKBme/2ideVC9f1yN8Zbfq7VMoCdwiTyvz9uJY+l0K7VIZkGf/peUTFFHXfsZ6T5CiOBGCKDfB7SaZQfGRRwWLZKwgKf1tgxuwF4K6UFc1zdGvuOMsyCrjGQpuUi1+yYIhj+6VBnO8bCuNiyV/ELGyyqjfJ56VX6nL2tHg6n9Q666yq5+LQzlbQhMvg31bcQSdlNlT1yiyD/aKg36/5ay1T83mVsqv4llAGhryepPp/Z+wx2dGZIhr+0t9uZcZt8zzTjzquLdgOefK6AQKg8hUIGUKztt2ZCvg6rH9ORb3rxFOI8mNGVbyCl93/UEigkYJVOkHTqXazz/VRBxaE2SPBbqMSXkUUDfuE8ki/bl8YkInDPSlW6bsEn1+uVetvANEzZlllNNEzdan4jonSubio42MShPQYI6BxKCqMJIJG/QQs8fyJUkJ03KUlcXSdrt/7P2nXq7U5xaW+xPR7qMG66c8qbnjqsiupmZoFC/U/JpPn3Hony5kX4GSH6Q+n5GAVVhqU5r+gZiYdmUeHKPKTrD76r1mhQ1nG+YEWy/s77gD1czamvw1uKR2BIHvGm9X1DuJUJLUKFte9T6fZFHPqwDxjPB4J7fyD5zwBCmiY2AqW2VVPzzGxY6Bm2pnaQ3RONySXVNSKy0lNa8iwn9pEMXvXcmjuEuFB7WcrNy+g4o9dAvNedINqMvs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DBBPR08MB10650.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(23010399003)(376014)(52116014)(18002099003)(22082099003)(5113699003)(56012099006)(10067099003)(6133799003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?pDgBgpi9bmfnAL99YI/vuDkuZeYJIOlJp1gfQu5k3kUvNu8OMvJdowyx/RFJ?= =?us-ascii?Q?AIupozTCiSlr0S0X2NNKR5CC5CfPorGeIicPQKXaex8/MQAGF++g8OPpg0/k?= =?us-ascii?Q?eqARGaoWSRgs1eDVqqBW8drTztr8Eb6WMe+V36Bx0YWZl0t4aVQLiODtG2Ix?= =?us-ascii?Q?PcuXzq2rriFI/+J3QP44OBA7dJli+foerExlR0i3FM9MiUXAbL77iv4vhOjd?= =?us-ascii?Q?OqX1RgERxa1pSABpdT0EQKFgLRmtpp5v/mT2Zzfo55THuDVyGeS0TpG3EO7k?= =?us-ascii?Q?+HLJrVLi3ZQpcG1DfY/TtutQQ94ewj5ttxS6Kjb8l+8z0bOFvsEWJTWuz9PT?= =?us-ascii?Q?WkyuQha/vixqKMV9DJ2xpcg7FfFuH87a3JIsml7bycT6kAo1+blHxPAnhi+l?= =?us-ascii?Q?sbT08DEi4UR/TFSzIObhoGXX45Q29t+iB3wndLJ2Rq3yg42vWbDZZ5Iwt88s?= =?us-ascii?Q?ZquPih7t3t969IT73DWQ+FiW9HOmgCAqyHRmhaQw0BGd2T92M5l6OQOHgSQY?= =?us-ascii?Q?WKdmwjsX2wEc1e6obORJhyihW8SQvjs+Rnm4THwHq6XfW+4289f7n8XrwsT4?= =?us-ascii?Q?1R+Rzu47qHcrWVqykI4FfH7aE4/BfZGK5wRv8KatxjBNj5bSVZCoyDCISqEQ?= =?us-ascii?Q?Ab1iA7TXkgGkba0p5v0q1wFNkRJp1lOkBoIGaB7EBAA+gF3nfipZxMu/jrth?= =?us-ascii?Q?s11VLddARup+Cgysi01Z43DPf8dHT1QnvGWiliDEGgU2j3DrYVJUH9doh6se?= =?us-ascii?Q?rTqZ/hQDro/lkv2dRwxdUQNGgBRLe9E4BErUc9EoSNXqnedpHquHzIQMEXW4?= =?us-ascii?Q?kDFLYzYCw4sAfDxGu9tdXiow1hfykPnMM5EuVgOfHX6sorlI2P20wuD70+yk?= =?us-ascii?Q?Xl1xXHZsbFeb4is4OQkkR+NM1SnQakVDV2suY9Llxl/189De6/vW8di075sv?= =?us-ascii?Q?2rgTUN8LNRbPsGOJidfqxIRcSiluR1eh7XttgDPvKzUxelsoLX7sHsX7mAH7?= =?us-ascii?Q?zA479mtySucs3fzbZ/YLXdCwfIx2YzEPMAqrkhWJFRpVBGvetRPrthOCszXz?= =?us-ascii?Q?P1y5RMcPpnet+GAbsce9pNnsUkFC3gMFR+R1qGgOlxz0Rw6kq1aVpKShDiWH?= =?us-ascii?Q?hAf/QVh/FT5ts7rljqammT9v5uninQLodkOe56+KqP0WtAgSdlfa5yLaRMpy?= =?us-ascii?Q?dZOhxCd+Q87wG03BHchR8CO1yA4y4DvZCuBc+SRHqZyOUjaIDClxWJYbVRAN?= =?us-ascii?Q?Up4S6Ldqmv82vfN3Bj6DLLh2shBeIwDKVQzDB6mzTKAE9w/y3rhqyGT8By6P?= =?us-ascii?Q?6+uwa0zzoeVa/GNYHvpKQMX+ORNo4+fpJvv8to2qqzGAeOKjCik4CHDg7L23?= =?us-ascii?Q?J00RIs5UKwZvMZc6bQbhIabem872uZ0VvwI9UcVmZqwrDlVXshGZ0qWUyEVw?= =?us-ascii?Q?C3PXoBH0hgFdsFAV4ARYVgN2AETXARpFfi7OMOJ05wJvWNAeiRBTOrC3qhIW?= =?us-ascii?Q?lbjcd3BCarKuze7xdRX+0GFvdRph7SCWUiJ2uLgMyu66ai+tSZjYOLCXXnGt?= =?us-ascii?Q?9YCrWnIDy41AV726VafYlVp/9QoI/VFScaHbNAAj82m5cRA8W3btE5qQtyhQ?= =?us-ascii?Q?iunO+xGMfu5p76uQTFM9FnZZlku/Ckou3DF49Som1JqSJrbUKQCOUeGFWYYP?= =?us-ascii?Q?ZPfpMmaGBQlslDANeBwLjtLeSFgdNmm6YZkq//RRnXijHDnWOvqxdPTKyqLn?= =?us-ascii?Q?gLAtuv0FcwvzIsWY5pzgjfKxYVwDjlE=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8cd74d5-0b2b-4bfe-581a-08df0ab76af2 X-MS-Exchange-CrossTenant-AuthSource: DBBPR08MB10650.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2026 19:05:00.1164 (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: 34kkXtdXjM8PUB1ZtNpATxP1jZoaJlbA03lWRwpmoYSeMUXxE+2BHze4xT1Q2T1xoL4YQiM7YnrbraHGtSqvT7EdJuQ/8aU4YjcTkIdw9ds= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5756 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