From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023137.outbound.protection.outlook.com [40.107.159.137]) by lore.virtuozzo.com (Postfix) with ESMTPS id EFE09802A7 for ; Tue, 6 Oct 2026 15:36:06 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pudMdS4fBgPnwOK+sDhVRAquw0VyFW1xjnXznVsJWZj9AizPiR9uo5A2fimLJhvhg+tYqP8PlcWRO5taVn5jQtq1HRkrIGhlXEXCiC3o5V322igFn4em/wRYZPLYTyTIAkcLQheixzwS0tWDiHmt+VQ0r/a0kMtg0x3QFz7tG6eLttPz6XxP46nvFSHMladv7/PWD3QUCHLe6iBIIHO/V4Zf5JfyuYv1yI9XjSZ66yh7ZDRztV91q0Gl4rO0N4dGy9aazdzOvEMJexeb4gZL7VEZjDw357168CFR2r4EMIbF6VvtiaBNO3xFJvEQ3T11uw1cNMWy5ZAIzLASJ1GJ8w== 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=UA6zzParMrRCxeVb3ead8YWHTgH7al7yfiz83iT6Opg=; b=cDPRh9yacSyAUW47nFMXRCmxlJbBEdFaOliMeKhSbHwCo/LkSSNx3UPyT61jf/xIaALLaCnzjYkZVwRbnL9k9Fp2aEf6iCJGmyMi0Iiq2SlM4L0VqiGD23XTiWiGBDDwuxhd7V0jXn/O5QWIkYKWDF05PvYD+sWH7t2BC8PNxh7mHBsp+UfpzksPek2gU1PGM6odo6bylKwa50OexEC65CQrGqCJM8KQSGo3udHzqW/nFv73B6deE6uPNnkz1KNvWjSKkWU6noOWYh0cjrnM/V48NEpHOvStyc1+ZifCIqnYXTp6xH6eQ76+eEqV7S+USTnCNC0eNQZ77jNjR2tcxg== 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=UA6zzParMrRCxeVb3ead8YWHTgH7al7yfiz83iT6Opg=; b=bUtHu8FhkSJ7aqch5HZjnwXsdzSmuFricSSSSissatPknfq1wRCaMl9Ew1GFrGph20lleiyKtrMuwx03/O8/SinWzeuBfY4BTPaUMZbYTVscM5MEktoIkTWBL0Vgl+7gkpDKDuRIpvGH3XP1ExoODoJWx/weCEJ9Ab5oqYD+MTXbEfqK94eVqCt4PBmX3cm9JsVD360URjDhXog+EQ/igU+FoC1dgHjqNSFvCe1yWHNCr6ckG594FFIsFo6/QjxL+bSg1fOIjqv/toasibYZuEvepf3CdWz7ceQDG9G6Ktwb4qZAUxGcOgIws15/W3E9Jhnqjdwz7Qd16SGqWuWqnw== 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 DB9PR08MB7699.eurprd08.prod.outlook.com (2603:10a6:10:392::22) 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:03 +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:03 +0000 From: Andrey Drobyshev Date: Tue, 06 Oct 2026 18:36:04 +0300 Subject: [PATCH QEMU HCI-8.0 v7 13/14] hcd-xhci: resync isochronous endpoints after CPR #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261006-usb-host_v3-v7-13-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_|DB9PR08MB7699:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f725942-c0ef-40b0-f4f0-08df23bf863a 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|52116014|376014|23010399003|1800799024|366016|5113699003|10067099003|22082099003|18002099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: puiIU+/Berw0Yg4xdt6jmmbTKHfGSHtRTRFqR3pWNXmeDeoXxI6D0jzZu4hp5o5U6fGNJ3F4qWn4MfdlakTOnkPrSPziejy1JqGZe3ST+QFSB53cfxn2YgC8y6zZsIzM3zl6abZkz5kWCvnubUXo0g/BW4PPDRWf5fciHv+OUbdOzcav5cCSIq98C2l248mrpfJqwuVs+wZHkJWswEkn1k0nWbdooatCpHeyXQAddRgazfrC0RY5bTuz3wE/4+XIyIbkOMtbPy5lpPdqf6r1zs5EVwMJRYiTnlMon3ILXnJWRq0dgnJWckO+ZrhoXF85pWBZtWn0L3tS2pbclAzvjnK0lq8ENC2yyIjUYn/J5Nox/1XRsBlybeOgAHSlORaez+uJFj+5FQU+bXZ4iboMjpkAf9XGnIloqxgfFGr9lT+wa5hp6i2hMiqG2VRNr7vzEiSamVubdYfm6SBkMUWp6wSB0odsEVrumYe3+yb4EQZu4QzN3Mt27/19OiS3qpBZwX6P9vWvZ6H4q9pPDRWUUGRN+9J9ByyX1KOPEuBpGGOBRyXTVzYD0AUip0PssrF/7TBYyXLT5/139zoay3TFzcAenRE2e21zJjfWNyYPEFcErcqO35+VX4oqCsbqiSgeuF5Qi73GHb+Lje5yL4uLJg3NM/wlIQkJFpUyMDkaKhQKSJEFV9WNtc6BEP3gMlR7HjEEAjr7VOyRBiFwl8ms6XTM5or7JhYyzDa/ddU14hk= 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)(5113699003)(10067099003)(22082099003)(18002099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VGpsbFpTaWNmSDdOaGI3SDdhTEU1KytsRXJ1Ynh6bXRmRWcwbWdMSmlJbkJj?= =?utf-8?B?R0lzMnFBYjZiT0NYVkR0anZiOEpsUGFKaG1aUmlVeHA2akIwTEx1cElsZysv?= =?utf-8?B?WVpHWDRXNHBSL1c4TWhQeHJjTG1Pb0w2NFNRT3VTaGZyeDh2czhHcmJ5a05N?= =?utf-8?B?TUUyZEhIZ09PckNMS0ZNT1hGbDN3RDJESDZYZFYyT254UGIxM2hXK0gvYWtw?= =?utf-8?B?ajNiYXBJNGNMQzRkeitXdmZscU1hSUxkcVVpV1RxRUprbWR0M1NnWFJWSmNq?= =?utf-8?B?S3FzSzVFQzkvUjA0bEluY3VmYVAxVnZGOHN2UVhoejBDeVFJWDVnRUpnS3NN?= =?utf-8?B?cEVwanp2Wm42U3FKSFhSL1MwaEZTMTVlMkhWeFoxK1RodDMyc1BOK1c4a2tx?= =?utf-8?B?c3BSKzJUaGt2WCt5S0ZyTnJVYXpXbUVJVWNLYVBPYnI4bkFIN29DOWVaTk5P?= =?utf-8?B?VktvMlJnbjRldnJvZkExVDU3VUI3TTlHMnducFB3cHRUaUw2RjZMSUMrTnRS?= =?utf-8?B?SFhqQ2NTOHppL1JndUF5QzZ6cm16YkJNd0p4V3lVTHVpTEd3UEErc1JqY0Rt?= =?utf-8?B?YlFhb2hMYVRlc2hRUlRWV1lvOTJSQTVYTUJoUFJTSzBsRkxDZGtqNHpmM3BT?= =?utf-8?B?YjhMMFlLbG5Vak8wTkZNK0JBMzE4bW5rVVdLeERIZExzT25XcmRPdStYMDhY?= =?utf-8?B?TlVmbzlOTml0NXE5dlJ3cnhKd3pCM1NHeWRES1ArcmQ5cTdObE84MFBCOUtk?= =?utf-8?B?TncrTTNEbzZORVpZNnRyR2V0VzJoaG9yZ1paaE5yMHVkaVk2amRTb3J0TFlR?= =?utf-8?B?L0lubExJRkJMYmdFaFFuM0JRYnliK0dmbGZ2SDJobU4rYUdzeGFZSS92QWxW?= =?utf-8?B?cFg5K3R4aFI0UUkrcFdzUHdrNHA3QVhLbW5hNzJyUWhSdlFLN3lSaVdaQnVC?= =?utf-8?B?QThHbXEvN1I2Wkg2ZXBmbHNySGVGYjBRcWNHQXExOWYrdGtyMTZ3TW1PZUZn?= =?utf-8?B?YnUvYVliQVlZNU4yVjhhT0NnNEVRR3RGeUREcnJSb1NGM3VRa2xML2Y3M0F1?= =?utf-8?B?NkM3OFgrUE16eUNrT2MrY1NvWmxTdU50TEJGclpJRk1SYno2ODNzVmlpVnBE?= =?utf-8?B?SDZKT2Z1R2prZ3BVcDBCRzdocWFwSGUzR2RCbFNLVmR5aUcxbktxd2JhNFY1?= =?utf-8?B?MGtVSlRDRFlBRHNZUW9HNklaN2FKMkh2N2xtTVpQUVM2UmF4QjhyWEFnb0tP?= =?utf-8?B?dHA3SUpxcDFlbzJQRzB2Qm8vL29pbUFmNG51ZU5DUDF5NUNmaitzeVFLZysr?= =?utf-8?B?cVBUNG4rYWZZTEtodXhvSnBmdDJaeVpsQzh2OTU5ellUeTBYMVpYK3lvdnMx?= =?utf-8?B?b1B0SlNIQ2UrZzFRVGNOcFM0MnFBa2JGNU8rbnBxZUVVK1FEb1NuZDgrOGxs?= =?utf-8?B?UHZQcVhrRWlXY1hmQkp3dHB4L2RVUFRwa1pFWGdHbjduL2FHdTRyQ2M4RzFu?= =?utf-8?B?UGlpSmJKRGNlTU9LQmxJZEtzdTBhYTRHaU8vSHJXMDhESDhOSlgrK2tWZmpW?= =?utf-8?B?aW9QZWorQ1VVbUJhSUdaNS8ySWpndnkycmFRM2hSVDdYSS9RS0d4bTVUQTdZ?= =?utf-8?B?enBOQkp0d0NocERSbTJPbmV1T09HeEgxdW5kck10dk1NNkhWM3BtQXVyYW5T?= =?utf-8?B?K2lnNjJYZXRpYzkrSTRWV0p5d0krdXEwaExZcG9BT1gvRjdjUzlJV1R1dVdn?= =?utf-8?B?dUpUWjNHOHl0Zm14QmtJOHozd0k0R3FwOUh0RStiNVVqMlhydk8vckZjcXVE?= =?utf-8?B?VlNXSXZSQjlSRkVWd1JhSWxMRktkV0FicndZOCs1T3djKzN2QU1PTTlCQUxy?= =?utf-8?B?V0RqRGk4M2tKSmdqOGVld2FpbkRBT2pjYVUxWUUyYkw0UTFtNlIvVVFTNTNB?= =?utf-8?B?SzhYS0NscGtmM3N1YVQybzgyRm55NGdJM3Q2SGxHUzI2ZnRoeVk3UmZxS1lr?= =?utf-8?B?aDhVbEljRG5oNGdWNmd2UkhNcGwvRk1vMXN6eXBOVWlYVVFIaEl2d1M4Tjdt?= =?utf-8?B?UGlkVW5yQ2sxd0p0Q2lJelAwNTl2alVISXUwUXFFV0c0M2dHU1lOc2ZwS2Zw?= =?utf-8?B?VERMRnUvY3NNWHplRHJqeUNBUE1wQzd5dk9NTXY4bzk5WjRPcS9VTmhnTkRY?= =?utf-8?B?ZWpDWHQyL3dqejA4VWgvZzVhNk1rUmFTb0N3MGZFcWswUjZjSFZJcXdMbmR5?= =?utf-8?B?dGdQNGJzNFNVMmVKdHFVc1oyc3lCQTlOQ1B5bTAxS0dsWUU0TFppQmpVMFZw?= =?utf-8?B?bjY3UFNxeFE1VFZNQVFlZG8veHVnV0ExZC9ta05ONkJOajNEeGY4cDFiZk45?= =?utf-8?Q?dlcfmiuINBhRSUoM=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9f725942-c0ef-40b0-f4f0-08df23bf863a 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.8880 (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: yziGm3VaTm3BFafdZnQC4mpckGNv7atDOkarFuzD3HdypmseGkgLy9DTbOJ5w6i040i/Ct6SwIYC1w99pUV5b0yM5Mhc2jpPXTIhJT5e5VM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB7699 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 | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 292c378bfc9..421494fc379 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -25,6 +25,7 @@ #include "qemu/module.h" #include "qemu/queue.h" #include "migration/vmstate.h" +#include "migration/cpr.h" #include "hw/qdev-properties.h" #include "trace.h" #include "qapi/error.h" @@ -282,6 +283,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; @@ -1047,6 +1049,11 @@ static void xhci_set_ep_state(XHCIState *xhci, XHCIEPContext *epctx, ctx[0] &= ~EP_STATE_MASK; ctx[0] |= state; + if (state != EP_RUNNING) { + /* a stop/reset before the first kick ends the post-CPR resync window */ + epctx->cpr_iso_resync = false; + } + /* update ring dequeue ptr */ if (epctx->nr_pstreams) { if (sctx != NULL) { @@ -1811,6 +1818,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 +3530,11 @@ 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 (cpr_is_incoming() && + (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