Hi,

Vincent Pelletier <[email protected]> writes:
> On Fri, 24 Nov 2017 16:10:17 +0200, Felipe Balbi <[email protected]>
> wrote:
>> $ gdb vmlinux
>> (gdb) l *(dwc3_gadget_ep_dequeue + 0x14c)
>> 
>> 
>> what does that give you?
>
> Note: this is a different debugging session, different traceback, but
> same kernel.
>
> $ gdb ./vmlinux
> [...]
> (gdb) target remote /dev/ttyUSB0
> [...]
> (gdb) lx-symbols
> [...]
> (gdb) l *(dwc3_gadget_ep_dequeue + 0x14c)
> 0xf81b50ac is in dwc3_gadget_ep_dequeue (./include/linux/spinlock.h:342).
> 337             raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock);     
>   \
> 338     } while (0)
> 339
> 340     static __always_inline void spin_lock_irq(spinlock_t *lock)
> 341     {
> 342             raw_spin_lock_irq(&lock->rlock);
> 343     }
> 344
> 345     #define spin_lock_irqsave(lock, flags)                          \
> 346     do {                                                            \
>
> Which is likely the spin_lock_irqsave call early in the function.

no, it's not. This is because of our call to wait_event_lock_irq() in
dwc3_gadget_ep_dequeue(). That call works fine in all other cases
because dequeue is never called with IRQs disabled, apart from this one
case in f_fs.c :-)

Can you confirm that this helps:

modified   drivers/usb/gadget/function/f_fs.c
@@ -1077,15 +1077,11 @@ static int ffs_aio_cancel(struct kiocb *kiocb)
 
        ENTER();
 
-       spin_lock_irq(&epfile->ffs->eps_lock);
-
        if (likely(io_data && io_data->ep && io_data->req))
                value = usb_ep_dequeue(io_data->ep, io_data->req);
        else
                value = -EINVAL;
 
-       spin_unlock_irq(&epfile->ffs->eps_lock);
-
        return value;
 }
 
-- 
balbi
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to