linux/drivers/usb/gadget
Marc Kleine-Budde fd537c041b USB: ci13xxx_udc: fix deadlock during rmmod
The inline documentation of _gadget_stop_activity() states that the
function should be called holding the udc->lock. This however will
result in a deadlock, because _gadget_stop_activity() takes the udc->lock.

During normal operation _gadget_stop_activity() is always called unlocked,
but in ci13xxx_stop() it's called locked, this results in the following
deadlock during rmmod of a gadget driver.

This patch fixes the deadlock by calling _gadget_stop_activity() always
unlocked, the inline documentation is adjusted accordingly.

=============================================
[ INFO: possible recursive locking detected ]
3.1.0-rc6+ #159
---------------------------------------------
rmmod/121 is trying to acquire lock:
 (udc_lock){-.-...}, at: [<c0229048>] _gadget_stop_activity+0x18/0x154

but task is already holding lock:
 (udc_lock){-.-...}, at: [<c02291e0>] ci13xxx_stop+0x5c/0x164

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(udc_lock);
  lock(udc_lock);

 *** DEADLOCK ***

 May be due to missing lock nesting notation

2 locks held by rmmod/121:
 #0:  (udc_lock#2){+.+.+.}, at: [<c02286c0>] usb_gadget_unregister_driver+0x34/0x88
 #1:  (udc_lock){-.-...}, at: [<c02291e0>] ci13xxx_stop+0x5c/0x164

stack backtrace:
[<c000d41c>] (unwind_backtrace+0x0/0xf0) from [<c0056f94>] (check_deadlock.clone.24+0x284/0x2c4)
[<c0056f94>] (check_deadlock.clone.24+0x284/0x2c4) from [<c00589ac>] (validate_chain.clone.25+0x430/0x6fc)
[<c00589ac>] (validate_chain.clone.25+0x430/0x6fc) from [<c0059bac>] (__lock_acquire+0x494/0x8f0)
[<c0059bac>] (__lock_acquire+0x494/0x8f0) from [<c005a698>] (lock_acquire+0x98/0x1a8)
[<c005a698>] (lock_acquire+0x98/0x1a8) from [<c02f12a4>] (_raw_spin_lock_irqsave+0x64/0xa0)
[<c02f12a4>] (_raw_spin_lock_irqsave+0x64/0xa0) from [<c0229048>] (_gadget_stop_activity+0x18/0x154)
[<c0229048>] (_gadget_stop_activity+0x18/0x154) from [<c0229234>] (ci13xxx_stop+0xb0/0x164)
[<c0229234>] (ci13xxx_stop+0xb0/0x164) from [<c022867c>] (usb_gadget_remove_driver+0x88/0x98)
[<c022867c>] (usb_gadget_remove_driver+0x88/0x98) from [<c02286f4>] (usb_gadget_unregister_driver+0x68/0x88)
[<c02286f4>] (usb_gadget_unregister_driver+0x68/0x88) from [<c0065f2c>] (sys_delete_module+0x1fc/0x26c)
[<c0065f2c>] (sys_delete_module+0x1fc/0x26c) from [<c00092a0>] (ret_fast_syscall+0x0/0x38)
BUG: spinlock lockup on CPU#0, rmmod/121, c05b1644
[<c000d41c>] (unwind_backtrace+0x0/0xf0) from [<c01da000>] (do_raw_spin_lock+0x128/0x144)
[<c01da000>] (do_raw_spin_lock+0x128/0x144) from [<c02f12c8>] (_raw_spin_lock_irqsave+0x88/0xa0)
[<c02f12c8>] (_raw_spin_lock_irqsave+0x88/0xa0) from [<c0229048>] (_gadget_stop_activity+0x18/0x154)
[<c0229048>] (_gadget_stop_activity+0x18/0x154) from [<c0229234>] (ci13xxx_stop+0xb0/0x164)
[<c0229234>] (ci13xxx_stop+0xb0/0x164) from [<c022867c>] (usb_gadget_remove_driver+0x88/0x98)
[<c022867c>] (usb_gadget_remove_driver+0x88/0x98) from [<c02286f4>] (usb_gadget_unregister_driver+0x68/0x88)
[<c02286f4>] (usb_gadget_unregister_driver+0x68/0x88) from [<c0065f2c>] (sys_delete_module+0x1fc/0x26c)
[<c0065f2c>] (sys_delete_module+0x1fc/0x26c) from [<c00092a0>] (ret_fast_syscall+0x0/0x38)

