Linux USB
 help / color / mirror / Atom feed
From: David Laight <David.Laight@ACULAB.COM>
To: 'Alan Stern' <stern@rowland.harvard.edu>,
	Oliver Neukum <oneukum@suse.com>
Cc: "gregKH@linuxfoundation.org" <gregKH@linuxfoundation.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>
Subject: UAS: fix alignment of scatter/gather segments
Date: Tue, 30 Apr 2019 09:16:21 +0000	[thread overview]
Message-ID: <734e89837b454acea32b990fa2aff902@AcuMS.aculab.com> (raw)

From: Alan Stern
> Sent: 29 April 2019 18:55
> On Mon, 29 Apr 2019, Oliver Neukum wrote:
> 
> > On Mo, 2019-04-29 at 12:08 -0400, Alan Stern wrote:
> > > On Mon, 29 Apr 2019, Oliver Neukum wrote:
> > >
> > > > On Mo, 2019-04-29 at 15:06 +0000, David Laight wrote:
> > >
> > > > But the statement the old comment made are no longer correct.
> > >
> > > Perhaps David would be satisfied if the comment were changed to say
> > > that _some_ USB controller drivers have this unusual alignment
> > > requirement.
> >
> > It would seem to me that every controller that does not do
> > scatter/gather has this requirement. In other words, this is
> > the true requirement of USB. It does not come from the
> > controller. It comes from the protocol's need to not
> > send a short package.

The hardware requirement is that packets that need to be joined
together to make a long request must be 'full'.
In many cases this means a zero length packet must be sent to
correctly terminate a request that is a multiple of the packet size.
Since the software has to add the zero length packet there is
no real difference between a single scatter-gather transmit and
multiple single packet trnasmits.

For USB2 bulk transfers the packet size is 512, and for USB3 1024.
The old comment suggested 2048 for some unsupported interface.

> Are you sure that xHCI has this requirement?  I haven't checked the
> spec.  I know that UHCI, OHCI, and EHCI do need this alignment (and
> OHCI and EHCI do in fact have hardware support for scatter-gather).
> 
> More precisely, what matters is whether the controller is able to merge
> two different DMA segments into a single packet.  UHCI can't.  OHCI and
> EHCI can, but only if the first segment ends at a page boundary and the
> second begins at a page boundary -- it's easier just to say that the
> segments have to be maxpacket-aligned.

XHCI (for USB2 or USB3) can handle almost arbitrary fragments.
There are a couple of annoying restrictions (IIRC):
- Fragments cannot cross a 64k boundary.
  (How much would it cost the hardware to have a 32bit (or even 64bit)
  counter.)
