From: Mathias Nyman <mathias.nyman@linux.intel.com>
To: Michal Pecio <michal.pecio@gmail.com>
Cc: dylan_robinson@motu.com, linux-usb@vger.kernel.org,
mathias.nyman@intel.com, stern@rowland.harvard.edu
Subject: Re: [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs
Date: Fri, 7 Aug 2026 14:10:35 +0300 [thread overview]
Message-ID: <310ccfe5-0212-4c8b-9213-891a7340e2f4@linux.intel.com> (raw)
In-Reply-To: <20260807102604.5f649db2.michal.pecio@gmail.com>
On 8/7/26 11:26, Michal Pecio wrote:
> On Fri, 7 Aug 2026 03:07:08 +0300, Mathias Nyman wrote:
>> On 8/7/26 01:01, Michal Pecio wrote:
>>> On Thu, 6 Aug 2026 16:25:15 +0300, Mathias Nyman wrote:
>>>> On 8/6/26 11:17, Michal Pecio wrote:
>>>>> Besides initialization, it's made -1 if and only if xHCI endpoint
>>>>> state isn't Running at the time of submission. This effectively
>>>>> means that to start a new "isoch data flow" aka "stream", class
>>>>> driver must unlink the last remaining URB of the previous flow. If
>>>>> the driver doesn't unlink (or tries too late), the endpoint goes
>>>>> Running-Idle.
>>>>
>>>> If class driver doesn't unlink remaining urbs then list won't be
>>>> empty and you have the exact same situation.
>>>
>>> Obviously not, it can simply stop resubmitting and wait. Or there
>>> may be no URBs left to unlink at all, when recovering from ring
>>> underrun.
>>>
>>> Then HW endpoint state will still be Running, not Stopped, and new
>>> URBs will be scheduled into the past, doomed to complete with
>>> -EXDEV.
>>
>> Isn't this exactly what we want?
>
> This was discussed all the way back in Bugzilla - usb_submit_urb()
> kerneldoc spells out what we want and Alan was clear that it reflects
> what HCDs have been doing for 20 years:
>
I'm doing exactly what kerneldoc and comments in bugzilla state.
If queue empties out we schedule the next TD based on URB_ISO_ASAP flag.
The logic is from Alan's bugzilla comment. I'll quote the beginning here:
"When the queue underruns is exactly when URB_ISO_ASAP is supposed to matter.
If the flag is set in the new URB then that URB should be scheduled for the
first slot in the future, leaving a logical gap in the queue.
If the flag is clear then the new URB is supposed to be scheduled for the slot
that follows the preceding URB, which means that some of its packets will
never be sent because their slots have already expired.
This will still leave a physical gap in the queue, of course -- no way to
avoid that -- but it will maintain the logical alignment of URBs and frames.
Thus by submitting all URBs with URB_ISO_ASAP clear, drivers can help ensure
that the queue remains synchronized to within the limits imposed by the host
controller driver.
If xhci-hcd doesn't behave this way then it should be changed."
So I changed it to behave this way.
> * If the driver is unable to keep up and the queue empties out, the
> * behavior for new submissions is governed by the URB_ISO_ASAP flag.
> * If the flag is set, or if the queue is idle, then the URB is always
> * assigned to the first available (and not yet expired) slot in the
> * endpoint's schedule.
>
> "If the queue is idle" means all completions have already returned.
That's an odd interpretation of "queue is idle"
This would mean that an URB queued after "queue runs out" (underrun)
should always be treated as USB_ISO_ASAP case, making the flag useless.
Isn't it more likely that 'queue is idle' means 'not yet started' than
'class driver intentionally left it to dry out and underrun in order
to later restart it, assuming it will restart ASAP on next URB enqueue
without setting URB_ISO_ASAP flag?'
Thanks
Mathias
next prev parent reply other threads:[~2026-08-07 11:10 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 21:25 [Bug 220748] New: usb: xhci_queue_isoc_tx_prepare ignore start_frame and always assumes URB_ISO_ASAP is set bugzilla-daemon
2025-11-05 8:40 ` [Bug 220748] " bugzilla-daemon
2025-11-05 8:48 ` bugzilla-daemon
2025-11-05 8:53 ` bugzilla-daemon
2025-11-05 9:06 ` bugzilla-daemon
2025-11-05 15:47 ` bugzilla-daemon
2025-11-05 18:28 ` bugzilla-daemon
2025-11-05 18:30 ` bugzilla-daemon
2025-11-05 20:16 ` bugzilla-daemon
2025-11-05 21:18 ` bugzilla-daemon
2025-11-06 3:52 ` bugzilla-daemon
2025-11-06 8:27 ` bugzilla-daemon
2025-11-06 8:35 ` bugzilla-daemon
2025-11-06 15:03 ` bugzilla-daemon
2025-11-08 10:33 ` bugzilla-daemon
2025-11-08 16:09 ` bugzilla-daemon
2025-11-10 10:23 ` bugzilla-daemon
2025-11-10 10:42 ` bugzilla-daemon
2026-05-04 23:53 ` bugzilla-daemon
2026-05-04 23:54 ` bugzilla-daemon
2026-05-05 1:14 ` bugzilla-daemon
2026-05-05 9:59 ` bugzilla-daemon
2026-05-05 17:09 ` bugzilla-daemon
2026-05-05 17:10 ` bugzilla-daemon
2026-05-05 17:10 ` bugzilla-daemon
2026-05-05 17:13 ` bugzilla-daemon
2026-05-06 13:32 ` bugzilla-daemon
2026-05-06 15:03 ` bugzilla-daemon
2026-05-07 2:38 ` Alan Stern
2026-05-07 16:17 ` Dylan Robinson
2026-05-07 17:24 ` Alan Stern
2026-05-07 21:16 ` Dylan Robinson
2026-05-08 3:02 ` Alan Stern
2026-05-08 17:20 ` Dylan Robinson
2026-05-09 1:25 ` Alan Stern
2026-05-09 22:12 ` Michal Pecio
2026-05-10 12:39 ` Dylan Robinson
2026-05-11 19:21 ` [RFT PATCH] xhci: fix frame id calculation for isoc transfer Mathias Nyman
2026-05-11 19:36 ` Mathias Nyman
2026-05-12 9:08 ` Michal Pecio
2026-05-13 14:30 ` Mathias Nyman
2026-05-13 14:35 ` [RFT PATCHv2 1/2] xhci: fix frame id calculation and checks for isoc URBs Mathias Nyman
2026-05-13 14:35 ` [RFT PATCHv2 2/2] xhci: Set frame ID field of isoc TRB when starting an isoch stream Mathias Nyman
2026-05-14 21:16 ` [RFT PATCH] xhci: fix frame id calculation for isoc transfer Dylan Robinson
2026-05-14 22:10 ` Dylan Robinson
2026-05-15 4:32 ` Michal Pecio
2026-05-15 18:13 ` Dylan Robinson
2026-05-18 7:13 ` Michal Pecio
2026-05-21 14:20 ` Dylan Robinson
2026-05-21 15:24 ` Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 2/3] xhci: Set frame ID field of isoc TRB when starting an isoch stream Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 3/3] xhci: tune urb->start_frame in ring overrun and underrun cases Mathias Nyman
2026-05-26 0:49 ` Dylan Robinson
2026-05-26 12:15 ` Michal Pecio
2026-05-27 20:20 ` Dylan Robinson
2026-08-06 8:17 ` [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs Michal Pecio
2026-08-06 13:25 ` Mathias Nyman
2026-08-06 22:01 ` Michal Pecio
2026-08-07 0:07 ` Mathias Nyman
2026-08-07 8:26 ` Michal Pecio
2026-08-07 11:10 ` Mathias Nyman [this message]
2026-08-07 16:48 ` Alan Stern
2026-08-07 17:30 ` Dylan Robinson
2026-08-07 21:29 ` Michal Pecio
2026-08-10 14:12 ` Mathias Nyman
2026-05-07 21:54 ` [Bug 220748] usb: xhci_queue_isoc_tx_prepare ignore start_frame and always assumes URB_ISO_ASAP is set Michal Pecio
2026-05-08 3:09 ` Alan Stern
2026-05-08 9:41 ` Michal Pecio
2026-05-08 14:54 ` Alan Stern
2026-05-08 21:39 ` Dylan Robinson
2026-05-09 11:10 ` Michal Pecio
2026-05-09 20:18 ` Dylan Robinson
2026-05-11 19:15 ` bugzilla-daemon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=310ccfe5-0212-4c8b-9213-891a7340e2f4@linux.intel.com \
--to=mathias.nyman@linux.intel.com \
--cc=dylan_robinson@motu.com \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=michal.pecio@gmail.com \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox