From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Alan Stern <stern@rowland.harvard.edu>,
Zhang Rui <rui.zhang@intel.com>,
LKML <linux-kernel@vger.kernel.org>,
ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
pm list <linux-pm@lists.linux-foundation.org>
Subject: Re: Async suspend-resume patch w/ rwsems (was: Re: [GIT PULL] PM updates for 2.6.33)
Date: Wed, 9 Dec 2009 00:24:24 +0100 [thread overview]
Message-ID: <200912090024.24199.rjw@sisk.pl> (raw)
In-Reply-To: <200912082355.00711.rjw@sisk.pl>
On Tuesday 08 December 2009, Rafael J. Wysocki wrote:
> On Tuesday 08 December 2009, Rafael J. Wysocki wrote:
> > On Tuesday 08 December 2009, Rafael J. Wysocki wrote:
> > > On Tuesday 08 December 2009, Linus Torvalds wrote:
> > > >
> > > > On Tue, 8 Dec 2009, Rafael J. Wysocki wrote:
> > > > >
> > > > > Anyway, if we use an rwsem, it won't be checkable from interrupt context just
> > > > > as well.
> > > >
> > > > You can't do a lock() from an interrupt, but the unlocks should be
> > > > irq-safe.
> > > >
> > > > > Suppose we use rwsem and during suspend each child uses a down_read() on a
> > > > > parent and then the parent uses down_write() on itself. What if, whatever the
> > > > > reason, the parent is a bit early and does the down_write() before one of the
> > > > > children has a chance to do the down_read()? Aren't we toast?
> > > >
> > > > We're toast, but we're toast for a totally unrealted reason: it means that
> > > > you tried to resume a child before a parent, which would be a major bug to
> > > > begin with.
> > > >
> > > > Look, I even wrote out the comments, so let me repeat the code one more
> > > > time.
> > > >
> > > > - suspend time calling:
> > > > // This won't block, because we suspend nodes before parents
> > > > down_read(node->parent->lock);
> > > > // Do the part that may block asynchronously
> > > > async_schedule(do_usb_node_suspend, node);
> > > >
> > > > - resume time calling:
> > > > // This won't block, because we resume parents before children,
> > > > // and the children will take the read lock.
> > > > down_write(leaf->lock);
> > > > // Do the blocking part asynchronously
> > > > async_schedule(usb_node_resume, leaf);
> > > >
> > > > See? So when we take the parent lock for suspend, we are guaranteed to do
> > > > so _before_ the parent node itself suspends. And conversely, when we take
> > > > the parent lock (asynchronously) for resume, we're guaranteed to do that
> > > > _after_ the parent node has done its own down_write.
> > > >
> > > > And that all depends on just one trivial thing; that the suspend and
> > > > resume is called in the right order (children first vs parent first
> > > > respectively). And that is such a _major_ correctness issue that if that
> > > > isn't correct, your suspend isn't going to work _anyway_.
> > >
> > > Understood (I think).
> > >
> > > Let's try it, then. Below is the resume patch based on my previous one in this
> > > thread (I have only verified that it builds).
> >
> > Ah, I need to check if dev->parent is not NULL before trying to lock it, but
> > apart from this it doesn't break things at least.
>
> For completness, below is the full async suspend/resume patch with rwlocks,
> that has been (very slightly) tested and doesn't seem to break things.
>
> [Note to Alan: lockdep doesn't seem to complain about the not annotated nested
> locks.]
BTW, I can easily change it so that it uses completions for synchronization,
but I'm not sure if that's worth spending time on, so please let me know.
Rafael
next prev parent reply other threads:[~2009-12-08 23:23 UTC|newest]
Thread overview: 234+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-05 21:16 [GIT PULL] PM updates for 2.6.33 Rafael J. Wysocki
2009-12-05 21:43 ` Linus Torvalds
2009-12-05 21:58 ` Linus Torvalds
2009-12-05 23:55 ` Rafael J. Wysocki
2009-12-06 0:45 ` Arjan van de Ven
2009-12-06 1:26 ` Rafael J. Wysocki
2009-12-06 1:58 ` Arjan van de Ven
2009-12-06 8:39 ` Ingo Molnar
2009-12-06 0:48 ` Linus Torvalds
2009-12-06 1:54 ` Rafael J. Wysocki
2009-12-06 1:57 ` Rafael J. Wysocki
2009-12-06 2:05 ` Linus Torvalds
2009-12-06 2:36 ` Rafael J. Wysocki
2009-12-06 15:23 ` Alan Stern
2009-12-06 19:04 ` [linux-pm] " Victor Lowther
2009-12-07 3:57 ` Zhang Rui
2009-12-07 5:57 ` Linus Torvalds
2009-12-07 6:15 ` Linus Torvalds
2009-12-17 23:28 ` Benjamin Herrenschmidt
2009-12-07 6:37 ` Arjan van de Ven
2009-12-07 15:13 ` Alan Stern
2009-12-07 16:31 ` Linus Torvalds
2009-12-07 16:55 ` Linus Torvalds
2009-12-07 17:52 ` Alan Stern
2009-12-07 18:05 ` Linus Torvalds
2009-12-07 20:37 ` Alan Stern
2009-12-07 20:48 ` Linus Torvalds
2009-12-07 21:32 ` Alan Stern
2009-12-07 21:41 ` Linus Torvalds
2009-12-07 21:47 ` Rafael J. Wysocki
2009-12-07 22:01 ` Alan Stern
2009-12-07 22:06 ` Linus Torvalds
2009-12-07 22:21 ` Alan Stern
2009-12-07 22:26 ` Linus Torvalds
2009-12-07 23:16 ` Alan Stern
2009-12-07 22:02 ` Rafael J. Wysocki
2009-12-07 22:16 ` Linus Torvalds
2009-12-07 23:51 ` Rafael J. Wysocki
2009-12-08 3:27 ` Alan Stern
2009-12-08 12:23 ` Async resume patch (was: Re: [GIT PULL] PM updates for 2.6.33) Rafael J. Wysocki
2009-12-08 12:35 ` Rafael J. Wysocki
2009-12-08 15:35 ` Linus Torvalds
2009-12-08 15:55 ` Alan Stern
2009-12-08 16:42 ` Linus Torvalds
2009-12-08 18:08 ` Alan Stern
2009-12-08 18:41 ` Linus Torvalds
2009-12-08 18:52 ` Linus Torvalds
2009-12-08 19:34 ` Alan Stern
2009-12-08 19:30 ` Alan Stern
2009-12-08 20:48 ` Linus Torvalds
2009-12-08 21:32 ` Alan Stern
2009-12-08 21:52 ` Christian Borntraeger
2009-12-08 22:16 ` Linus Torvalds
2009-12-09 19:06 ` Alan Stern
2009-12-09 21:52 ` Linus Torvalds
2009-12-08 19:44 ` Rafael J. Wysocki
2009-12-08 20:16 ` Alan Stern
2009-12-08 20:30 ` Rafael J. Wysocki
2009-12-08 20:44 ` Alan Stern
2009-12-08 20:52 ` Rafael J. Wysocki
2009-12-08 21:40 ` Alan Stern
2009-12-08 21:48 ` spinlock in completion_done() (was: Re: Async resume patch (was: Re: [GIT PULL] PM updates for 2.6.33)) Rafael J. Wysocki
2009-12-09 9:29 ` Ingo Molnar
2009-12-09 22:37 ` Rafael J. Wysocki
2009-12-10 7:59 ` Ingo Molnar
2009-12-11 4:10 ` Dave Chinner
2009-12-11 7:54 ` Ingo Molnar
2009-12-12 23:07 ` [PATCH] sched: Make wakeup side variants of completion API irq safe (was: Re: spinlock in completion_done()) Rafael J. Wysocki
2009-12-08 22:18 ` Async resume patch (was: Re: [GIT PULL] PM updates for 2.6.33) Linus Torvalds
2009-12-09 2:11 ` Alan Stern
2009-12-08 21:08 ` Linus Torvalds
2009-12-08 21:13 ` Linus Torvalds
2009-12-08 22:07 ` Alan Stern
2009-12-08 22:30 ` Rafael J. Wysocki
2009-12-09 2:23 ` Alan Stern
2009-12-09 21:56 ` Rafael J. Wysocki
2009-12-09 22:27 ` Alan Stern
2009-12-08 22:32 ` Linus Torvalds
2009-12-09 2:35 ` Alan Stern
2009-12-09 2:54 ` Linus Torvalds
2009-12-09 15:24 ` Alan Stern
2009-12-09 15:38 ` Linus Torvalds
2009-12-09 15:57 ` Alan Stern
2009-12-25 17:09 ` Pavel Machek
2009-12-09 13:38 ` Mark Brown
2009-12-09 15:49 ` Alan Stern
2009-12-09 16:02 ` Mark Brown
2009-12-09 16:23 ` Alan Stern
2009-12-09 16:46 ` Mark Brown
2009-12-09 16:57 ` Linus Torvalds
2009-12-09 17:45 ` Mark Brown
2009-12-09 17:57 ` Linus Torvalds
2009-12-09 18:27 ` Mark Brown
2009-12-09 17:10 ` Alan Stern
2009-12-09 17:19 ` Linus Torvalds
2009-12-09 18:08 ` Mark Brown
2009-12-08 21:04 ` Linus Torvalds
2009-12-08 21:40 ` Rafael J. Wysocki
2009-12-08 22:03 ` Rafael J. Wysocki
2009-12-08 22:55 ` Async suspend-resume patch w/ rwsems " Rafael J. Wysocki
2009-12-08 23:24 ` Rafael J. Wysocki [this message]
2009-12-09 20:15 ` Alan Stern
2009-12-09 22:18 ` Rafael J. Wysocki
2009-12-09 22:38 ` Alan Stern
2009-12-09 23:18 ` Async suspend-resume patch w/ completions (was: Re: Async suspend-resume patch w/ rwsems) Rafael J. Wysocki
2009-12-10 2:51 ` Linus Torvalds
2009-12-10 19:40 ` Rafael J. Wysocki
2009-12-10 23:30 ` Linus Torvalds
2009-12-11 1:02 ` Rafael J. Wysocki
2009-12-11 1:25 ` Linus Torvalds
2009-12-11 3:42 ` Alan Stern
2009-12-11 22:17 ` Rafael J. Wysocki
2009-12-12 0:38 ` Alan Stern
2009-12-11 22:11 ` Rafael J. Wysocki
2009-12-11 22:31 ` Linus Torvalds
2009-12-11 23:48 ` Rafael J. Wysocki
2009-12-11 23:53 ` Linus Torvalds
2009-12-12 17:48 ` Rafael J. Wysocki
2009-12-12 18:54 ` Linus Torvalds
2009-12-12 22:34 ` Rafael J. Wysocki
2009-12-12 22:40 ` Rafael J. Wysocki
2009-12-14 18:21 ` Linus Torvalds
2009-12-14 22:11 ` Rafael J. Wysocki
2009-12-14 22:41 ` Linus Torvalds
2009-12-14 22:43 ` Linus Torvalds
2009-12-14 23:18 ` Rafael J. Wysocki
2009-12-15 0:10 ` Linus Torvalds
2009-12-15 0:11 ` Linus Torvalds
2009-12-15 11:14 ` Rafael J. Wysocki
2009-12-15 15:31 ` Linus Torvalds
2009-12-15 11:03 ` Rafael J. Wysocki
2009-12-15 15:26 ` Linus Torvalds
2009-12-15 15:55 ` Alan Stern
2009-12-15 16:28 ` Linus Torvalds
2009-12-15 18:57 ` Linus Torvalds
2009-12-15 20:26 ` Alan Stern
2009-12-15 21:26 ` Rafael J. Wysocki
2009-12-15 22:01 ` Alan Stern
2009-12-15 21:54 ` Linus Torvalds
2009-12-15 22:27 ` Alan Stern
2009-12-16 2:11 ` Rafael J. Wysocki
2009-12-16 6:40 ` Dmitry Torokhov
2009-12-18 22:43 ` Rafael J. Wysocki
2009-12-19 19:59 ` Dmitry Torokhov
2009-12-19 21:33 ` Rafael J. Wysocki
2009-12-19 22:29 ` Rafael J. Wysocki
2009-12-19 22:43 ` Dmitry Torokhov
2009-12-19 22:47 ` Dmitry Torokhov
2009-12-19 23:10 ` Rafael J. Wysocki
2009-12-19 23:22 ` Dmitry Torokhov
2009-12-19 23:33 ` Rafael J. Wysocki
2009-12-19 23:23 ` Linus Torvalds
2009-12-19 23:40 ` Rafael J. Wysocki
2009-12-19 23:46 ` Linus Torvalds
2009-12-19 23:47 ` Linus Torvalds
2009-12-19 23:54 ` Rafael J. Wysocki
2009-12-19 23:53 ` Rafael J. Wysocki
2009-12-20 0:09 ` Linus Torvalds
2009-12-20 0:35 ` Rafael J. Wysocki
2009-12-20 2:41 ` Dmitry Torokhov
2009-12-20 19:25 ` [linux-pm] " Rafael J. Wysocki
2009-12-21 7:39 ` [linux-pm] Async suspend-resume patch w/ completions (was: Re: Async?suspend-resume " Dmitry Torokhov
2009-12-21 11:20 ` Vojtech Pavlik
2009-12-20 2:45 ` Async suspend-resume patch w/ completions (was: Re: Async suspend-resume " Dmitry Torokhov
2009-12-20 3:59 ` Alan Stern
2009-12-20 12:52 ` Rafael J. Wysocki
2009-12-20 17:12 ` Alan Stern
2009-12-20 18:10 ` Rafael J. Wysocki
2009-12-20 19:38 ` Alan Stern
2009-12-20 19:51 ` Rafael J. Wysocki
2009-12-16 15:22 ` Alan Stern
2009-12-16 19:26 ` Rafael J. Wysocki
2009-12-16 15:47 ` Linus Torvalds
2009-12-16 19:27 ` Rafael J. Wysocki
2009-12-16 20:59 ` Linus Torvalds
2009-12-16 21:57 ` Rafael J. Wysocki
2009-12-16 22:11 ` Linus Torvalds
2009-12-16 22:33 ` Rafael J. Wysocki
2009-12-16 23:04 ` Alan Stern
2009-12-16 23:18 ` Rafael J. Wysocki
2009-12-17 1:30 ` Rafael J. Wysocki
2009-12-17 1:49 ` Rafael J. Wysocki
2009-12-17 20:06 ` Alan Stern
2009-12-17 20:36 ` Rafael J. Wysocki
2009-12-18 1:51 ` Rafael J. Wysocki
2009-12-18 17:26 ` Alan Stern
2009-12-19 21:41 ` Rafael J. Wysocki
2009-12-20 3:48 ` Alan Stern
2009-12-20 12:55 ` Rafael J. Wysocki
2009-12-18 23:42 ` Rafael J. Wysocki
2009-12-13 13:08 ` Rafael J. Wysocki
2009-12-13 17:30 ` Alan Stern
2009-12-13 19:02 ` [linux-pm] " Alan Stern
2009-12-12 0:43 ` Alan Stern
2009-12-12 17:35 ` Rafael J. Wysocki
2009-12-10 15:31 ` Alan Stern
2009-12-10 15:45 ` Linus Torvalds
2009-12-10 18:37 ` Alan Stern
2009-12-10 23:51 ` Linus Torvalds
2009-12-10 21:14 ` Rafael J. Wysocki
2009-12-10 22:17 ` Alan Stern
2009-12-10 23:45 ` Rafael J. Wysocki
2009-12-07 15:15 ` [GIT PULL] PM updates for 2.6.33 Rafael J. Wysocki
2009-12-07 16:37 ` Linus Torvalds
2009-12-07 20:47 ` Rafael J. Wysocki
2009-12-07 20:56 ` Linus Torvalds
2009-12-07 5:20 ` Linus Torvalds
2009-12-07 15:42 ` Alan Stern
2009-12-06 19:35 ` Arjan van de Ven
2009-12-06 19:58 ` Linus Torvalds
2009-12-06 20:18 ` Arjan van de Ven
2009-12-06 21:08 ` Linus Torvalds
2009-12-06 22:54 ` Dmitry Torokhov
2009-12-07 0:55 ` Arjan van de Ven
2009-12-07 2:27 ` Dmitry Torokhov
2009-12-07 5:26 ` Arjan van de Ven
2009-12-07 6:00 ` Dmitry Torokhov
2009-12-21 9:01 ` Pavel Machek
2009-12-07 1:18 ` Arjan van de Ven
2009-12-07 2:27 ` Dmitry Torokhov
2009-12-07 5:31 ` Arjan van de Ven
2009-12-07 6:15 ` Dmitry Torokhov
2009-12-07 6:31 ` Arjan van de Ven
2009-12-07 6:32 ` Dmitry Torokhov
2009-12-07 15:17 ` Rafael J. Wysocki
2009-12-06 20:36 ` Alan Stern
2009-12-06 21:17 ` Arjan van de Ven
2009-12-06 21:46 ` Alan Stern
2009-12-06 21:57 ` Arjan van de Ven
2009-12-06 22:04 ` Alan Stern
2009-12-06 0:29 ` Rafael J. Wysocki
2009-12-06 0:52 ` Linus Torvalds
2009-12-06 1:24 ` Rafael J. Wysocki
2009-12-06 1:50 ` Linus Torvalds
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=200912090024.24199.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=rui.zhang@intel.com \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.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