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 4E28C803C4 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=JR+SO1M9UAXl0ayKJ2QF8Vd4EBOUfTn8us8KXgXdkfIhVFFpy6HU5jRjhiQxWiqMM5bx3GOEloTqZ45qxY2LXIdscYhLBo/Ho/cgUgrY10AAzrNOnZWfBk2auMruTdq5viROU+zFNpX5jD85whIGeejBkECu7VGbnhDQei8XdUSkPQXQ5BNVnAMH4frBV8aeey7FwJOFaAw7AIdkx8FVqqOzdFOn1BXS+I1n4tJm4h741kfhszKDp2qoV6WOdd9x6k2XzozATL58mAfiaaiD4MvP95lKCh/zn8pjeNZY18xBlrIdEK0hS0ADsCSGPk4CkyWnsHM25hV0pXlAqwOJRQ== 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=zr1ejpD0QTxsZLTDK+zfPTy+jfhL8eLdXeqXkF7vOnE=; b=I8ocd6/502y4H+CxNgV7l+dN3cSEAwbzE0MhpPG7e53EzB4NgACz7Y4LSyl4LEZftD32N6JtIwX3pwK+UbZxK8psBEKK1NrqZhD1MbSlOqbpXz8CvUtwd8SLXSoDe/233jS28Q5w1B6vt+hPTaaTsHlIxo0Y/i1JsWM0dNn+K0jI37OBUTd9JVufrrYYDNfzfRagl89pj52hLG+3pEl3/htCJ6hWqGKdlZ4CY3HaG4At4yU2yUOIwi5SlbnwJdGMfYGocyuNdMujmKr3izAqwMW2rGCb7F17Xc5LVtBgPEuN8/NWRKMgqw3mwTzykHDgHgVwu/9JDi5hZMHhyUB5Qw== 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=zr1ejpD0QTxsZLTDK+zfPTy+jfhL8eLdXeqXkF7vOnE=; b=Ez9G1z2JCPQBxyt/L7wHHKriHwkLLdrKJ875rs3SzzAsLJA2c+6fzOn63M/rOu0v4JDbOzBqwVZh5QDqugcjZMigOTZYpUshOp9/V3BufgUVML4IkicF5jkv83mi5kwRnxz9fy88Re5Ye5V1ykv0Odq2au+RAv1FHD7oJI/xepn9asti7r3tcnKDMSKWe6J3HeeUMIkxd0WBT2vr2/6WV+MfBVaa3Jcs7Pa4ZYNLIy7s/lOIwLTwNsS991KaLJ+wkNjtjDXyEcYYBZHTNGwe0A7bgDIwXMpfD53z9OIaiL29OcceBKa7q3OcPsMQIh6ykoafcJUsgsGH25r0ukKjVw== 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:05 +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:05 +0000 From: Andrey Drobyshev To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [QEMU HCI-8.0 PATCH v2 12/13] hcd-xhci: resync isochronous endpoints after CPR #VSTOR-137800 Date: Fri, 4 Sep 2026 22:04:42 +0300 Message-ID: <20260904190443.795902-13-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: 6d3bc874-8d2d-4571-ac54-08df0ab76bd2 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|38350700014; X-Microsoft-Antispam-Message-Info: nIAIjLS7Zd2ftf4vCTw4Y9m9HxHmpTOBltmIZvMq2LnmuqLEWLtqxmSwsU34m0CdPZ0CGfu8wNIujVLeTYAiUP0O+3viLKUWXeQnsDw+Vy3I5hWFz6fzTEzQ2KmokzfctrhtdymMZCecgOwhURfUFoTsmNtbonCKffDJTzEcqbkGTZ5TLlUwpiDpZY/kg3KNGUmxo6ZGb/sBULGeZo29eWKWW5aGGaIfBwXVRxe0F9XjGMBt8HCL7XGykCO9bFuK37OIR9QLRKd/mZ3kEBurjmXOjtWH2qk6f/PDY4JV7po37R8PEAu0J6ayz1gytGcu0o0ly9e9OzlgHaPLR9PgWGxeZFkvMJw1nVhQ44ws78Bi4Ey8W1yQmgWnJJdm7xKaC7dQwFy7CkV8Tz/VQXLwURHtHp2KTYVXY1PTZXCCCmMXcufI6pW5PdcqXVli6dUqJasClzmY1ZsvABw2U1oa/MmTqstxHiaC5T/91yOYfpcQ0DyzPgB3hJWkuFEsViSJiY8HhncysLoryrIhMRo8RlDN3zwBzkMSllf/Lc28HRBSKVPUq5A7UbEDJJ0CdgkfWcIyFjAGp+/LnHQ9TTgzs7WZ9zf3kDT44mF7bmx0v7HyO/hGhn9KKE6Yfj/WQvEoqiJ/jiwMamzS2mvCHzaXxu8tVlZBQ+WdZlAHXMzBpjCryZoRSV3Bb6O0+BpJ+cf8WIEUq5AdOjmCjpZ2QzAVUv4PlSW1U9qVd4thSxzoRnk= 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)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xgYTKCW8RFNQwz7VJTwmUm8ViY/hPlmm9aXEc6bNi/RCN8BOSG9dydQJPz1s?= =?us-ascii?Q?X7LwxkGOoCRfdrZf+JWPBOlkNkd7hMC5xllgzN0u0LWITvL5jqct/wkjz3ti?= =?us-ascii?Q?fqRBrRhOjV+cBnwc9VaNNDZmRoVgDs0yzX0fxKTlmnixhOYZjcwEr7LASRt2?= =?us-ascii?Q?OB5vbwJC4oRRmTtJL7dB6oJO8iBEStYmyfPzaHn7pv65Dg5ZCIfKErUsQ6ft?= =?us-ascii?Q?coCe+T9pmNNKYYPf83pBq7Iq0D7zqY3ot8vfIJW5qcsBVyhD87j2vk5nOLuw?= =?us-ascii?Q?deyTRS+Eh1BQYF92stGbZdRqDzKKa4DntAOKHQ3QAGYy0IT+ArPeC9iM2T27?= =?us-ascii?Q?/YCTRlGVn8HFPW1p0S06I3yLkCULDGV2S5DSKAS0TDkH7fHGAqUxz5hZmGA1?= =?us-ascii?Q?W60fKkewcN3LPbGyrVwXF3GGmWph1zkgmzfEm/fVoarI3S5gt385eFmFF/jv?= =?us-ascii?Q?45CLkz9clVB96F6JR2HcvivecZ3EY2HuJNku7DkiLe5MdGqofxc4iCn5XAQ/?= =?us-ascii?Q?tpAYstCrRKbZL6qYTHSb/MFz1LonvY3IDU/2Mabl8Mw/1cljmKeVq3BVvUp6?= =?us-ascii?Q?DrqSLukAixf2/Ta7aii3en3lhfLk97NL9IXxCAG/sfvOpvqGskKqdx3LBsS0?= =?us-ascii?Q?3UtaDOMeaIvqJO1OW1gJLmIyMntIGAzT5EfJMoDjESpG91RbUDS01oxC/fAD?= =?us-ascii?Q?0MG4HNeGKV0Wzj0ytvRv7R/wQnnssO1vy3pK1qk7EEmDrfZ1Mu5346mpKnyP?= =?us-ascii?Q?5VL3oGowHVvnLBhk6B0sPkbOPuKf6VOjytHXbPWcx189rG4Yt0BeW1RC0QFf?= =?us-ascii?Q?psCq0aLhDaCtXSr/qdbsHfRkVpNJefDmlgoBFGH02pd6NRvyB08iNuF8BFSN?= =?us-ascii?Q?Yr8TIV1mrDRrJ7/0L+p3x3N7NuNE38a1FDMZDC1N9eNhfAP0Pa8iTYzBZ0eC?= =?us-ascii?Q?NI6KwTfZjrEkPj0S5lvAx5rJuITmBYCb1iftwSohxfhGpMiDc8NjKiDygrT8?= =?us-ascii?Q?0bFkhTeH3OO28/owfHHV0QbbFI9z2VCjWnQCB4kH8xPHhNCslSotJfqcaaTQ?= =?us-ascii?Q?95jk9gS9wGUF1gFYyPVwfqg4SLV1wSr1RCnKjZxtmh+ovOnhbhnlkiLNgbGG?= =?us-ascii?Q?dFKMIfa9V/Udwgi8GptZiuPwuRKnMow61H8qDIQoRBhVuxLKlYUW1a2v7orx?= =?us-ascii?Q?j9FbCzoIPPn7nzrcwsSuUdV0FyRs15k+Y+JDLDr1H1JvJx8PMs/BA2MGhqp9?= =?us-ascii?Q?wX+ZuJ6Li97awgNi5VhgOg2oJmHbjKI78XDNtAXvRQAKuSpNlQogbJHVL033?= =?us-ascii?Q?6hM7d0iug7Y4TO+P1OHjNqObPPhkL9iv2DY+B8in1d+ovORO8FpEyOm0wvbN?= =?us-ascii?Q?Z9lzQiFjguc/Mr3O2+P9NO1YyC6uVrvs+ZIJVpZzbbysO2UGoynpr2/NqJip?= =?us-ascii?Q?NI7denXDREVMtricICpZ/Rg/PIjMtBP2LUcNi2VMqS3cJEN7fAeekK//7aC8?= =?us-ascii?Q?bjfcTZP+4MQpz7IeHROHGvT2ospNd6ju35O01+eBixm5DQ7xkrJ8TB6ZHpNC?= =?us-ascii?Q?doe0BTYt6od4VJmNrnG0h+nly5o3JADLKy2dYv4XjB9+6WmPlm4fnoCuGvtc?= =?us-ascii?Q?EMU5Crm7cWvJv+K17SNkYdj4tPk+WIvw0+/We+O43WJuUQYKjczLrzKA2eFP?= =?us-ascii?Q?e8K1MVx9LIg72E4TAIXBJbP0MxvkHaVBA7RKzYkgrBI7nZ926DShh3KMAnUz?= =?us-ascii?Q?iqTpwmJ1zVYCaZlzazh2ZpPObQEOYSU=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6d3bc874-8d2d-4571-ac54-08df0ab76bd2 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:01.7384 (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: eTUY3whXXnMdlUK4xyKcA4g/Qkt0EyYbYK3elZdks6WyAY3mj8SI4pwd8q1uSKIQq4XI3+/34+0UkcjI0M7h4GVcVIhOdnXua8S0nFrs6a0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5756 An isochronous endpoint has no retransmission, so the transfer events the controller reports have to line up with the TDs the guest driver is sitting on. Across CPR we rebuild the controller's transient transfer and scheduling state out of guest memory, and it no longer matches what the guest has already consumed - so the very first event after resume lands on the wrong TD and the guest wedges with "not part of TD". Let's report CC_MISSED_SERVICE_ERROR on the first isochronous transfer after a CPR resume, just like a real xHCI does when it misses a service interval. That arms the guest driver's skip logic, and it resyncs to the live stream instead of getting stuck. Signed-off-by: Andrey Drobyshev --- hw/usb/hcd-xhci.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 292c378bfc9..b02e5b4b67f 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -282,6 +282,7 @@ struct XHCIEPContext { unsigned int max_psize; uint32_t state; uint32_t kick_active; + bool cpr_iso_resync; /* resync iso stream on first kick after CPR resume */ /* streams */ unsigned int max_pstreams; @@ -1811,6 +1812,19 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx xfer->pkts = 1; xfer->iso_xfer = true; xfer->timed_xfer = true; + if (epctx->cpr_iso_resync) { + /* + * First iso TD after a CPR resume: our transfer state was + * rebuilt from guest memory and no longer lines up with what + * the guest consumed. Report a missed service, like real HW, + * to kick the driver's skip logic into resyncing. + */ + epctx->cpr_iso_resync = false; + xfer->status = CC_MISSED_SERVICE_ERROR; + xhci_xfer_report(xfer); + xfer->complete = 1; + return 0; + } mfindex = xhci_mfindex_get(xhci); xhci_calc_iso_kick(xhci, xfer, epctx, mfindex); xhci_check_intr_iso_kick(xhci, xfer, epctx, mfindex); @@ -3510,6 +3524,10 @@ static int usb_xhci_post_load(void *opaque, int version_id) xhci_init_epctx(epctx, pctx, ep_ctx); epctx->state = state; if (state == EP_RUNNING) { + if (epctx->type == ET_ISO_IN || epctx->type == ET_ISO_OUT) { + /* only iso streams need resyncing; see xhci_submit() */ + epctx->cpr_iso_resync = true; + } /* kick endpoint after vmload is finished */ timer_mod(epctx->kick_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); } -- 2.47.1