On Mon, 16 Nov 2015, Christoph Hellwig wrote:
> On Mon, Nov 16, 2015 at 08:03:12PM +0100, Steinar H. Gunderson wrote:
> > The original use case: DVB capture on embedded devices.
> >
> > My use case: USB3 uncompressed HD video capture (from multiple cards).
> >
> > Both of these hit (beyond the speed boost from zerocopy) the problem that
> > as time goes by, memory gets more fragmented and usbfs fails allocation.
> > Allocating memory up-front solves that.
>
> As said I think you should just use get_user_pages() on user memory,
> and bounce buffer if it doesn't fit the DMA mask.
>
> Thіs also allows the user to use hugetlbs if they need large contiguous
> allocations for performance reasons.
In other words, you're suggesting we do this:
Check that userspace requested zerocopy (otherwise the user
program might try to access other data stored in the same cache
lines as the buffer while the I/O is in progres);
Call get_user_pages (or get_user_pages_fast? -- it's not clear
which should be used) for this buffer;
Use the array of pages returned by that routine to populate
a scatter-gather list (sg_alloc_table_from_pages);
Pass that list to dma_map_sg.
Is that right?
Does dma_map_sg check the page addresses against the DMA mask and
automatically create a bounce buffer, or do we have to do that
manually? Documentation/DMA-API-HOWTO.txt doesn't discuss this.
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html