• David Mosberger's avatar
    drivers: usb: core: Don't disable irqs in usb_sg_wait() during URB submit. · 98b74b0e
    David Mosberger authored
    usb_submit_urb() may take quite long to execute.  For example, a
    single sg list may have 30 or more entries, possibly leading to that
    many calls to DMA-map pages.  This can cause interrupt latency of
    several hundred micro-seconds.
    
    Avoid the problem by releasing the io->lock spinlock and re-enabling
    interrupts before calling usb_submit_urb().  This opens races with
    usb_sg_cancel() and sg_complete().  Handle those races by using
    usb_block_urb() to stop URBs from being submitted after
    usb_sg_cancel() or sg_complete() with error.
    
    Note that usb_unlink_urb() is guaranteed to return -ENODEV if
    !io->urbs[i]->dev and since the -ENODEV case is already handled,
    we don't have to check for !io->urbs[i]->dev explicitly.
    
    Before this change, reading 512MB from an ext3 filesystem on a USB
    memory stick showed a throughput of 12 MB/s with about 500 missed
    deadlines.
    
    With this change, reading the same file gave the same throughput but
    only one or two missed deadlines.
    Signed-off-by: default avatarDavid Mosberger <davidm@egauge.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    98b74b0e
message.c 60.5 KB