* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
@ 2017-01-17 21:21 Magnus Lilja
2017-01-23 11:51 ` Felipe Balbi
0 siblings, 1 reply; 10+ messages in thread
From: Magnus Lilja @ 2017-01-17 21:21 UTC (permalink / raw)
To: linux-arm-kernel
Hi
I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
kernel panic (NULL pointer dereference) when connecting the USB cable. I
had the g_serial module loaded as well.
The NULL pointer panic comes from gadget/udc/core.c
usb_gadget_giveback_request() which calls req->complete() and in some
cases req->complete is NULL.
Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
that req->complete is non-NULL was removed:
--- a/drivers/usb/gadget/udc/fsl_udc_core.c
+++ b/drivers/usb/gadget/udc/fsl_udc_core.c
@@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
ep->stopped = 1;
spin_unlock(&ep->udc->lock);
- /* complete() is from gadget layer,
- * eg fsg->bulk_in_complete() */
- if (req->req.complete)
- req->req.complete(&ep->ep, &req->req);
+
+ usb_gadget_giveback_request(&ep->ep, &req->req);
spin_lock(&ep->udc->lock);
ep->stopped = stopped;
If I re-introduce the check (either in fsl_udc_core.c or core.c) at
least USB gadget operation using g_serial seems to work just fine.
I don't know the logic in detail to understand whether this is a proper
fix or if there is some other more problem with the fls_udc_core driver.
Does anyone have input in this matter?
I can produce a proper patch that fixes this problem by re-introducing
the check (in either fsl_udc_core.c or core.c) if that is a proper
solution and I can also assist in testing other fixes to the problem.
Thanks, Magnus
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-17 21:21 usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK Magnus Lilja
@ 2017-01-23 11:51 ` Felipe Balbi
2017-01-23 17:34 ` Magnus Lilja
0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2017-01-23 11:51 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Magnus Lilja <lilja.magnus@gmail.com> writes:
> Hi
>
> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
> kernel panic (NULL pointer dereference) when connecting the USB cable. I
> had the g_serial module loaded as well.
>
> The NULL pointer panic comes from gadget/udc/core.c
> usb_gadget_giveback_request() which calls req->complete() and in some
> cases req->complete is NULL.
>
> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
> that req->complete is non-NULL was removed:
>
> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
> ep->stopped = 1;
>
> spin_unlock(&ep->udc->lock);
> - /* complete() is from gadget layer,
> - * eg fsg->bulk_in_complete() */
> - if (req->req.complete)
> - req->req.complete(&ep->ep, &req->req);
> +
> + usb_gadget_giveback_request(&ep->ep, &req->req);
>
> spin_lock(&ep->udc->lock);
> ep->stopped = stopped;
>
> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
> least USB gadget operation using g_serial seems to work just fine.
>
> I don't know the logic in detail to understand whether this is a proper
> fix or if there is some other more problem with the fls_udc_core driver.
> Does anyone have input in this matter?
>
> I can produce a proper patch that fixes this problem by re-introducing
> the check (in either fsl_udc_core.c or core.c) if that is a proper
> solution and I can also assist in testing other fixes to the problem.
->complete() is supposed to be mandatory. Which gadget do you have that
->doesn't set ->complete() to a valid function pointer?
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170123/6f63a215/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-23 11:51 ` Felipe Balbi
@ 2017-01-23 17:34 ` Magnus Lilja
2017-01-24 8:52 ` Felipe Balbi
0 siblings, 1 reply; 10+ messages in thread
From: Magnus Lilja @ 2017-01-23 17:34 UTC (permalink / raw)
To: linux-arm-kernel
Hi
On 23 January 2017 at 12:51, Felipe Balbi <balbi@kernel.org> wrote:
>
> Hi,
>
> Magnus Lilja <lilja.magnus@gmail.com> writes:
>> Hi
>>
>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>> had the g_serial module loaded as well.
>>
>> The NULL pointer panic comes from gadget/udc/core.c
>> usb_gadget_giveback_request() which calls req->complete() and in some
>> cases req->complete is NULL.
>>
>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>> that req->complete is non-NULL was removed:
>>
>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>> ep->stopped = 1;
>>
>> spin_unlock(&ep->udc->lock);
>> - /* complete() is from gadget layer,
>> - * eg fsg->bulk_in_complete() */
>> - if (req->req.complete)
>> - req->req.complete(&ep->ep, &req->req);
>> +
>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>
>> spin_lock(&ep->udc->lock);
>> ep->stopped = stopped;
>>
>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>> least USB gadget operation using g_serial seems to work just fine.
>>
>> I don't know the logic in detail to understand whether this is a proper
>> fix or if there is some other more problem with the fls_udc_core driver.
>> Does anyone have input in this matter?
>>
>> I can produce a proper patch that fixes this problem by re-introducing
>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>> solution and I can also assist in testing other fixes to the problem.
>
> ->complete() is supposed to be mandatory. Which gadget do you have that
> ->doesn't set ->complete() to a valid function pointer?
I'm modprobing g_serial so the following modules are loaded (using my patch):
~ # lsmod
usb_f_acm
u_serial
g_serial
libcomposite
configfs
fsl_usb2_udc
Regards, Magnus
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-23 17:34 ` Magnus Lilja
@ 2017-01-24 8:52 ` Felipe Balbi
2017-01-24 9:41 ` Magnus Lilja
0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2017-01-24 8:52 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Magnus Lilja <lilja.magnus@gmail.com> writes:
>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>> had the g_serial module loaded as well.
>>>
>>> The NULL pointer panic comes from gadget/udc/core.c
>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>> cases req->complete is NULL.
>>>
>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>> that req->complete is non-NULL was removed:
>>>
>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>> ep->stopped = 1;
>>>
>>> spin_unlock(&ep->udc->lock);
>>> - /* complete() is from gadget layer,
>>> - * eg fsg->bulk_in_complete() */
>>> - if (req->req.complete)
>>> - req->req.complete(&ep->ep, &req->req);
>>> +
>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>
>>> spin_lock(&ep->udc->lock);
>>> ep->stopped = stopped;
>>>
>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>> least USB gadget operation using g_serial seems to work just fine.
>>>
>>> I don't know the logic in detail to understand whether this is a proper
>>> fix or if there is some other more problem with the fls_udc_core driver.
>>> Does anyone have input in this matter?
>>>
>>> I can produce a proper patch that fixes this problem by re-introducing
>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>> solution and I can also assist in testing other fixes to the problem.
>>
>> ->complete() is supposed to be mandatory. Which gadget do you have that
>> ->doesn't set ->complete() to a valid function pointer?
>
> I'm modprobing g_serial so the following modules are loaded (using my patch):
>
> ~ # lsmod
> usb_f_acm
> u_serial
> g_serial
> libcomposite
> configfs
> fsl_usb2_udc
okay, can you figure out which request is coming without ->complete()
set? To which endpoint is this request being queued? It would be nice to
know these details. Maybe this is an old bug which ought to be fixed.
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170124/0826a8cd/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 8:52 ` Felipe Balbi
@ 2017-01-24 9:41 ` Magnus Lilja
2017-01-24 10:54 ` Felipe Balbi
0 siblings, 1 reply; 10+ messages in thread
From: Magnus Lilja @ 2017-01-24 9:41 UTC (permalink / raw)
To: linux-arm-kernel
On 24 January 2017 at 09:52, Felipe Balbi <balbi@kernel.org> wrote:
>
> Hi,
>
> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>> had the g_serial module loaded as well.
>>>>
>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>> cases req->complete is NULL.
>>>>
>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>> that req->complete is non-NULL was removed:
>>>>
>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>> ep->stopped = 1;
>>>>
>>>> spin_unlock(&ep->udc->lock);
>>>> - /* complete() is from gadget layer,
>>>> - * eg fsg->bulk_in_complete() */
>>>> - if (req->req.complete)
>>>> - req->req.complete(&ep->ep, &req->req);
>>>> +
>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>
>>>> spin_lock(&ep->udc->lock);
>>>> ep->stopped = stopped;
>>>>
>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>
>>>> I don't know the logic in detail to understand whether this is a proper
>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>> Does anyone have input in this matter?
>>>>
>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>> solution and I can also assist in testing other fixes to the problem.
>>>
>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>> ->doesn't set ->complete() to a valid function pointer?
>>
>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>
>> ~ # lsmod
>> usb_f_acm
>> u_serial
>> g_serial
>> libcomposite
>> configfs
>> fsl_usb2_udc
>
> okay, can you figure out which request is coming without ->complete()
> set? To which endpoint is this request being queued? It would be nice to
> know these details. Maybe this is an old bug which ought to be fixed.
Sure, I can try figure that out. Any input to make the debug of the
faster is appreciated if you have any.
Regards, Magnus
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 9:41 ` Magnus Lilja
@ 2017-01-24 10:54 ` Felipe Balbi
2017-01-24 18:24 ` Magnus Lilja
0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2017-01-24 10:54 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Magnus Lilja <lilja.magnus@gmail.com> writes:
>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>>> had the g_serial module loaded as well.
>>>>>
>>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>>> cases req->complete is NULL.
>>>>>
>>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>>> that req->complete is non-NULL was removed:
>>>>>
>>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>>> ep->stopped = 1;
>>>>>
>>>>> spin_unlock(&ep->udc->lock);
>>>>> - /* complete() is from gadget layer,
>>>>> - * eg fsg->bulk_in_complete() */
>>>>> - if (req->req.complete)
>>>>> - req->req.complete(&ep->ep, &req->req);
>>>>> +
>>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>>
>>>>> spin_lock(&ep->udc->lock);
>>>>> ep->stopped = stopped;
>>>>>
>>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>>
>>>>> I don't know the logic in detail to understand whether this is a proper
>>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>>> Does anyone have input in this matter?
>>>>>
>>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>>> solution and I can also assist in testing other fixes to the problem.
>>>>
>>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>>> ->doesn't set ->complete() to a valid function pointer?
>>>
>>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>>
>>> ~ # lsmod
>>> usb_f_acm
>>> u_serial
>>> g_serial
>>> libcomposite
>>> configfs
>>> fsl_usb2_udc
>>
>> okay, can you figure out which request is coming without ->complete()
>> set? To which endpoint is this request being queued? It would be nice to
>> know these details. Maybe this is an old bug which ought to be fixed.
>
> Sure, I can try figure that out. Any input to make the debug of the
> faster is appreciated if you have any.
well, the easiest way is to add something like:
if (!req->complete)
dump_stack();
to fsl udc driver. Then you would know who queued the request without
->complete. A slightly better approach would be to:
if (WARN(!req->complete,
"%s: queueing request without ->complete\n", ep->name))
return;
Or something like that.
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170124/82b156a5/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 10:54 ` Felipe Balbi
@ 2017-01-24 18:24 ` Magnus Lilja
2017-01-24 18:34 ` Felipe Balbi
0 siblings, 1 reply; 10+ messages in thread
From: Magnus Lilja @ 2017-01-24 18:24 UTC (permalink / raw)
To: linux-arm-kernel
Hi
On 24 January 2017 at 11:54, Felipe Balbi <balbi@kernel.org> wrote:
>
> Hi,
>
> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>>>> had the g_serial module loaded as well.
>>>>>>
>>>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>>>> cases req->complete is NULL.
>>>>>>
>>>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>>>> that req->complete is non-NULL was removed:
>>>>>>
>>>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>>>> ep->stopped = 1;
>>>>>>
>>>>>> spin_unlock(&ep->udc->lock);
>>>>>> - /* complete() is from gadget layer,
>>>>>> - * eg fsg->bulk_in_complete() */
>>>>>> - if (req->req.complete)
>>>>>> - req->req.complete(&ep->ep, &req->req);
>>>>>> +
>>>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>>>
>>>>>> spin_lock(&ep->udc->lock);
>>>>>> ep->stopped = stopped;
>>>>>>
>>>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>>>
>>>>>> I don't know the logic in detail to understand whether this is a proper
>>>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>>>> Does anyone have input in this matter?
>>>>>>
>>>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>>>> solution and I can also assist in testing other fixes to the problem.
>>>>>
>>>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>>>> ->doesn't set ->complete() to a valid function pointer?
>>>>
>>>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>>>
>>>> ~ # lsmod
>>>> usb_f_acm
>>>> u_serial
>>>> g_serial
>>>> libcomposite
>>>> configfs
>>>> fsl_usb2_udc
>>>
>>> okay, can you figure out which request is coming without ->complete()
>>> set? To which endpoint is this request being queued? It would be nice to
>>> know these details. Maybe this is an old bug which ought to be fixed.
>>
>> Sure, I can try figure that out. Any input to make the debug of the
>> faster is appreciated if you have any.
>
> well, the easiest way is to add something like:
>
> if (!req->complete)
> dump_stack();
>
> to fsl udc driver. Then you would know who queued the request without
> ->complete. A slightly better approach would be to:
>
> if (WARN(!req->complete,
> "%s: queueing request without ->complete\n", ep->name))
> return;
>
> Or something like that.
Well, I think I found it.
fsl_udc_core.c:ep0_prime_status() sets req->req.complete = NULL before
it queues a transfer and my printk()'s indicate that this is indeed
the offending function.
fsl_udc_core.c:ch9getstatus() also sets complete to NULL but in my
tests right now I haven't seen that one.
So it's an internal problem in the fsl_udc_core.c file.
Regards, Magnus?
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 18:24 ` Magnus Lilja
@ 2017-01-24 18:34 ` Felipe Balbi
2017-01-24 18:40 ` Magnus Lilja
0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2017-01-24 18:34 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Magnus Lilja <lilja.magnus@gmail.com> writes:
>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>>>>> had the g_serial module loaded as well.
>>>>>>>
>>>>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>>>>> cases req->complete is NULL.
>>>>>>>
>>>>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>>>>> that req->complete is non-NULL was removed:
>>>>>>>
>>>>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>>>>> ep->stopped = 1;
>>>>>>>
>>>>>>> spin_unlock(&ep->udc->lock);
>>>>>>> - /* complete() is from gadget layer,
>>>>>>> - * eg fsg->bulk_in_complete() */
>>>>>>> - if (req->req.complete)
>>>>>>> - req->req.complete(&ep->ep, &req->req);
>>>>>>> +
>>>>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>>>>
>>>>>>> spin_lock(&ep->udc->lock);
>>>>>>> ep->stopped = stopped;
>>>>>>>
>>>>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>>>>
>>>>>>> I don't know the logic in detail to understand whether this is a proper
>>>>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>>>>> Does anyone have input in this matter?
>>>>>>>
>>>>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>>>>> solution and I can also assist in testing other fixes to the problem.
>>>>>>
>>>>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>>>>> ->doesn't set ->complete() to a valid function pointer?
>>>>>
>>>>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>>>>
>>>>> ~ # lsmod
>>>>> usb_f_acm
>>>>> u_serial
>>>>> g_serial
>>>>> libcomposite
>>>>> configfs
>>>>> fsl_usb2_udc
>>>>
>>>> okay, can you figure out which request is coming without ->complete()
>>>> set? To which endpoint is this request being queued? It would be nice to
>>>> know these details. Maybe this is an old bug which ought to be fixed.
>>>
>>> Sure, I can try figure that out. Any input to make the debug of the
>>> faster is appreciated if you have any.
>>
>> well, the easiest way is to add something like:
>>
>> if (!req->complete)
>> dump_stack();
>>
>> to fsl udc driver. Then you would know who queued the request without
>> ->complete. A slightly better approach would be to:
>>
>> if (WARN(!req->complete,
>> "%s: queueing request without ->complete\n", ep->name))
>> return;
>>
>> Or something like that.
>
> Well, I think I found it.
>
> fsl_udc_core.c:ep0_prime_status() sets req->req.complete = NULL before
> it queues a transfer and my printk()'s indicate that this is indeed
> the offending function.
>
> fsl_udc_core.c:ch9getstatus() also sets complete to NULL but in my
> tests right now I haven't seen that one.
>
> So it's an internal problem in the fsl_udc_core.c file.
seems like it. It's rather odd that fsl_udc doesn't wanna know about
completion of Status stage. Oh well, I guess in this case it doesn't
matter if you add a complete function or reinstate the previous check
for valid complete.
If you decide to reinstate the check, please add a comment above the
check explaining that fsl_udc itself queues requests with NULL
->complete().
I must say, however, that I would suggest adding a complete callback
since that will help us BUG with NULL pointer deref on bad gadget
drivers ;-)
--
balbi
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 18:34 ` Felipe Balbi
@ 2017-01-24 18:40 ` Magnus Lilja
2017-01-25 10:51 ` Felipe Balbi
0 siblings, 1 reply; 10+ messages in thread
From: Magnus Lilja @ 2017-01-24 18:40 UTC (permalink / raw)
To: linux-arm-kernel
On 24 January 2017 at 19:34, Felipe Balbi <balbi@kernel.org> wrote:
>
> Hi,
>
> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>> Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>>>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>>>>>> had the g_serial module loaded as well.
>>>>>>>>
>>>>>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>>>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>>>>>> cases req->complete is NULL.
>>>>>>>>
>>>>>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>>>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>>>>>> that req->complete is non-NULL was removed:
>>>>>>>>
>>>>>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>>>>>> ep->stopped = 1;
>>>>>>>>
>>>>>>>> spin_unlock(&ep->udc->lock);
>>>>>>>> - /* complete() is from gadget layer,
>>>>>>>> - * eg fsg->bulk_in_complete() */
>>>>>>>> - if (req->req.complete)
>>>>>>>> - req->req.complete(&ep->ep, &req->req);
>>>>>>>> +
>>>>>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>>>>>
>>>>>>>> spin_lock(&ep->udc->lock);
>>>>>>>> ep->stopped = stopped;
>>>>>>>>
>>>>>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>>>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>>>>>
>>>>>>>> I don't know the logic in detail to understand whether this is a proper
>>>>>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>>>>>> Does anyone have input in this matter?
>>>>>>>>
>>>>>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>>>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>>>>>> solution and I can also assist in testing other fixes to the problem.
>>>>>>>
>>>>>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>>>>>> ->doesn't set ->complete() to a valid function pointer?
>>>>>>
>>>>>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>>>>>
>>>>>> ~ # lsmod
>>>>>> usb_f_acm
>>>>>> u_serial
>>>>>> g_serial
>>>>>> libcomposite
>>>>>> configfs
>>>>>> fsl_usb2_udc
>>>>>
>>>>> okay, can you figure out which request is coming without ->complete()
>>>>> set? To which endpoint is this request being queued? It would be nice to
>>>>> know these details. Maybe this is an old bug which ought to be fixed.
>>>>
>>>> Sure, I can try figure that out. Any input to make the debug of the
>>>> faster is appreciated if you have any.
>>>
>>> well, the easiest way is to add something like:
>>>
>>> if (!req->complete)
>>> dump_stack();
>>>
>>> to fsl udc driver. Then you would know who queued the request without
>>> ->complete. A slightly better approach would be to:
>>>
>>> if (WARN(!req->complete,
>>> "%s: queueing request without ->complete\n", ep->name))
>>> return;
>>>
>>> Or something like that.
>>
>> Well, I think I found it.
>>
>> fsl_udc_core.c:ep0_prime_status() sets req->req.complete = NULL before
>> it queues a transfer and my printk()'s indicate that this is indeed
>> the offending function.
>>
>> fsl_udc_core.c:ch9getstatus() also sets complete to NULL but in my
>> tests right now I haven't seen that one.
>>
>> So it's an internal problem in the fsl_udc_core.c file.
>
> seems like it. It's rather odd that fsl_udc doesn't wanna know about
> completion of Status stage. Oh well, I guess in this case it doesn't
> matter if you add a complete function or reinstate the previous check
> for valid complete.
>
> If you decide to reinstate the check, please add a comment above the
> check explaining that fsl_udc itself queues requests with NULL
> ->complete().
>
> I must say, however, that I would suggest adding a complete callback
> since that will help us BUG with NULL pointer deref on bad gadget
> drivers ;-)
I can do that. Such a complete() callback function would be a no-op
then I assume (with a comment in it why it is a no-op).
Regards, Magnus
^ permalink raw reply [flat|nested] 10+ messages in thread
* usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK
2017-01-24 18:40 ` Magnus Lilja
@ 2017-01-25 10:51 ` Felipe Balbi
0 siblings, 0 replies; 10+ messages in thread
From: Felipe Balbi @ 2017-01-25 10:51 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Magnus Lilja <lilja.magnus@gmail.com> writes:
>>>>>>>>> I tried the fsl_udc_core gadget driver on the i.MX31 PDK board and got a
>>>>>>>>> kernel panic (NULL pointer dereference) when connecting the USB cable. I
>>>>>>>>> had the g_serial module loaded as well.
>>>>>>>>>
>>>>>>>>> The NULL pointer panic comes from gadget/udc/core.c
>>>>>>>>> usb_gadget_giveback_request() which calls req->complete() and in some
>>>>>>>>> cases req->complete is NULL.
>>>>>>>>>
>>>>>>>>> Commit 304f7e5e1d08 ("usb: gadget: Refactor request completion") changed
>>>>>>>>> fsl_udc2_core.c (and several other files) and in fsl_udc2_core.c a check
>>>>>>>>> that req->complete is non-NULL was removed:
>>>>>>>>>
>>>>>>>>> --- a/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>>>> +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
>>>>>>>>> @@ -197,10 +197,8 @@ __acquires(ep->udc->lock)
>>>>>>>>> ep->stopped = 1;
>>>>>>>>>
>>>>>>>>> spin_unlock(&ep->udc->lock);
>>>>>>>>> - /* complete() is from gadget layer,
>>>>>>>>> - * eg fsg->bulk_in_complete() */
>>>>>>>>> - if (req->req.complete)
>>>>>>>>> - req->req.complete(&ep->ep, &req->req);
>>>>>>>>> +
>>>>>>>>> + usb_gadget_giveback_request(&ep->ep, &req->req);
>>>>>>>>>
>>>>>>>>> spin_lock(&ep->udc->lock);
>>>>>>>>> ep->stopped = stopped;
>>>>>>>>>
>>>>>>>>> If I re-introduce the check (either in fsl_udc_core.c or core.c) at
>>>>>>>>> least USB gadget operation using g_serial seems to work just fine.
>>>>>>>>>
>>>>>>>>> I don't know the logic in detail to understand whether this is a proper
>>>>>>>>> fix or if there is some other more problem with the fls_udc_core driver.
>>>>>>>>> Does anyone have input in this matter?
>>>>>>>>>
>>>>>>>>> I can produce a proper patch that fixes this problem by re-introducing
>>>>>>>>> the check (in either fsl_udc_core.c or core.c) if that is a proper
>>>>>>>>> solution and I can also assist in testing other fixes to the problem.
>>>>>>>>
>>>>>>>> ->complete() is supposed to be mandatory. Which gadget do you have that
>>>>>>>> ->doesn't set ->complete() to a valid function pointer?
>>>>>>>
>>>>>>> I'm modprobing g_serial so the following modules are loaded (using my patch):
>>>>>>>
>>>>>>> ~ # lsmod
>>>>>>> usb_f_acm
>>>>>>> u_serial
>>>>>>> g_serial
>>>>>>> libcomposite
>>>>>>> configfs
>>>>>>> fsl_usb2_udc
>>>>>>
>>>>>> okay, can you figure out which request is coming without ->complete()
>>>>>> set? To which endpoint is this request being queued? It would be nice to
>>>>>> know these details. Maybe this is an old bug which ought to be fixed.
>>>>>
>>>>> Sure, I can try figure that out. Any input to make the debug of the
>>>>> faster is appreciated if you have any.
>>>>
>>>> well, the easiest way is to add something like:
>>>>
>>>> if (!req->complete)
>>>> dump_stack();
>>>>
>>>> to fsl udc driver. Then you would know who queued the request without
>>>> ->complete. A slightly better approach would be to:
>>>>
>>>> if (WARN(!req->complete,
>>>> "%s: queueing request without ->complete\n", ep->name))
>>>> return;
>>>>
>>>> Or something like that.
>>>
>>> Well, I think I found it.
>>>
>>> fsl_udc_core.c:ep0_prime_status() sets req->req.complete = NULL before
>>> it queues a transfer and my printk()'s indicate that this is indeed
>>> the offending function.
>>>
>>> fsl_udc_core.c:ch9getstatus() also sets complete to NULL but in my
>>> tests right now I haven't seen that one.
>>>
>>> So it's an internal problem in the fsl_udc_core.c file.
>>
>> seems like it. It's rather odd that fsl_udc doesn't wanna know about
>> completion of Status stage. Oh well, I guess in this case it doesn't
>> matter if you add a complete function or reinstate the previous check
>> for valid complete.
>>
>> If you decide to reinstate the check, please add a comment above the
>> check explaining that fsl_udc itself queues requests with NULL
>> ->complete().
>>
>> I must say, however, that I would suggest adding a complete callback
>> since that will help us BUG with NULL pointer deref on bad gadget
>> drivers ;-)
>
> I can do that. Such a complete() callback function would be a no-op
> then I assume (with a comment in it why it is a no-op).
that's right :-)
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170125/908fb890/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-01-25 10:51 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-17 21:21 usb: gadget: Kernel panic (NULL pointer dereference) when using fsl_udc2_core on i.MX31 PDK Magnus Lilja
2017-01-23 11:51 ` Felipe Balbi
2017-01-23 17:34 ` Magnus Lilja
2017-01-24 8:52 ` Felipe Balbi
2017-01-24 9:41 ` Magnus Lilja
2017-01-24 10:54 ` Felipe Balbi
2017-01-24 18:24 ` Magnus Lilja
2017-01-24 18:34 ` Felipe Balbi
2017-01-24 18:40 ` Magnus Lilja
2017-01-25 10:51 ` Felipe Balbi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).