USB: c67x00: move URB private data allocation from under spinlock
This fixes the following warning: BUG: sleeping function called from invalid context at mm/slub.c:940 in_atomic(): 1, irqs_disabled(): 1, pid: 17, name: khubd CPU: 0 PID: 17 Comm: khubd Not tainted 3.12.0-00004-g938dd60-dirty #1 __might_sleep+0xbe/0xc0 kmem_cache_alloc_trace+0x36/0x170 c67x00_urb_enqueue+0x5c/0x254 usb_hcd_submit_urb+0x66e/0x724 usb_submit_urb+0x2ac/0x308 usb_start_wait_urb+0x2c/0xb8 usb_control_msg+0x8c/0xa8 hub_port_init+0x191/0x718 hub_thread+0x804/0xe14 kthread+0x72/0x78 ret_from_kernel_thread+0x8/0xc Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Acked-by: Peter Korsgaard <peter@korsgaard.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8f668fbbd5
commit
252d74f6a8
|
@ -362,6 +362,13 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
|
||||||
struct c67x00_hcd *c67x00 = hcd_to_c67x00_hcd(hcd);
|
struct c67x00_hcd *c67x00 = hcd_to_c67x00_hcd(hcd);
|
||||||
int port = get_root_port(urb->dev)-1;
|
int port = get_root_port(urb->dev)-1;
|
||||||
|
|
||||||
|
/* Allocate and initialize urb private data */
|
||||||
|
urbp = kzalloc(sizeof(*urbp), mem_flags);
|
||||||
|
if (!urbp) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err_urbp;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&c67x00->lock, flags);
|
spin_lock_irqsave(&c67x00->lock, flags);
|
||||||
|
|
||||||
/* Make sure host controller is running */
|
/* Make sure host controller is running */
|
||||||
|
@ -374,13 +381,6 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_not_linked;
|
goto err_not_linked;
|
||||||
|
|
||||||
/* Allocate and initialize urb private data */
|
|
||||||
urbp = kzalloc(sizeof(*urbp), mem_flags);
|
|
||||||
if (!urbp) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto err_urbp;
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&urbp->hep_node);
|
INIT_LIST_HEAD(&urbp->hep_node);
|
||||||
urbp->urb = urb;
|
urbp->urb = urb;
|
||||||
urbp->port = port;
|
urbp->port = port;
|
||||||
|
@ -443,11 +443,11 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_epdata:
|
err_epdata:
|
||||||
kfree(urbp);
|
|
||||||
err_urbp:
|
|
||||||
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||||
err_not_linked:
|
err_not_linked:
|
||||||
spin_unlock_irqrestore(&c67x00->lock, flags);
|
spin_unlock_irqrestore(&c67x00->lock, flags);
|
||||||
|
kfree(urbp);
|
||||||
|
err_urbp:
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue