Linux USB
 help / color / mirror / Atom feed
From: Michal Pecio <michal.pecio@gmail.com>
To: Mathias Nyman <mathias.nyman@linux.intel.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 10:26:04 +0200	[thread overview]
Message-ID: <20260807102604.5f649db2.michal.pecio@gmail.com> (raw)
In-Reply-To: <e3c66325-0291-40f9-a87e-1bb337ce4427@linux.intel.com>

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:

 * 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.
Class driver is aware of this and expected to consider the submission
a new stream. If it wishes to continue the stream that underrun, its
last chance is to submit from completion, when the queue is "active":

 * If the flag is not set and the queue is active then the URB is
 * always assigned to the next slot in the schedule following the end
 * of the endpoint's previous URB, even if that slot is in the past.

These rules were straightforward with synchronous giveback in IRQ.
To deal with BH, the following was done for ehci-hcd:

c7ccde6eac6d USB: see if URB comes from a completion handler
46c73d1d3ebc USB: EHCI: handle isochronous underruns with tasklets

Dylan Robinson correctly noted that this doesn't cover submissions
from other code while the completion is still waiting in the BH queue.
But that's a USB subsystem bug affecting ehci-hcd too, and IDK if any
in-tree driver cares. (It might be that no one knows that they care).

> Lets take the underrun case. Audio playback as an relatable example.

It was my impression while testing this that snd-usb-audio handles
playback underrun during synchronized duplex operation without cycling
through altsetting zero or unlinking playback URBs (none are left), so
it could possibly be affected.

It's also possible that the only effect would be wasting a few ms
to resubmit URBs until it catches up with MFINDEX. But then, another
concern of users was to recover from glitches as fast as possible.

Regards,
Michal

  reply	other threads:[~2026-08-07  8:26 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 [this message]
2026-08-07 11:10                                                 ` Mathias Nyman
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=20260807102604.5f649db2.michal.pecio@gmail.com \
    --to=michal.pecio@gmail.com \
    --cc=dylan_robinson@motu.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=mathias.nyman@linux.intel.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