From: Michal Pecio <michal.pecio@gmail.com>
To: Mathias Nyman <mathias.nyman@linux.intel.com>
Cc: Mathias Nyman <mathias.nyman@intel.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/3] usb: xhci: Simplify moving HW Dequeue Pointer past cancelled TDs
Date: Fri, 29 May 2026 12:53:18 +0200 [thread overview]
Message-ID: <20260529125318.611b2625.michal.pecio@gmail.com> (raw)
In-Reply-To: <b82f9543-2730-48af-81e8-1612b0d30ed9@linux.intel.com>
On Tue, 25 Feb 2025 16:55:49 +0200, Mathias Nyman wrote:
> On 25.2.2025 13.59, Michal Pecio wrote:
> > xhci_move_dequeue_past_td() uses a relatively complex and inefficient
> > procedure to find new dequeue position after the cancelled TD.
> >
> > Replace it with a simpler function which moves dequeue immediately to
> > the first pending TD, or to enqueue if the ring is empty.
> >
> > The outcome should be basically equivalent, because we only clear xHC
> > cache if it stopped or halted on some cancelled TD and moving past the
> > TD effectively means moving to the first remaining TD, if any.
>
> This new way relies on td_list being in sync and up to date.
> i.e. hardware dequeue can't be ahead of first TD in list.
>
> One bad scenario could be something like:
>
> class driver queues TD1
> class driver queues TD2
> Class driver cancels TD2, queue stop endpoint command
> (Class driver cancels TD1) (optional)
>
> xHC hardware just completed TD1 and stop endpoint command at the same time,
> xHC hw may have advanced the hw dequeue to TD2, write event for stop endpoint command, and
> then write transfer event for TD1 completion. (xHC hardware may do things in odd order)
Hi,
I noticed that your xhci repository now contains a very similar patch.
The same problem seems to still apply.
I would say that the HW writing TD1 completion event after TD2 stopped
event would be a blatant spec violation and I don't recall seeing it
happen, but there is also a possibility that TD1 generates no event at
all or the event is missed due to a bug (no IOC, broken HW, whatever).
Then we could make things works by rewinding back to TD1.
A safer approach could be to retain the 'td' argument and use td->next
instead of list_first_entry(td_list).
Today we also have the dma_in_range() technology, so an efficient check
can be performed whether hw_dequeue lies between td->next and enqueue.
In such case something is clearly wrong and Set Deq seems unnecessary.
And one more problem: unconditionally advancing enqueue past a link TRB
creates risk that enqueue will enter deq_seg if the queued command
fails, which breaks ring expansion later. If we care...
Regards,
Michal
next prev parent reply other threads:[~2026-05-29 10:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-25 11:57 [PATCH v2 0/3] xhci: ring queuing cleanups plus a quirk Michal Pecio
2025-02-25 11:58 ` [PATCH v2 1/3] usb: xhci: Apply the link chain quirk on NEC isoc endpoints Michal Pecio
2025-02-25 11:59 ` [PATCH v2 2/3] usb: xhci: Simplify moving HW Dequeue Pointer past cancelled TDs Michal Pecio
2025-02-25 14:55 ` Mathias Nyman
2025-02-25 22:17 ` Michał Pecio
2026-05-29 10:53 ` Michal Pecio [this message]
2026-06-01 10:45 ` Mathias Nyman
2025-02-25 12:00 ` [PATCH v2 3/3] usb: xhci: Unify duplicate inc_enq() code Michal Pecio
2025-02-26 12:39 ` [PATCH v2 0/3] xhci: ring queuing cleanups plus a quirk Mathias Nyman
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=20260529125318.611b2625.michal.pecio@gmail.com \
--to=michal.pecio@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=mathias.nyman@linux.intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.