From: Oliver Neukum <oneukum@suse.com>
To: yuan linyu <yuanlinyu@hihonor.com>,
Alan Stern <stern@rowland.harvard.edu>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH v1] usb: f_mass_storage: reduce chance to queue disable ep
Date: Thu, 14 Mar 2024 08:53:45 +0100 [thread overview]
Message-ID: <2233fe16-ca3e-4a5e-bc69-a2447ddd2e82@suse.com> (raw)
In-Reply-To: <20240314065949.2627778-1-yuanlinyu@hihonor.com>
Hi,
I am sorry, but this contains a major issue.
On 14.03.24 07:59, yuan linyu wrote:
> It is possible trigger below warning message from mass storage function,
>
> ------------[ cut here ]------------
> WARNING: CPU: 6 PID: 3839 at drivers/usb/gadget/udc/core.c:294 usb_ep_queue+0x7c/0x104
> CPU: 6 PID: 3839 Comm: file-storage Tainted: G S WC O 6.1.25-android14-11-g354e2a7e7cd9 #1
> pstate: 22400005 (nzCv daif +PAN -UAO +TCO -DIT -SSBS BTYPE=--)
> pc : usb_ep_queue+0x7c/0x104
> lr : fsg_main_thread+0x494/0x1b3c
>
> Root cause is mass storage function try to queue request from main thread,
> but other thread may already disable ep when function disable.
>
> As mass storage function have record of ep enable/disable state, let's
> add the state check before queue request to UDC, it maybe avoid warning.
>
> Also use common lock to protect ep state which avoid race between main
> thread and function disable.
>
> Cc: <stable@vger.kernel.org> # 6.1
> Signed-off-by: yuan linyu <yuanlinyu@hihonor.com>
Nacked-by: Oliver Neukum <oneukum@suse.com>
> ---
> drivers/usb/gadget/function/f_mass_storage.c | 18 +++++++++++++++++-
> 1 file changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
> index c265a1f62fc1..056083cb68cb 100644
> --- a/drivers/usb/gadget/function/f_mass_storage.c
> +++ b/drivers/usb/gadget/function/f_mass_storage.c
> @@ -520,12 +520,25 @@ static int fsg_setup(struct usb_function *f,
> static int start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
> struct usb_request *req)
> {
> + unsigned long flags;
> int rc;
>
> - if (ep == fsg->bulk_in)
> + spin_lock_irqsave(&fsg->common->lock, flags);
Taking a spinlock.
> + if (ep == fsg->bulk_in) {
> + if (!fsg->bulk_in_enabled) {
> + spin_unlock_irqrestore(&fsg->common->lock, flags);
> + return -ESHUTDOWN;
> + }
> dump_msg(fsg, "bulk-in", req->buf, req->length);
> + } else {
> + if (!fsg->bulk_out_enabled) {
> + spin_unlock_irqrestore(&fsg->common->lock, flags);
> + return -ESHUTDOWN;
> + }
> + }
>
> rc = usb_ep_queue(ep, req, GFP_KERNEL);
This can sleep.
> + spin_unlock_irqrestore(&fsg->common->lock, flags);
Giving up the lock.
Sorry, now for the longer explanation. You'd introduce a deadlock.
You just cannot sleep with a spinlock held. It seems to me that
if you want to do this cleanly, you need to revisit the locking
to use locks you can sleep under.
HTH
Oliver
next prev parent reply other threads:[~2024-03-14 7:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-14 6:59 [PATCH v1] usb: f_mass_storage: reduce chance to queue disable ep yuan linyu
2024-03-14 7:53 ` Oliver Neukum [this message]
2024-03-14 8:14 ` yuanlinyu
2024-03-14 9:20 ` yuanlinyu
2024-03-14 15:02 ` Alan Stern
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=2233fe16-ca3e-4a5e-bc69-a2447ddd2e82@suse.com \
--to=oneukum@suse.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-usb@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=stern@rowland.harvard.edu \
--cc=yuanlinyu@hihonor.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox