On Thu, 17 May 2007, Laurent Pinchart wrote:

> Ok. A driver should obviously not allocate a lot of DMA cache coherent memory 
> if it's not going to use it. For buffers that are allocated at initialisation 
> time and not used often, usb_buffer_alloc() should not be used.

Yes.  Similarly, buffers that are going to be used once and then thrown 
away shouldn't be obtained from usb_buffer_alloc().

> There's something I don't get. The documentation states that USB buffer 
> memory 
> should be allocated using kmalloc or get_free_pages. This means that 
> allocated memory will be physically contiguous. However, not all controllers 
> should require that. There are, from what I can tell, three classes of USB 
> host controllers:
> 
> - PIO host controllers don't use DMA at all, and should thus not require 
> physically contiguous memory. The device dma_mask field is set to 0, and 
> usb_hcd_submit_urb doesn't allocate DMA mappings for URB buffers when using 
> such a controller.
> 
> - DMA-able host controllers without hardware scatter-gather require 
> physically 
> contiguous memory. For those controllers, usb_hcd_submit_urb allocates DMA 
> mappings if the URB buffers haven't been mapped already (URB_NO_*_DMA_MAP 
> flags not set). usb_hcd_giveback_urb unmaps the buffers if they have been 
> mapped by usb_hcd_submit_urb. As those controllers require physically 
> contiguous memory, kmalloc or get_free_pages must be used.
> 
> - DMA-able host controllers with hardware scatter-gather don't require 
> physically contiguous memory. EHCI controllers seem to have scatter-gather 
> capabilities. For those controllers, pressure on the memory allocator could 
> be lowered by implementing scatter-gather.
> 
> USB device drivers currently either allocate URB buffers with 
> kmalloc/get_free_pages or call usb_buffer_alloc. When using the former, the 
> DMA mapping is created and deleted at URB submission/completion. When using 
> the later, DMA mappings are created once and kept for the entire life of the 
> buffer.
> 
> I suppose we should keep kmalloc/get_free_pages for buffers that are seldom 
> used. From what I've seen so far, usb_buffer_alloc would help for buffers 
> used for isochronous or bulk streaming, where the same URBs are submitted 
> again and again. That would remove the DMA map/unmap overhead.

That is an appropriate use of usb_buffer_alloc, yes.

> Shouldn't we implement scatter-gather for EHCI (and possibly other) 
> controllers ? Is it planned ? We would then need a generic URB buffer 
> allocator, as the device driver should not care about what kind of memory the 
> USB host controller needs. The allocator would be passed a parameter to 
> DMA-map the buffer for streaming bulk/isochronous transfers.

This is a little complicated.

First, let's break it down according to the transfer type.  Control 
messages tend to be quite short; there's no advantage to using 
scatter-gather for them.  Likewise with interrupt transfers (they 
usually are limited to a maxpacket-sized buffer).

Iso transfers involve lots of small sub-buffers inside a larger buffer,
where the exact arrangement doesn't much matter.  You want the large
buffer to be big enough to maintain streaming while minimizing
interrupt overhead, but it doesn't have to be terribly big.  Generally
multiple URBs are submitted anyway, each with its own buffer, so again
s-g isn't needed.

Bulk transfers are the only ones which could really benefit.  However
nothing says that large bulk transfers have to be done using a single
URB.  They can be streamed just like Iso transfers, thereby making s-g
at the HCD level unnecessary.  That's how the s-g library already
present in message.c works.

So on the whole, there's no pressing reason to add s-g support to the
controller drivers.  What might be useful would be a bulk s-g library
that could be used outside of process context -- unlike the current
one.  (The current one also assumes that all the buffers have already
been allocated; it doesn't allocate them for you.)  At one point Pete
Zaitcev spent some time working on such a thing, but then he dropped
it.

Alan Stern


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to