Re: [PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
Hi, On Thu, May 26, 2016 at 07:26:44PM +0300, Felipe Balbi wrote: > > >> Bin Liuwrites: > >> > On Wed, May 25, 2016 at 02:18:34PM -0500, Bin Liu wrote: > >> >> [ 40.467381] = > >> >> [ 40.473013] [ INFO: possible recursive locking detected ] > >> >> [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted > >> >> [ 40.483466] - > >> >> [ 40.489098] usb/733 is trying to acquire lock: > >> >> [ 40.493734] (&(>lock)->rlock){-.}, at: [] > >> >> ep0_complete+0x18/0xdc [gadgetfs] > >> >> [ 40.502882] > >> >> [ 40.502882] but task is already holding lock: > >> >> [ 40.508967] (&(>lock)->rlock){-.}, at: [] > >> >> ep0_read+0x20/0x5e0 [gadgetfs] > >> >> [ 40.517811] > >> >> [ 40.517811] other info that might help us debug this: > >> >> [ 40.524623] Possible unsafe locking scenario: > >> >> [ 40.524623] > >> >> [ 40.530798]CPU0 > >> >> [ 40.533346] > >> >> [ 40.535894] lock(&(>lock)->rlock); > >> >> [ 40.540088] lock(&(>lock)->rlock); > >> >> [ 40.544284] > >> >> [ 40.544284] *** DEADLOCK *** > >> >> [ 40.544284] > >> >> [ 40.550461] May be due to missing lock nesting notation > >> >> [ 40.550461] > >> >> [ 40.557544] 2 locks held by usb/733: > >> >> [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] > >> >> __fdget_pos+0x40/0x48 > >> >> [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] > >> >> ep0_read+0x20/0x5e0 [gadgetfs] > >> >> [ 40.578523] > >> >> [ 40.578523] stack backtrace: > >> >> [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted > >> >> 4.6.0-08691-g7f3db9a #37 > >> >> [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) > >> >> [ 40.596625] [] (unwind_backtrace) from [] > >> >> (show_stack+0x10/0x14) > >> >> [ 40.604718] [] (show_stack) from [] > >> >> (dump_stack+0xb0/0xe4) > >> >> [ 40.612267] [] (dump_stack) from [] > >> >> (__lock_acquire+0xf68/0x1994) > >> >> [ 40.620440] [] (__lock_acquire) from [] > >> >> (lock_acquire+0xd8/0x238) > >> >> [ 40.628621] [] (lock_acquire) from [] > >> >> (_raw_spin_lock_irqsave+0x38/0x4c) > >> >> [ 40.637440] [] (_raw_spin_lock_irqsave) from [] > >> >> (ep0_complete+0x18/0xdc [gadgetfs]) > >> >> [ 40.647339] [] (ep0_complete [gadgetfs]) from [] > >> >> (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) > >> >> [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from > >> >> [] (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) > >> >> [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from > >> >> [] (ep0_read+0x544/0x5e0 [gadgetfs]) > >> >> [ 40.678963] [] (ep0_read [gadgetfs]) from [] > >> >> (__vfs_read+0x20/0x110) > >> >> [ 40.687414] [] (__vfs_read) from [] > >> >> (vfs_read+0x88/0x114) > >> >> [ 40.694864] [] (vfs_read) from [] > >> >> (SyS_read+0x44/0x9c) > >> >> [ 40.702051] [] (SyS_read) from [] > >> >> (ret_fast_syscall+0x0/0x1c) > >> >> > >> >> Cc: # v3.16+ > >> >> Signed-off-by: Bin Liu > >> >> --- > >> >> v2: > >> >> - lock protects setup_req(), only unlock for usb_ep_queue() > >> >> - use GFP_KERNEL in usb_ep_queue() > >> >> - fix the same in two places in gadgetfs_setup() too > >> > > >> > Never mind. Sent the patch too soon. It gives the following problem. > >> > > >> > [ 179.810367] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:2724 > >> > _raw_spin_unlock_irq+0x24/0x2c > >> > [ 179.819719] DEBUG_LOCKS_WARN_ON(current->hardirq_context) > >> > >> thanks for letting us know. I'm dropping this from my queue. Please > >> resend final patch once you have it ;-) > > > > It turned out to be a very easy fix ;) > > > > I have v3 ready, but checkpatch.pl complains the followings. I don't > > think this patch should fix them, since the whole driver is coded like > > that. Any comments? > > Let's fix it with a follow-up patch. Can you do that one too, btw? I can > do it, if you don't wanna deal with that; but I'm also open to receiving > free patches heh I'd like to do it, but I have a pile of other suff to do. (I still remember I owe you a g-zero test with dwc3...) Regards, -Bin. -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
>> Bin Liuwrites: >> > On Wed, May 25, 2016 at 02:18:34PM -0500, Bin Liu wrote: >> >> [ 40.467381] = >> >> [ 40.473013] [ INFO: possible recursive locking detected ] >> >> [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted >> >> [ 40.483466] - >> >> [ 40.489098] usb/733 is trying to acquire lock: >> >> [ 40.493734] (&(>lock)->rlock){-.}, at: [] >> >> ep0_complete+0x18/0xdc [gadgetfs] >> >> [ 40.502882] >> >> [ 40.502882] but task is already holding lock: >> >> [ 40.508967] (&(>lock)->rlock){-.}, at: [] >> >> ep0_read+0x20/0x5e0 [gadgetfs] >> >> [ 40.517811] >> >> [ 40.517811] other info that might help us debug this: >> >> [ 40.524623] Possible unsafe locking scenario: >> >> [ 40.524623] >> >> [ 40.530798]CPU0 >> >> [ 40.533346] >> >> [ 40.535894] lock(&(>lock)->rlock); >> >> [ 40.540088] lock(&(>lock)->rlock); >> >> [ 40.544284] >> >> [ 40.544284] *** DEADLOCK *** >> >> [ 40.544284] >> >> [ 40.550461] May be due to missing lock nesting notation >> >> [ 40.550461] >> >> [ 40.557544] 2 locks held by usb/733: >> >> [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] >> >> __fdget_pos+0x40/0x48 >> >> [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] >> >> ep0_read+0x20/0x5e0 [gadgetfs] >> >> [ 40.578523] >> >> [ 40.578523] stack backtrace: >> >> [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted 4.6.0-08691-g7f3db9a >> >> #37 >> >> [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) >> >> [ 40.596625] [] (unwind_backtrace) from [] >> >> (show_stack+0x10/0x14) >> >> [ 40.604718] [] (show_stack) from [] >> >> (dump_stack+0xb0/0xe4) >> >> [ 40.612267] [] (dump_stack) from [] >> >> (__lock_acquire+0xf68/0x1994) >> >> [ 40.620440] [] (__lock_acquire) from [] >> >> (lock_acquire+0xd8/0x238) >> >> [ 40.628621] [] (lock_acquire) from [] >> >> (_raw_spin_lock_irqsave+0x38/0x4c) >> >> [ 40.637440] [] (_raw_spin_lock_irqsave) from [] >> >> (ep0_complete+0x18/0xdc [gadgetfs]) >> >> [ 40.647339] [] (ep0_complete [gadgetfs]) from [] >> >> (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) >> >> [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from >> >> [] (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) >> >> [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from >> >> [] (ep0_read+0x544/0x5e0 [gadgetfs]) >> >> [ 40.678963] [] (ep0_read [gadgetfs]) from [] >> >> (__vfs_read+0x20/0x110) >> >> [ 40.687414] [] (__vfs_read) from [] >> >> (vfs_read+0x88/0x114) >> >> [ 40.694864] [] (vfs_read) from [] >> >> (SyS_read+0x44/0x9c) >> >> [ 40.702051] [] (SyS_read) from [] >> >> (ret_fast_syscall+0x0/0x1c) >> >> >> >> Cc: # v3.16+ >> >> Signed-off-by: Bin Liu >> >> --- >> >> v2: >> >> - lock protects setup_req(), only unlock for usb_ep_queue() >> >> - use GFP_KERNEL in usb_ep_queue() >> >> - fix the same in two places in gadgetfs_setup() too >> > >> > Never mind. Sent the patch too soon. It gives the following problem. >> > >> > [ 179.810367] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:2724 >> > _raw_spin_unlock_irq+0x24/0x2c >> > [ 179.819719] DEBUG_LOCKS_WARN_ON(current->hardirq_context) >> >> thanks for letting us know. I'm dropping this from my queue. Please >> resend final patch once you have it ;-) > > It turned out to be a very easy fix ;) > > I have v3 ready, but checkpatch.pl complains the followings. I don't > think this patch should fix them, since the whole driver is coded like > that. Any comments? Let's fix it with a follow-up patch. Can you do that one too, btw? I can do it, if you don't wanna deal with that; but I'm also open to receiving free patches heh -- balbi signature.asc Description: PGP signature
Re: [PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
Hi, On Thu, May 26, 2016 at 09:27:26AM +0300, Felipe Balbi wrote: > > Hi, > > Bin Liuwrites: > > On Wed, May 25, 2016 at 02:18:34PM -0500, Bin Liu wrote: > >> [ 40.467381] = > >> [ 40.473013] [ INFO: possible recursive locking detected ] > >> [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted > >> [ 40.483466] - > >> [ 40.489098] usb/733 is trying to acquire lock: > >> [ 40.493734] (&(>lock)->rlock){-.}, at: [] > >> ep0_complete+0x18/0xdc [gadgetfs] > >> [ 40.502882] > >> [ 40.502882] but task is already holding lock: > >> [ 40.508967] (&(>lock)->rlock){-.}, at: [] > >> ep0_read+0x20/0x5e0 [gadgetfs] > >> [ 40.517811] > >> [ 40.517811] other info that might help us debug this: > >> [ 40.524623] Possible unsafe locking scenario: > >> [ 40.524623] > >> [ 40.530798]CPU0 > >> [ 40.533346] > >> [ 40.535894] lock(&(>lock)->rlock); > >> [ 40.540088] lock(&(>lock)->rlock); > >> [ 40.544284] > >> [ 40.544284] *** DEADLOCK *** > >> [ 40.544284] > >> [ 40.550461] May be due to missing lock nesting notation > >> [ 40.550461] > >> [ 40.557544] 2 locks held by usb/733: > >> [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] > >> __fdget_pos+0x40/0x48 > >> [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] > >> ep0_read+0x20/0x5e0 [gadgetfs] > >> [ 40.578523] > >> [ 40.578523] stack backtrace: > >> [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted 4.6.0-08691-g7f3db9a > >> #37 > >> [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) > >> [ 40.596625] [] (unwind_backtrace) from [] > >> (show_stack+0x10/0x14) > >> [ 40.604718] [] (show_stack) from [] > >> (dump_stack+0xb0/0xe4) > >> [ 40.612267] [] (dump_stack) from [] > >> (__lock_acquire+0xf68/0x1994) > >> [ 40.620440] [] (__lock_acquire) from [] > >> (lock_acquire+0xd8/0x238) > >> [ 40.628621] [] (lock_acquire) from [] > >> (_raw_spin_lock_irqsave+0x38/0x4c) > >> [ 40.637440] [] (_raw_spin_lock_irqsave) from [] > >> (ep0_complete+0x18/0xdc [gadgetfs]) > >> [ 40.647339] [] (ep0_complete [gadgetfs]) from [] > >> (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) > >> [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from > >> [] (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) > >> [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from > >> [] (ep0_read+0x544/0x5e0 [gadgetfs]) > >> [ 40.678963] [] (ep0_read [gadgetfs]) from [] > >> (__vfs_read+0x20/0x110) > >> [ 40.687414] [] (__vfs_read) from [] > >> (vfs_read+0x88/0x114) > >> [ 40.694864] [] (vfs_read) from [] > >> (SyS_read+0x44/0x9c) > >> [ 40.702051] [] (SyS_read) from [] > >> (ret_fast_syscall+0x0/0x1c) > >> > >> Cc: # v3.16+ > >> Signed-off-by: Bin Liu > >> --- > >> v2: > >> - lock protects setup_req(), only unlock for usb_ep_queue() > >> - use GFP_KERNEL in usb_ep_queue() > >> - fix the same in two places in gadgetfs_setup() too > > > > Never mind. Sent the patch too soon. It gives the following problem. > > > > [ 179.810367] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:2724 > > _raw_spin_unlock_irq+0x24/0x2c > > [ 179.819719] DEBUG_LOCKS_WARN_ON(current->hardirq_context) > > thanks for letting us know. I'm dropping this from my queue. Please > resend final patch once you have it ;-) It turned out to be a very easy fix ;) I have v3 ready, but checkpatch.pl complains the followings. I don't think this patch should fix them, since the whole driver is coded like that. Any comments? WARNING: space prohibited between function name and open parenthesis '(' #68: FILE: drivers/usb/gadget/legacy/inode.c:941: + if ((retval = setup_req (ep, req, 0)) == 0) { ERROR: do not use assignment in if condition #68: FILE: drivers/usb/gadget/legacy/inode.c:941: + if ((retval = setup_req (ep, req, 0)) == 0) { WARNING: space prohibited between function name and open parenthesis '(' #69: FILE: drivers/usb/gadget/legacy/inode.c:942: + spin_unlock_irq (>lock); WARNING: space prohibited between function name and open parenthesis '(' #70: FILE: drivers/usb/gadget/legacy/inode.c:943: + retval = usb_ep_queue (ep, req, GFP_KERNEL); WARNING: space prohibited between function name and open parenthesis '(' #71: FILE: drivers/usb/gadget/legacy/inode.c:944: + spin_lock_irq (>lock); WARNING: space prohibited between function name and open parenthesis '(' #81: FILE: drivers/usb/gadget/legacy/inode.c:1464: + spin_unlock (>lock); WARNING: space prohibited between function name and open parenthesis '(' #85: FILE: drivers/usb/gadget/legacy/inode.c:1467: + spin_lock (>lock); WARNING: space prohibited between function name and open parenthesis '(' #95: FILE:
Re: [PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
Hi, Bin Liuwrites: > On Wed, May 25, 2016 at 02:18:34PM -0500, Bin Liu wrote: >> [ 40.467381] = >> [ 40.473013] [ INFO: possible recursive locking detected ] >> [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted >> [ 40.483466] - >> [ 40.489098] usb/733 is trying to acquire lock: >> [ 40.493734] (&(>lock)->rlock){-.}, at: [] >> ep0_complete+0x18/0xdc [gadgetfs] >> [ 40.502882] >> [ 40.502882] but task is already holding lock: >> [ 40.508967] (&(>lock)->rlock){-.}, at: [] >> ep0_read+0x20/0x5e0 [gadgetfs] >> [ 40.517811] >> [ 40.517811] other info that might help us debug this: >> [ 40.524623] Possible unsafe locking scenario: >> [ 40.524623] >> [ 40.530798]CPU0 >> [ 40.533346] >> [ 40.535894] lock(&(>lock)->rlock); >> [ 40.540088] lock(&(>lock)->rlock); >> [ 40.544284] >> [ 40.544284] *** DEADLOCK *** >> [ 40.544284] >> [ 40.550461] May be due to missing lock nesting notation >> [ 40.550461] >> [ 40.557544] 2 locks held by usb/733: >> [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] >> __fdget_pos+0x40/0x48 >> [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] >> ep0_read+0x20/0x5e0 [gadgetfs] >> [ 40.578523] >> [ 40.578523] stack backtrace: >> [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted 4.6.0-08691-g7f3db9a #37 >> [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) >> [ 40.596625] [] (unwind_backtrace) from [] >> (show_stack+0x10/0x14) >> [ 40.604718] [] (show_stack) from [] >> (dump_stack+0xb0/0xe4) >> [ 40.612267] [] (dump_stack) from [] >> (__lock_acquire+0xf68/0x1994) >> [ 40.620440] [] (__lock_acquire) from [] >> (lock_acquire+0xd8/0x238) >> [ 40.628621] [] (lock_acquire) from [] >> (_raw_spin_lock_irqsave+0x38/0x4c) >> [ 40.637440] [] (_raw_spin_lock_irqsave) from [] >> (ep0_complete+0x18/0xdc [gadgetfs]) >> [ 40.647339] [] (ep0_complete [gadgetfs]) from [] >> (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) >> [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from [] >> (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) >> [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from [] >> (ep0_read+0x544/0x5e0 [gadgetfs]) >> [ 40.678963] [] (ep0_read [gadgetfs]) from [] >> (__vfs_read+0x20/0x110) >> [ 40.687414] [] (__vfs_read) from [] >> (vfs_read+0x88/0x114) >> [ 40.694864] [] (vfs_read) from [] (SyS_read+0x44/0x9c) >> [ 40.702051] [] (SyS_read) from [] >> (ret_fast_syscall+0x0/0x1c) >> >> Cc: # v3.16+ >> Signed-off-by: Bin Liu >> --- >> v2: >> - lock protects setup_req(), only unlock for usb_ep_queue() >> - use GFP_KERNEL in usb_ep_queue() >> - fix the same in two places in gadgetfs_setup() too > > Never mind. Sent the patch too soon. It gives the following problem. > > [ 179.810367] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:2724 > _raw_spin_unlock_irq+0x24/0x2c > [ 179.819719] DEBUG_LOCKS_WARN_ON(current->hardirq_context) thanks for letting us know. I'm dropping this from my queue. Please resend final patch once you have it ;-) -- balbi signature.asc Description: PGP signature
Re: [PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
On Wed, May 25, 2016 at 02:18:34PM -0500, Bin Liu wrote: > [ 40.467381] = > [ 40.473013] [ INFO: possible recursive locking detected ] > [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted > [ 40.483466] - > [ 40.489098] usb/733 is trying to acquire lock: > [ 40.493734] (&(>lock)->rlock){-.}, at: [] > ep0_complete+0x18/0xdc [gadgetfs] > [ 40.502882] > [ 40.502882] but task is already holding lock: > [ 40.508967] (&(>lock)->rlock){-.}, at: [] > ep0_read+0x20/0x5e0 [gadgetfs] > [ 40.517811] > [ 40.517811] other info that might help us debug this: > [ 40.524623] Possible unsafe locking scenario: > [ 40.524623] > [ 40.530798]CPU0 > [ 40.533346] > [ 40.535894] lock(&(>lock)->rlock); > [ 40.540088] lock(&(>lock)->rlock); > [ 40.544284] > [ 40.544284] *** DEADLOCK *** > [ 40.544284] > [ 40.550461] May be due to missing lock nesting notation > [ 40.550461] > [ 40.557544] 2 locks held by usb/733: > [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] > __fdget_pos+0x40/0x48 > [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] > ep0_read+0x20/0x5e0 [gadgetfs] > [ 40.578523] > [ 40.578523] stack backtrace: > [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted 4.6.0-08691-g7f3db9a #37 > [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) > [ 40.596625] [] (unwind_backtrace) from [] > (show_stack+0x10/0x14) > [ 40.604718] [] (show_stack) from [] > (dump_stack+0xb0/0xe4) > [ 40.612267] [] (dump_stack) from [] > (__lock_acquire+0xf68/0x1994) > [ 40.620440] [] (__lock_acquire) from [] > (lock_acquire+0xd8/0x238) > [ 40.628621] [] (lock_acquire) from [] > (_raw_spin_lock_irqsave+0x38/0x4c) > [ 40.637440] [] (_raw_spin_lock_irqsave) from [] > (ep0_complete+0x18/0xdc [gadgetfs]) > [ 40.647339] [] (ep0_complete [gadgetfs]) from [] > (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) > [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from [] > (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) > [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from [] > (ep0_read+0x544/0x5e0 [gadgetfs]) > [ 40.678963] [] (ep0_read [gadgetfs]) from [] > (__vfs_read+0x20/0x110) > [ 40.687414] [] (__vfs_read) from [] > (vfs_read+0x88/0x114) > [ 40.694864] [] (vfs_read) from [] (SyS_read+0x44/0x9c) > [ 40.702051] [] (SyS_read) from [] > (ret_fast_syscall+0x0/0x1c) > > Cc:# v3.16+ > Signed-off-by: Bin Liu > --- > v2: > - lock protects setup_req(), only unlock for usb_ep_queue() > - use GFP_KERNEL in usb_ep_queue() > - fix the same in two places in gadgetfs_setup() too Never mind. Sent the patch too soon. It gives the following problem. [ 179.810367] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:2724 _raw_spin_unlock_irq+0x24/0x2c [ 179.819719] DEBUG_LOCKS_WARN_ON(current->hardirq_context) Regards, -Bin. -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2] usb: gadget: fix spinlock dead lock in gadgetfs
[ 40.467381] = [ 40.473013] [ INFO: possible recursive locking detected ] [ 40.478651] 4.6.0-08691-g7f3db9a #37 Not tainted [ 40.483466] - [ 40.489098] usb/733 is trying to acquire lock: [ 40.493734] (&(>lock)->rlock){-.}, at: [] ep0_complete+0x18/0xdc [gadgetfs] [ 40.502882] [ 40.502882] but task is already holding lock: [ 40.508967] (&(>lock)->rlock){-.}, at: [] ep0_read+0x20/0x5e0 [gadgetfs] [ 40.517811] [ 40.517811] other info that might help us debug this: [ 40.524623] Possible unsafe locking scenario: [ 40.524623] [ 40.530798]CPU0 [ 40.533346] [ 40.535894] lock(&(>lock)->rlock); [ 40.540088] lock(&(>lock)->rlock); [ 40.544284] [ 40.544284] *** DEADLOCK *** [ 40.544284] [ 40.550461] May be due to missing lock nesting notation [ 40.550461] [ 40.557544] 2 locks held by usb/733: [ 40.561271] #0: (>f_pos_lock){+.+.+.}, at: [] __fdget_pos+0x40/0x48 [ 40.569219] #1: (&(>lock)->rlock){-.}, at: [] ep0_read+0x20/0x5e0 [gadgetfs] [ 40.578523] [ 40.578523] stack backtrace: [ 40.583075] CPU: 0 PID: 733 Comm: usb Not tainted 4.6.0-08691-g7f3db9a #37 [ 40.590246] Hardware name: Generic AM33XX (Flattened Device Tree) [ 40.596625] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [ 40.604718] [] (show_stack) from [] (dump_stack+0xb0/0xe4) [ 40.612267] [] (dump_stack) from [] (__lock_acquire+0xf68/0x1994) [ 40.620440] [] (__lock_acquire) from [] (lock_acquire+0xd8/0x238) [ 40.628621] [] (lock_acquire) from [] (_raw_spin_lock_irqsave+0x38/0x4c) [ 40.637440] [] (_raw_spin_lock_irqsave) from [] (ep0_complete+0x18/0xdc [gadgetfs]) [ 40.647339] [] (ep0_complete [gadgetfs]) from [] (musb_g_giveback+0x118/0x1b0 [musb_hdrc]) [ 40.657842] [] (musb_g_giveback [musb_hdrc]) from [] (musb_g_ep0_queue+0x16c/0x188 [musb_hdrc]) [ 40.668772] [] (musb_g_ep0_queue [musb_hdrc]) from [] (ep0_read+0x544/0x5e0 [gadgetfs]) [ 40.678963] [] (ep0_read [gadgetfs]) from [] (__vfs_read+0x20/0x110) [ 40.687414] [] (__vfs_read) from [] (vfs_read+0x88/0x114) [ 40.694864] [] (vfs_read) from [] (SyS_read+0x44/0x9c) [ 40.702051] [] (SyS_read) from [] (ret_fast_syscall+0x0/0x1c) Cc:# v3.16+ Signed-off-by: Bin Liu --- v2: - lock protects setup_req(), only unlock for usb_ep_queue() - use GFP_KERNEL in usb_ep_queue() - fix the same in two places in gadgetfs_setup() too drivers/usb/gadget/legacy/inode.c | 17 + 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index e64479f..a333e42 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -938,8 +938,11 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) struct usb_ep *ep = dev->gadget->ep0; struct usb_request *req = dev->req; - if ((retval = setup_req (ep, req, 0)) == 0) - retval = usb_ep_queue (ep, req, GFP_ATOMIC); + if ((retval = setup_req (ep, req, 0)) == 0) { + spin_unlock_irq (>lock); + retval = usb_ep_queue (ep, req, GFP_KERNEL); + spin_lock_irq (>lock); + } dev->state = STATE_DEV_CONNECTED; /* assume that was SET_CONFIGURATION */ @@ -1457,8 +1460,11 @@ delegate: w_length); if (value < 0) break; + + spin_unlock_irq (>lock); value = usb_ep_queue (gadget->ep0, dev->req, - GFP_ATOMIC); + GFP_KERNEL); + spin_lock_irq (>lock); if (value < 0) { clean_req (gadget->ep0, dev->req); break; @@ -1481,7 +1487,10 @@ delegate: if (value >= 0 && dev->state != STATE_DEV_SETUP) { req->length = value; req->zero = value < w_length; - value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC); + + spin_unlock_irq (>lock); + value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL); + spin_lock_irq (>lock); if (value < 0) { DBG (dev, "ep_queue --> %d\n", value); req->status = 0; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More