From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Linux-pm mailing list <linux-pm@lists.linux-foundation.org>
Subject: Re: Runtime resume of children
Date: Mon, 23 Nov 2009 21:44:31 +0100 [thread overview]
Message-ID: <200911232144.31499.rjw@sisk.pl> (raw)
In-Reply-To: <Pine.LNX.4.44L0.0911221642110.31173-100000@netrider.rowland.org>
On Sunday 22 November 2009, Alan Stern wrote:
> Rafael:
>
> Here's the situation. Device A has children B1, ..., Bn (possibly
> others too). I need to guarantee that whenever A is active, so are the
> children.
But it's perfectly valid to have an inactive device under an active parent, so
I guess this is not a general case.
> One direction seems easy enough. I can make the idle handler for the
> B's first check that A and all the B's are ready to be suspended, then
> suspend all the B's, and then suspend A. This works because the PM and
> driver cores never directly suspend a device; all the do is notify the
> idle handler.
>
> The other direction is a little more complicated. Resumes initiated by
> the bus code aren't troublesome; they can always be written so as to
> resume the B's along with the A's. The real problem arises when A is
> resumed directly by the PM or driver cores. For example, consider what
> would happen when one of B1's children sends a remote wakeup signal.
> The PM core would automatically resume B1 and A, but there would be no
> chance for the bus code to resume the other B's.
pm_runtime_resume() schedules an idle request for 'dev' at the end,
which theoretically may resume the B's that are still suspended. There still
would be a delay, though.
> I can't make the runtime_resume method for A call pm_runtime_resume()
> for all the B's. It would deadlock inside __pm_runtime_resume() where
> the code to resume B1 waits for A's resume to complete.
>
> Calling pm_request_resume() for all the B's instead isn't a very good
> solution. For one thing, it's silly to add latency by using a work
> queue instead of just doing the resumes directly. There are also
> problems of synchronization, such as the fact that other code expects
> all the B's to be resumed when A's resume completes.
>
> Do you have any ideas on how to approach this? How about allowing A's
> runtime_resume method to set A->power.runtime_status to RPM_ACTIVE,
> before it tries to resume the B's? That would avoid the deadlock.
I don't see a problem with that as long as the A's runtime_resume returns 0 in
such a case.
Thanks,
Rafael
next prev parent reply other threads:[~2009-11-23 20:44 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-22 22:13 Runtime resume of children Alan Stern
2009-11-23 20:44 ` Rafael J. Wysocki [this message]
2009-11-23 20:59 ` Alan Stern
2009-11-23 22:11 ` Rafael J. Wysocki
2009-11-25 9:41 ` Oliver Neukum
2009-11-25 20:46 ` Alan Stern
2009-11-26 16:47 ` Oliver Neukum
2009-11-27 13:20 ` Mark Brown
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=200911232144.31499.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=linux-pm@lists.linux-foundation.org \
--cc=stern@rowland.harvard.edu \
/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