From: Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
Cc: Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Bin Liu <b-liu-l0cyMroinI0@public.gmane.org>,
linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: musb RPM sleep-while-atomic in 4.9-rc1
Date: Fri, 28 Oct 2016 11:44:28 +0200 [thread overview]
Message-ID: <20161028094428.GO12024@localhost> (raw)
In-Reply-To: <20161027191552.tuutyslp5qtu2b4f-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
On Thu, Oct 27, 2016 at 12:15:52PM -0700, Tony Lindgren wrote:
> * Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> [161027 11:46]:
> > On Thu, Oct 27, 2016 at 10:40:17AM -0700, Tony Lindgren wrote:
> > > diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
> > > --- a/drivers/usb/musb/musb_gadget.c
> > > +++ b/drivers/usb/musb/musb_gadget.c
> > > @@ -1222,6 +1222,13 @@ void musb_ep_restart(struct musb *musb, struct musb_request *req)
> > > rxstate(musb, req);
> > > }
> > >
> > > +void musb_ep_restart_resume_work(struct musb *musb, void *data)
> > > +{
> > > + struct musb_request *req = data;
> > > +
> > > + musb_ep_restart(musb, req);
> >
> > This one is supposed to be called with musb->lock held (according to the
> > function header anyway).
>
> Good point, yeah that calls the monster functions txstate and rxstate.
>
> > > static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
> > > gfp_t gfp_flags)
> > > {
> > > @@ -1255,7 +1262,7 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
> > >
> > > map_dma_buffer(request, musb, musb_ep);
> > >
> > > - pm_runtime_get_sync(musb->controller);
> > > + pm_runtime_get(musb->controller);
> > > spin_lock_irqsave(&musb->lock, lockflags);
> > >
> > > /* don't queue if the ep is down */
> > > @@ -1271,8 +1278,13 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
> > > list_add_tail(&request->list, &musb_ep->req_list);
> > >
> > > /* it this is the head of the queue, start i/o ... */
> > > - if (!musb_ep->busy && &request->list == musb_ep->req_list.next)
> > > - musb_ep_restart(musb, request);
> > > + if (!musb_ep->busy && &request->list == musb_ep->req_list.next) {
> > > + if (pm_runtime_active(musb->controller))
> > > + musb_ep_restart(musb, request);
> > > + else
> > > + musb_queue_on_resume(musb, musb_ep_restart_resume_work,
> > > + request);
> > > + }
> >
> > But then this looks like it could trigger an ABBA deadlock as musb->lock
> > is held while queue_on_resume() takes musb->list_lock, and
> > musb_run_pending() would take the same locks in the reverse order.
>
> It seems we can avoid that by locking only list_add_tail() and list_del():
>
> list_for_each_entry_safe(w, _w, &musb->resume_work, node) {
> spin_lock_irqsave(&musb->list_lock, flags);
> list_del(&w->node);
> spin_unlock_irqrestore(&musb->list_lock, flags);
> if (w->callback)
> w->callback(musb, w->data);
> devm_kfree(musb->controller, w);
> }
I think you still need to hold the lock while traversing the list (even
if you temporarily release it during the callback).
But this is related to another issue; what if a new callback is
registered while musb_runtime_resume is running? It seems we could end
up queueing work which might never be executed (e.g. if queued just
after musb_run_pending() is done or while processing the last
callback).
> Or do you have some better ideas?
Not right now sorry, and I'll be away from keyboard the rest of the day,
I'm afraid.
Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-10-28 9:44 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-20 15:37 musb RPM sleep-while-atomic in 4.9-rc1 Johan Hovold
2016-10-21 7:08 ` Tony Lindgren
[not found] ` <20161021070848.rum7wrlihjayqdbh-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-21 9:25 ` Johan Hovold
2016-10-21 9:49 ` Tony Lindgren
[not found] ` <20161021094904.q66kjsl33yzf2kir-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-21 11:07 ` Johan Hovold
2016-10-21 11:27 ` Tony Lindgren
[not found] ` <20161021112745.lancojpgv4h6aqpw-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-24 17:35 ` Tony Lindgren
[not found] ` <20161024173538.26xvlitxiwjmh4fx-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-25 8:32 ` Johan Hovold
2016-10-25 15:11 ` Tony Lindgren
[not found] ` <20161025151110.vih52s47a2g2col5-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-26 14:20 ` Johan Hovold
2016-10-26 14:31 ` Tony Lindgren
[not found] ` <20161026143100.rg4pse6mjyq32hxm-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-27 15:14 ` Tony Lindgren
[not found] ` <20161027151446.ffj6w2tydf6ymv7c-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-27 16:44 ` Johan Hovold
2016-10-27 17:40 ` Tony Lindgren
[not found] ` <20161027174016.43twztwekvb3b25t-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-27 18:45 ` Johan Hovold
2016-10-27 19:15 ` Tony Lindgren
[not found] ` <20161027191552.tuutyslp5qtu2b4f-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-28 9:44 ` Johan Hovold [this message]
2016-10-28 18:13 ` Tony Lindgren
[not found] ` <20161028181318.umwn3rx55pg2cvwd-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-10-31 11:49 ` Johan Hovold
2016-11-03 21:26 ` Tony Lindgren
[not found] ` <20161103212635.GC21430-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2016-11-03 22:01 ` Ladislav Michl
2016-11-04 14:16 ` Johan Hovold
2016-11-04 15:13 ` Tony Lindgren
2016-11-07 18:28 ` Tony Lindgren
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=20161028094428.GO12024@localhost \
--to=johan-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=b-liu-l0cyMroinI0@public.gmane.org \
--cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.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 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.