linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Felipe Balbi <balbi@kernel.org>
To: Wesley Cheng <wcheng@codeaurora.org>,
	Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>
Cc: "linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"jackp@codeaurora.org" <jackp@codeaurora.org>
Subject: Re: [PATCH v2] usb: dwc3: gadget: Avoid canceling current request for queuing error
Date: Wed, 05 May 2021 15:57:03 +0300	[thread overview]
Message-ID: <8735v1ibj4.fsf@kernel.org> (raw)
In-Reply-To: <513e6c16-9586-c78e-881b-08e0a73c50a8@codeaurora.org>

[-- Attachment #1: Type: text/plain, Size: 3136 bytes --]


Hi,

Wesley Cheng <wcheng@codeaurora.org> writes:
> On 5/3/2021 7:20 PM, Thinh Nguyen wrote:
>> Hi,
>> 
>> Wesley Cheng wrote:
>>> If an error is received when issuing a start or update transfer
>>> command, the error handler will stop all active requests (including
>>> the current USB request), and call dwc3_gadget_giveback() to notify
>>> function drivers of the requests which have been stopped.  Avoid
>>> having to cancel the current request which is trying to be queued, as
>>> the function driver will handle the EP queue error accordingly.
>>> Simply unmap the request as it was done before, and allow previously
>>> started transfers to be cleaned up.
>>>
>
> Hi Thinh,
>
>> 
>> It looks like you're still letting dwc3 stopping and cancelling all the
>> active requests instead letting the function driver doing the dequeue.
>> 
>
> Yeah, main issue isn't due to the function driver doing dequeue, but
> having cleanup (ie USB request free) if there is an error during
> usb_ep_queue().
>
> The function driver in question at the moment is the f_fs driver in AIO
> mode.  When async IO is enabled in the FFS driver, every time it queues
> a packet, it will allocate a io_data struct beforehand.  If the
> usb_ep_queue() fails it will free this io_data memory.  Problem is that,
> since the DWC3 gadget calls the completion with -ECONNRESET, the FFS
> driver will also schedule a work item (within io_data struct) to handle
> the completion.  So you end up with a flow like below
>
> allocate io_data (ffs)
>  --> usb_ep_queue()
>    --> __dwc3_gadget_kick_transfer()
>    --> dwc3_send_gadget_ep_cmd(EINVAL)
>    --> dwc3_gadget_ep_cleanup_cancelled_requests()
>    --> dwc3_gadget_giveback(ECONNRESET)
> ffs completion callback
> queue work item within io_data
>  --> usb_ep_queue returns EINVAL
> ffs frees io_data
> ...
>
> work scheduled
>  --> NULL pointer/memory fault as io_data is freed

I have some vague memory of discussing (something like) this with Alan
Stern long ago and the conclusion was that the gadget driver should
handle cases such as this. OTOH, we're returning failure during
usb_ep_queue() which tells me there's something with dwc3 (perhaps not
exclusively, but that's yet to be shown).

If I understood the whole thing correctly, we want everything except the
current request (the one that failed START or UPDATE transfer) to go
through giveback(). This really tells me that we're not handling error
case in kick_transfer and/or prepare_trbs() correctly.

I also don't want to pass another argument to kick_transfer because it
should be unnecessary: the current request should *always* be the last
one in the list. Therefore we should rely on something like
list_last_entry() followed by list_for_each_entry_safe_reverse() to
handle this without a special case.

ret = dwc3_send_gadget_ep_cmd();
if (ret < 0) {
	current = list_last_entry();

	unmap(current);
        for_each_trb_in(current) {
        	clear_HWO(trb);
        }

	list_for_entry_safe_reverse() {
        	move_cancelled();
        }
}

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 511 bytes --]

  parent reply	other threads:[~2021-05-05 12:57 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-04  1:21 [PATCH v2] usb: dwc3: gadget: Avoid canceling current request for queuing error Wesley Cheng
2021-05-04  2:20 ` Thinh Nguyen
2021-05-04  2:45   ` Wesley Cheng
2021-05-04  3:12     ` Thinh Nguyen
2021-05-04  3:27       ` Wesley Cheng
2021-05-04  5:22         ` Thinh Nguyen
2021-05-04  8:24           ` Wesley Cheng
2021-05-05  1:50             ` Thinh Nguyen
2021-05-05  3:37               ` Wesley Cheng
2021-05-05 12:59               ` Felipe Balbi
2021-05-05 12:57     ` Felipe Balbi [this message]
2021-05-05 15:19       ` Alan Stern
2021-05-05 18:01         ` Wesley Cheng
2021-05-05 18:31         ` Thinh Nguyen
2021-05-05 18:46           ` Alan Stern
2021-05-06  9:04           ` Felipe Balbi
2021-05-06 18:06             ` Thinh Nguyen
2021-05-05 17:59       ` Wesley Cheng
2021-05-06  9:00         ` Felipe Balbi
2021-05-05 19:06       ` Thinh Nguyen
2021-05-05 12:50 ` Felipe Balbi

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=8735v1ibj4.fsf@kernel.org \
    --to=balbi@kernel.org \
    --cc=Thinh.Nguyen@synopsys.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jackp@codeaurora.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=wcheng@codeaurora.org \
    /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 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).