From: Felipe Balbi <balbi@kernel.org>
To: Roger Quadros <rogerq@ti.com>, Jack Pham <jackp@codeaurora.org>
Cc: "linux-usb\@vger.kernel.org" <linux-usb@vger.kernel.org>,
"Bin Liu \[EP\]" <b-liu@ti.com>
Subject: Re: g_audio breaks with dwc3
Date: Wed, 30 Oct 2019 13:26:35 +0200 [thread overview]
Message-ID: <87bltyfp90.fsf@gmail.com> (raw)
In-Reply-To: <9ca2f64b-2cbc-3757-2e5f-233b968f3dd1@ti.com>
Hi,
Roger Quadros <rogerq@ti.com> writes:
>>>> irq/170-dwc3-1240 [000] d... 85.450564: dwc3_gadget_giveback: ep1out: req ee75d6ac length 0/256 zsI ==> -108
>>>> irq/170-dwc3-1240 [000] d... 85.450566: dwc3_gadget_giveback: ep1out: req c26c10a3 length 0/256 zsI ==> -108
>>>> irq/170-dwc3-1240 [000] d... 85.450567: dwc3_gadget_giveback: : req d4301893 length 0/0 zsI ==> 0
>>>
>>> Giveback happens on above two reqs after they are already freed. Could
>>> it be due to f_uac2 / u_audio.c performing usb_ep_free_request()
>>> immediately after usb_ep_dequeue() without waiting for completion?
>>
>> this could be a race condition. Add a trace_printk() at the cancelation,
>> see if the request is moved to cancelled list.
>>
>> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
>> index 86dc1db788a9..affc2f7a929d 100644
>> --- a/drivers/usb/dwc3/gadget.c
>> +++ b/drivers/usb/dwc3/gadget.c
>> @@ -1513,6 +1513,7 @@ static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep)
>> struct dwc3_request *tmp;
>>
>> list_for_each_entry_safe(req, tmp, &dep->cancelled_list, list) {
>> + trace_printk("---> completing cancellation of req %p\n", req);
>> dwc3_gadget_ep_skip_trbs(dep, req);
>> dwc3_gadget_giveback(dep, req, -ECONNRESET);
>> }
>> @@ -1551,6 +1552,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
>> if (!r->trb)
>> goto out0;
>>
>> + trace_printk("---> req %p moved to cancelled\n", req);
>> dwc3_gadget_move_cancelled_request(req);
>> if (dep->flags & DWC3_EP_TRANSFER_STARTED)
>> goto out0;
>>
>>
>
> Below is trace with above debug patch applied.
Did it fail the same way? It doesn't look like in the trace.
Does this help?
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 86dc1db788a9..a9aba716bf80 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -707,6 +707,12 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
}
+
+ while (!list_empty(&dep->cancelled_list)) {
+ req = next_request(&dep->cancelled_list);
+
+ dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
+ }
}
/**
--
balbi
next prev parent reply other threads:[~2019-10-30 11:26 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-29 11:30 g_audio breaks with dwc3 Roger Quadros
2019-10-29 12:25 ` Felipe Balbi
2019-10-29 12:33 ` Roger Quadros
2019-10-30 8:17 ` Jack Pham
2019-10-30 8:57 ` Felipe Balbi
2019-10-30 10:00 ` Roger Quadros
2019-10-30 11:26 ` Felipe Balbi [this message]
2019-10-30 12:39 ` Roger Quadros
2019-10-31 8:56 ` Felipe Balbi
2019-10-30 10:08 ` Roger Quadros
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bltyfp90.fsf@gmail.com \
--to=balbi@kernel.org \
--cc=b-liu@ti.com \
--cc=jackp@codeaurora.org \
--cc=linux-usb@vger.kernel.org \
--cc=rogerq@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.