Commit 252d74f6 authored by Max Filippov's avatar Max Filippov Committed by Greg Kroah-Hartman

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: default avatarMax Filippov <jcmvbkbc@gmail.com>
Acked-by: default avatarPeter Korsgaard <peter@korsgaard.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8f668fbb
...@@ -362,6 +362,13 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd, ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment