All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Brian Norris <briannorris@chromium.org>
Cc: "Rafael J . Wysocki" <rjw@rjwysocki.net>,
	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>
Subject: Re: [PATCH 2/2] PM / sleep: don't suspend parent when async child suspend_{noirq,early} fails
Date: Wed, 19 Oct 2016 17:56:28 -0700	[thread overview]
Message-ID: <20161020005628.GC15459@dtor-ws> (raw)
In-Reply-To: <1476923170-111986-2-git-send-email-briannorris@chromium.org>

On Wed, Oct 19, 2016 at 05:26:10PM -0700, Brian Norris wrote:
> Consider two devices, A and B, where B is a child of A, and B utilizes
> asynchronous suspend (it does not matter whether A is sync or async). If
> B fails to suspend_noirq() or suspend_early(), or is interrupted by a
> wakeup (pm_wakeup_pending()), then it aborts and sets the async_error
> variable. However, device A does not (immediately) check the async_error
> variable; it may continue to run its own suspend_noirq()/suspend_early()
> callback. This is bad.
> 
> We can resolve this problem by checking the async_error flag after
> waiting for children to suspend, using the same logic for the noirq and
> late suspend cases as we already do for __device_suspend().
> 
> It's easy to observe this erroneous behavior by, for example, forcing a
> device to sleep a bit in its suspend_noirq() (to ensure the parent is
> waiting for the child to complete), then return an error, and watch the
> parent suspend_noirq() still get called. (Or similarly, fake a wakeup
> event at the right (or is it wrong?) time.)
> 
> Fixes: de377b397272 ("PM / sleep: Asynchronous threads for suspend_late")
> Fixes: 28b6fd6e3779 ("PM / sleep: Asynchronous threads for suspend_noirq")
> Reported-by: Jeffy Chen <jeffy.chen@rock-chips.com>
> Signed-off-by: Brian Norris <briannorris@chromium.org>

Makes sense to me.

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

> ---
> Tested mostly on 4.4, but the code (and seemingly the bug) is mostly untouched
> since then. I can try to conjure up a proper upstream test if required.
> 
>  drivers/base/power/main.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> 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;
> +
>  	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;
> +
>  	if (dev->pm_domain) {
>  		info = "late power domain ";
>  		callback = pm_late_early_op(&dev->pm_domain->ops, state);
> -- 
> 2.8.0.rc3.226.g39d4020
> 

-- 
Dmitry

  parent reply	other threads:[~2016-10-20  0:56 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 [this message]
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
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=20161020005628.GC15459@dtor-ws \
    --to=dmitry.torokhov@gmail.com \
    --cc=briannorris@chromium.org \
    --cc=chuansheng.liu@intel.com \
    --cc=computersforpeace@gmail.com \
    --cc=dianders@chromium.org \
    --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.