- The 'Link TRB' between ring segments must be aligned to a packet boundary.
I believe the Linux XHCI driver now handles both these cases.
(It hadn't used to - which is why I know anything about USB3 and XHCI.)

I also recall issues with non word aligned buffers for some controllers.

> > The second, old, comment is about controllers.
> 
> Well, if the drivers would use bounce buffers to work around the
> controllers' issues then they wouldn't have this special requirement.
> So it really is a combination of what the hardware can do and what the
> driver can do.

Indeed.
So any comment should refer to what the linux usb drivers requires
of their 'user', not what happens on the USB wire.

It might me that you do end up having to request 1k aligned
buffers for XHCI, but the comment should say that you are
adding a far stronger restriction than that required by the
driver and controller.

Given that XHCI is the most common interface (at least on x86)
if the 1k alignment forces extra bounce buffers in any code
paths it could be a performance issue.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

WARNING: multiple messages have this Message-ID (diff)
From: David Laight <David.Laight@ACULAB.COM>
To: 'Alan Stern' <stern@rowland.harvard.edu>,
	Oliver Neukum <oneukum@suse.com>
Cc: "gregKH@linuxfoundation.org" <gregKH@linuxfoundation.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>
Subject: RE: [PATCH] UAS: fix alignment of scatter/gather segments
Date: Tue, 30 Apr 2019 09:16:21 +0000	[thread overview]
Message-ID: <734e89837b454acea32b990fa2aff902@AcuMS.aculab.com> (raw)
Message-ID: <20190430091621.hsuEkXyQGlGsdVHsRnrN07JN8Qdc1H2sodHbmiwctKk@z> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1904291346170.1632-100000@iolanthe.rowland.org>

From: Alan Stern
> Sent: 29 April 2019 18:55
> On Mon, 29 Apr 2019, Oliver Neukum wrote:
> 
> > On Mo, 2019-04-29 at 12:08 -0400, Alan Stern wrote:
> > > On Mon, 29 Apr 2019, Oliver Neukum wrote:
> > >
> > > > On Mo, 2019-04-29 at 15:06 +0000, David Laight wrote:
> > >
> > > > But the statement the old comment made are no longer correct.
> > >
> > > Perhaps David would be satisfied if the comment were changed to say
> > > that _some_ USB controller drivers have this unusual alignment
> > > requirement.
> >
> > It would seem to me that every controller that does not do
> > scatter/gather has this requirement. In other words, this is
> > the true requirement of USB. It does not come from the
> > controller. It comes from the protocol's need to not
> > send a short package.

The hardware requirement is that packets that need to be joined
together to make a long request must be 'full'.
In many cases this means a zero length packet must be sent to
correctly terminate a request that is a multiple of the packet size.
Since the software has to add the zero length packet there is
no real difference between a single scatter-gather transmit and
multiple single packet trnasmits.

For USB2 bulk transfers the packet size is 512, and for USB3 1024.
The old comment suggested 2048 for some unsupported interface.

> Are you sure that xHCI has this requirement?  I haven't checked the
> spec.  I know that UHCI, OHCI, and EHCI do need this alignment (and
> OHCI and EHCI do in fact have hardware support for scatter-gather).
> 
> More precisely, what matters is whether the controller is able to merge
> two different DMA segments into a single packet.  UHCI can't.  OHCI and
> EHCI can, but only if the first segment ends at a page boundary and the
> second begins at a page boundary -- it's easier just to say that the
> segments have to be maxpacket-aligned.

XHCI (for USB2 or USB3) can handle almost arbitrary fragments.
There are a couple of annoying restrictions (IIRC):
- Fragments cannot cross a 64k boundary.
  (How much would it cost the hardware to have a 32bit (or even 64bit)
  counter.)
- The 'Link TRB' between ring segments must be aligned to a packet boundary.
I believe the Linux XHCI driver now handles both these cases.
(It hadn't used to - which is why I know anything about USB3 and XHCI.)

I also recall issues with non word aligned buffers for some controllers.

> > The second, old, comment is about controllers.
> 
> Well, if the drivers would use bounce buffers to work around the
> controllers' issues then they wouldn't have this special requirement.
> So it really is a combination of what the hardware can do and what the
> driver can do.

Indeed.
So any comment should refer to what the linux usb drivers requires
of their 'user', not what happens on the USB wire.

It might me that you do end up having to request 1k aligned
buffers for XHCI, but the comment should say that you are
adding a far stronger restriction than that required by the
driver and controller.

Given that XHCI is the most common interface (at least on x86)
if the 1k alignment forces extra bounce buffers in any code
paths it could be a performance issue.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


         reply	other threads:[~2019-04-30  9:16 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-29 12:20 UAS: fix alignment of scatter/gather segments Oliver Neukum
2019-04-29 12:20 ` [PATCH] " Oliver Neukum
2019-04-29 13:31 ` David Laight
2019-04-29 13:31   ` [PATCH] " David Laight
2019-04-29 13:38   ` Oliver Neukum
2019-04-29 13:38     ` [PATCH] " Oliver Neukum
2019-04-29 14:19     ` David Laight
2019-04-29 14:19       ` [PATCH] " David Laight
2019-04-29 14:32       ` Oliver Neukum
2019-04-29 14:32         ` [PATCH] " Oliver Neukum
2019-04-29 15:06         ` David Laight
2019-04-29 15:06           ` [PATCH] " David Laight
2019-04-29 15:57           ` Oliver Neukum
2019-04-29 15:57             ` [PATCH] " Oliver Neukum
2019-04-29 16:08             ` Alan Stern
2019-04-29 16:08               ` [PATCH] " Alan Stern
2019-04-29 16:58               ` Oliver Neukum
2019-04-29 16:58                 ` [PATCH] " Oliver Neukum
2019-04-29 17:55                 ` Alan Stern
2019-04-29 17:55                   ` [PATCH] " Alan Stern
2019-04-29 18:42                   ` Oliver Neukum
2019-04-29 18:42                     ` [PATCH] " Oliver Neukum
2019-04-29 19:42                     ` Alan Stern
2019-04-29 19:42                       ` [PATCH] " Alan Stern
2019-04-30  9:16                   ` David Laight [this message]
2019-04-30  9:16                     ` David Laight
2019-04-30 14:39                     ` Alan Stern
2019-04-30 14:39                       ` [PATCH] " Alan Stern

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=734e89837b454acea32b990fa2aff902@AcuMS.aculab.com \
    --to=david.laight@aculab.com \
    --cc=gregKH@linuxfoundation.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=oneukum@suse.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