• S
    USB: Add support for usbfs zerocopy. · f7d34b44
    Steinar H. Gunderson 提交于
    Add a new interface for userspace to preallocate memory that can be
    used with usbfs. This gives two primary benefits:
    
     - Zerocopy; data no longer needs to be copied between the userspace
       and the kernel, but can instead be read directly by the driver from
       userspace's buffers. This works for all kinds of transfers (even if
       nonsensical for control and interrupt transfers); isochronous also
       no longer need to memset() the buffer to zero to avoid leaking kernel data.
    
     - Once the buffers are allocated, USB transfers can no longer fail due to
       memory fragmentation; previously, long-running programs could run into
       problems finding a large enough contiguous memory chunk, especially on
       embedded systems or at high rates.
    
    Memory is allocated by using mmap() against the usbfs file descriptor,
    and similarly deallocated by munmap(). Once memory has been allocated,
    using it as pointers to a bulk or isochronous operation means you will
    automatically get zerocopy behavior. Note that this also means you cannot
    modify outgoing data until the transfer is complete. The same holds for
    data on the same cache lines as incoming data; DMA modifying them at the
    same time could lead to your changes being overwritten.
    
    There's a new capability USBDEVFS_CAP_MMAP that userspace can query to see
    if the running kernel supports this functionality, if just trying mmap() is
    not acceptable.
    
    Largely based on a patch by Markus Rechberger with some updates. The original
    patch can be found at:
    
      http://sundtek.de/support/devio_mmap_v0.4.diffSigned-off-by: NSteinar H. Gunderson <sesse@google.com>
    Signed-off-by: NMarkus Rechberger <mrechberger@gmail.com>
    Acked-by: NAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f7d34b44
usbdevice_fs.h 6.5 KB