Tested-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2011-11-14 11:51:27 -08:00
..
acm_ms.c usb: gadget: add new usb gadget for ACM and mass storage 2011-10-13 20:46:27 +03:00
amd5536udc.c usb: Provide usb_speed_string() function 2011-09-18 01:29:04 -07:00
amd5536udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
at91_udc.c usb: gadget: at91_udc: change french comments to english 2011-10-13 20:39:54 +03:00
at91_udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
atmel_usba_udc.c usb: Provide usb_speed_string() function 2011-09-18 01:29:04 -07:00
atmel_usba_udc.h USB: atmel uaba: Adding invert vbus_pin 2010-03-02 14:54:57 -08:00
audio.c usb: gadget: add max_speed to usb_composite_driver 2011-07-01 14:27:05 -07:00
cdc2.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
ci13xxx_msm.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
ci13xxx_pci.c USB: gadget: Introduce ci13xxx_udc_driver struct 2010-12-10 14:23:33 -08:00
ci13xxx_udc.c USB: ci13xxx_udc: fix deadlock during rmmod 2011-11-14 11:51:27 -08:00
ci13xxx_udc.h USB: gadget: Add test mode support for ci13xxx_udc 2011-02-25 11:33:57 -08:00
composite.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
config.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
dbgp.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
dummy_hcd.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
epautoconf.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
ether.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_acm.c usb: gadget: use config_ep_by_speed() instead of ep_choose() 2011-06-28 11:14:37 -07:00
f_audio.c usb: gadget: audio: queue wLength-sized requests 2011-09-09 13:06:06 +03:00
f_ecm.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_eem.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_fs.c usb: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:25 -04:00
f_hid.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_loopback.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_mass_storage.c usb: gadget: storage: check for valid USB_BULK_RESET_REQUEST wLength 2011-11-14 11:51:24 -08:00
f_midi.c usb: gadget: fix MIDI gadget jack allocation 2011-11-14 11:51:25 -08:00
f_ncm.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_obex.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
f_phonet.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_rndis.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_serial.c usb: gadget: use config_ep_by_speed() instead of ep_choose() 2011-06-28 11:14:37 -07:00
f_sourcesink.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
f_subset.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_uvc.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
f_uvc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
file_storage.c usb: gadget: storage: check for valid USB_BULK_RESET_REQUEST wLength 2011-11-14 11:51:24 -08:00
fsl_mxc_udc.c usb: gadget/fsl_mxc_udc: Detect the CPU type in run-time 2011-02-04 11:42:52 -08:00
fsl_qe_udc.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
fsl_qe_udc.h usb: fix a typo in a comment 2011-04-13 16:41:00 -07:00
fsl_udc_core.c usb: gadget: fsl_udc_core: fix compile error. 2011-11-14 11:51:21 -08:00
fsl_usb2_udc.h USB: extend ehci-fsl and fsl_udc_core driver for OTG operation 2011-05-02 16:59:38 -07:00
fusb300_udc.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
fusb300_udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
g_ffs.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
g_zero.h
gadget_chips.h usb: gadget: introduce gadget_is_dwc3() 2011-08-22 16:00:46 -07:00
gmidi.c usb: Add module.h to drivers/usb consumers who really use it. 2011-10-31 19:31:25 -04:00
goku_udc.c usb: gadget: convert all users to the new udc infrastructure 2011-06-28 11:13:35 -07:00
goku_udc.h usb: gadget: goku_udc: add registered flag bit, fixing build 2010-11-11 06:57:24 -08:00
hid.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
imx_udc.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
imx_udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
inode.c USB: gadgetfs: gadgetfs_disconnect: fix inconsistent lock state 2011-11-14 11:51:26 -08:00
Kconfig usb: gadget: add new usb gadget for ACM and mass storage 2011-10-13 20:46:27 +03:00
langwell_udc.c Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2011-10-25 12:23:15 +02:00
langwell_udc.h usb: gadget: langwell: convert to new style 2011-10-13 20:39:55 +03:00
m66592-udc.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
m66592-udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
Makefile usb: gadget: add new usb gadget for ACM and mass storage 2011-10-13 20:46:27 +03:00
mass_storage.c usb: gadget: storage: add superspeed support 2011-10-13 20:39:59 +03:00
multi.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
mv_udc_core.c Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2011-10-25 12:23:15 +02:00
mv_udc.h usb: gadget: mv_udc: add clock gating support 2011-10-13 20:42:09 +03:00
ncm.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
ndis.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
net2272.c usb: gadget: net2272: convert to new style 2011-10-13 20:39:56 +03:00
net2272.h USB: net2272: driver for PLX NET2272 USB device controller 2011-06-06 16:47:27 -07:00
net2280.c Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2011-10-25 12:23:15 +02:00
net2280.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
nokia.c usb: gadget: add max_speed to usb_composite_driver 2011-07-01 14:27:05 -07:00
omap_udc.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
omap_udc.h
pch_udc.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
printer.c USB: g_printer: fix bug in unregistration 2011-09-18 01:33:06 -07:00
pxa25x_udc.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
pxa25x_udc.h usb: gadget: pxa25x: is_vbus_present is gone 2011-10-13 20:39:53 +03:00
pxa27x_udc.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
pxa27x_udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
r8a66597-udc.c usb: gadget: r8a66597-udc: fix flush fifo handling 2011-11-14 11:51:20 -08:00
r8a66597-udc.h usb: gadget: r8a66597-udc: add support for SUDMAC 2011-10-13 20:38:39 +03:00
rndis.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2010-10-24 13:41:39 -07:00
rndis.h USB: rndis: section mismatch fix 2010-09-03 17:33:40 -07:00
s3c2410_udc.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
s3c2410_udc.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
s3c-hsotg.c usb: Provide usb_speed_string() function 2011-09-18 01:29:04 -07:00
s3c-hsudc.c s3c-hsudc: implement vbus_draw hook 2011-09-18 01:33:06 -07:00
serial.c usb: gadget: add max_speed to usb_composite_driver 2011-07-01 14:27:05 -07:00
storage_common.c usb: gadget: storage: add superspeed support 2011-10-13 20:39:59 +03:00
u_audio.c usb: g_audio: Fix crash at driver removal 2010-12-03 12:05:35 -08:00
u_audio.h USB: audio gadget: free alsa devices when unloading 2009-12-23 11:34:20 -08:00
u_ether.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
u_ether.h usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
u_phonet.h
u_serial.c usb: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:25 -04:00
u_serial.h usb: gadget: add usb_endpoint_descriptor to struct usb_ep 2011-06-28 11:14:36 -07:00
udc-core.c usb: gadget: core: allow everybody to read sysfs attributes 2011-11-14 11:51:17 -08:00
usbstring.c
uvc_queue.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
uvc_queue.h V4L/DVB: uvc: Fix multiple symbols definitions with UVC gadget and host drivers 2010-07-11 17:45:10 -03:00
uvc_v4l2.c Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2011-10-25 12:23:15 +02:00
uvc_video.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
uvc.h Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2011-10-25 12:23:15 +02:00
webcam.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00
zero.c usb gadget: clean up FSF boilerplate text 2011-09-09 16:00:09 -07:00