lkml.org 
[lkml]   [2011]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[12/27] staging: usbip: bugfix for deadlock
    2.6.32-longterm review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Bart Westgeest <bart@elbrys.com>

    commit 438957f8d4a84daa7fa5be6978ad5897a2e9e5e5 upstream.

    Interrupts must be disabled prior to calling usb_hcd_unlink_urb_from_ep.
    If interrupts are not disabled, it can potentially lead to a deadlock.
    The deadlock is readily reproduceable on a slower (ARM based) device
    such as the TI Pandaboard.

    Signed-off-by: Bart Westgeest <bart@elbrys.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/staging/usbip/vhci_rx.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    --- a/drivers/staging/usbip/vhci_rx.c
    +++ b/drivers/staging/usbip/vhci_rx.c
    @@ -67,6 +67,7 @@ static void vhci_recv_ret_submit(struct
    {
    struct usbip_device *ud = &vdev->ud;
    struct urb *urb;
    + unsigned long flags;

    spin_lock(&vdev->priv_lock);

    @@ -107,9 +108,9 @@ static void vhci_recv_ret_submit(struct

    usbip_dbg_vhci_rx("now giveback urb %p\n", urb);

    - spin_lock(&the_controller->lock);
    + spin_lock_irqsave(&the_controller->lock, flags);
    usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
    - spin_unlock(&the_controller->lock);
    + spin_unlock_irqrestore(&the_controller->lock, flags);

    usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);

    @@ -150,6 +151,7 @@ static void vhci_recv_ret_unlink(struct
    {
    struct vhci_unlink *unlink;
    struct urb *urb;
    + unsigned long flags;

    usbip_dump_header(pdu);

    @@ -181,9 +183,9 @@ static void vhci_recv_ret_unlink(struct
    urb->status = pdu->u.ret_unlink.status;
    usbip_uinfo("%d\n", urb->status);

    - spin_lock(&the_controller->lock);
    + spin_lock_irqsave(&the_controller->lock, flags);
    usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
    - spin_unlock(&the_controller->lock);
    + spin_unlock_irqrestore(&the_controller->lock, flags);

    usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
    urb->status);



    \
     
     \ /
      Last update: 2011-12-07 18:05    [W:0.034 / U:2.756 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site