All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Norris <briannorris@chromium.org>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Pavel Machek <pavel@ucw.cz>, Len Brown <len.brown@intel.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-kernel@vger.kernel.org,
	Doug Anderson <dianders@chromium.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Jeffy Chen <jeffy.chen@rock-chips.com>,
	linux-pm@vger.kernel.org,
	Chuansheng Liu <chuansheng.liu@intel.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>
Subject: Re: [PATCH v2 2/2] PM / sleep: don't suspend parent when async child suspend_{noirq,late} fails
Date: Mon, 31 Oct 2016 22:22:20 -0700	[thread overview]
Message-ID: <20161101052217.GA132958@google.com> (raw)
In-Reply-To: <8017823.VJuZzSqtaY@vostro.rjw.lan>

Hi Rafael,

On Tue, Nov 01, 2016 at 05:25:39AM +0100, Rafael J. Wysocki wrote:
> On Thursday, October 27, 2016 09:05:34 AM Brian Norris wrote:
> > diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
> > index c58563581345..eaf6b53463a5 100644
> > --- a/drivers/base/power/main.c
> > +++ b/drivers/base/power/main.c
> > @@ -1040,6 +1040,9 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
> >  
> >  	dpm_wait_for_children(dev, async);
> >  
> > +	if (async_error)
> > +		goto Complete;
> > +
> 
> This is a second chech for async_error in this routine and is the first one
> really needed after adding this?

Maybe not? I confess I'm not 100% sure on all the reasons for the code
structure as-is, but it looks like we're trying to catch pending wakeups
early, and because that procedure utilizes 'async_error' to stash the
-EBUSY, it seemingly makes sense to check if it's non-zero before
overwriting it.

But then, that's all kind of racy, since there can be multiple writers
to that variable, no? So it can't matter *that* much if we clobber the
error, as long as we abort somewhere.

Anyway, maybe it's best if dpm_wait_for_children() just moves to be
first thing in this function (after the tracepoints). That seems just as
correct to me, and shouldn't waste any additional time suspending
devices for a failed system suspend attempt -- as long as we're still
catching wakeups before we suspend the current device. (That also
incidentally matches the structure of __device_suspend() more closely.
Why did this all get out of sync (pun unintended) when copied from the
suspend() to the suspend_{late,noirq}() phase?)

All in all, the short response is that I wrote the smallest patch that
fixes the bug, AFAICT. But actually I think the above would be both
shorter and better. I'll give that a go.

> >  	if (dev->pm_domain) {
> >  		info = "noirq power domain ";
> >  		callback = pm_noirq_op(&dev->pm_domain->ops, state);
> > @@ -1187,6 +1190,9 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
> >  
> >  	dpm_wait_for_children(dev, async);
> >  
> > +	if (async_error)
> > +		goto Complete;
> > +
> 
> Same question.

Same answer :)

Brian

> >  	if (dev->pm_domain) {
> >  		info = "late power domain ";
> >  		callback = pm_late_early_op(&dev->pm_domain->ops, state);
> > 
> 
> Thanks,
> Rafael
> 

  reply	other threads:[~2016-11-01  5:22 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-20  0:26 [RESEND PATCH 1/2] PM / sleep: print function name of callbacks Brian Norris
2016-10-20  0:26 ` Brian Norris
2016-10-20  0:26 ` [PATCH 2/2] PM / sleep: don't suspend parent when async child suspend_{noirq,early} fails Brian Norris
2016-10-20  0:26   ` Brian Norris
2016-10-20  0:46   ` Brian Norris
2016-10-27 15:34     ` Greg Kroah-Hartman
2016-10-27 16:03       ` Brian Norris
2016-10-20  0:56   ` Dmitry Torokhov
2016-10-27 16:05   ` [PATCH v2 2/2] PM / sleep: don't suspend parent when async child suspend_{noirq,late} fails Brian Norris
2016-10-27 16:05     ` Brian Norris
2016-11-01  4:25     ` Rafael J. Wysocki
2016-11-01  5:22       ` Brian Norris [this message]
2016-11-01  6:04       ` Dmitry Torokhov
2016-11-02  3:51         ` Rafael J. Wysocki
2016-11-02  5:07           ` Brian Norris
2016-11-10  0:08             ` Rafael J. Wysocki
2016-11-10  0:18               ` Brian Norris
2016-11-10  1:21     ` [PATCH v3] " Brian Norris
2016-11-10  1:21       ` Brian Norris
2016-11-10  1:53       ` Rafael J. Wysocki
2016-11-10  2:00         ` Brian Norris
2016-11-11  1:42           ` Rafael J. Wysocki
2016-10-20  0:52 ` [RESEND PATCH 1/2] PM / sleep: print function name of callbacks Dmitry Torokhov
2016-11-01  4:27 ` Rafael J. Wysocki
2016-11-02 21:02   ` Brian Norris

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=20161101052217.GA132958@google.com \
    --to=briannorris@chromium.org \
    --cc=chuansheng.liu@intel.com \
    --cc=computersforpeace@gmail.com \
    --cc=dianders@chromium.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jeffy.chen@rock-chips.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=rjw@rjwysocki.net \
    /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.