• Bill Kuzeja's avatar
    xhci: Prevent deadlock when xhci adapter breaks during init · cbc5abaa
    Bill Kuzeja authored
    commit 8de66b0e upstream.
    
    The system can hit a deadlock if an xhci adapter breaks while initializing.
    The deadlock is between two threads: thread 1 is tearing down the
    adapter and is stuck in usb_unlocked_disable_lpm waiting to lock the
    hcd->handwidth_mutex. Thread 2 is holding this mutex (while still trying
    to add a usb device), but is stuck in xhci_endpoint_reset waiting for a
    stop or config command to complete. A reboot is required to resolve.
    
    It turns out when calling xhci_queue_stop_endpoint and
    xhci_queue_configure_endpoint in xhci_endpoint_reset, the return code is
    not checked for errors. If the timing is right and the adapter dies just
    before either of these commands get issued, we hang indefinitely waiting
    for a completion on a command that didn't get issued.
    
    This wasn't a problem before the following fix because we didn't send
    commands in xhci_endpoint_reset:
    
    commit f5249461 ("xhci: Clear the host side toggle manually when
        endpoint is soft reset")
    
    With the patch I am submitting, a duration test which breaks adapters
    during initialization (and which deadlocks with the standard kernel) runs
    without issue.
    
    Fixes: f5249461 ("xhci: Clear the host side toggle manually when endpoint is soft reset")
    Cc: <stable@vger.kernel.org> # v4.17+
    Cc: Torez Smith <torez@redhat.com>
    Signed-off-by: default avatarBill Kuzeja <william.kuzeja@stratus.com>
    Signed-off-by: default avatarTorez Smith <torez@redhat.com>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/1570190373-30684-7-git-send-email-mathias.nyman@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cbc5abaa
xhci.c 156 KB