From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
Alan Stern <stern@rowland.harvard.edu>,
Kevin Hilman <khilman@kernel.org>,
Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
Lina Iyer <lina.iyer@linaro.org>,
Andy Gross <andy.gross@linaro.org>,
Linus Walleij <linus.walleij@linaro.org>,
Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH] PM / Runtime: Defer resuming of the device in pm_runtime_force_resume()
Date: Mon, 25 Apr 2016 19:52:58 +0300 [thread overview]
Message-ID: <5465506.Z3sjI0lQh6@avalon> (raw)
In-Reply-To: <CAPDyKFoQp+-t=c8-Y6+f9U+WJHMEtwGUQ=+PaVNc1-vUkV8CEw@mail.gmail.com>
Hi Ulf,
On Monday 25 Apr 2016 15:32:52 Ulf Hansson wrote:
> On 21 April 2016 at 19:31, Laurent Pinchart wrote:
> > On Thursday 21 Apr 2016 12:34:02 Ulf Hansson wrote:
> >> When the pm_runtime_force_suspend|resume() helpers were invented, we
> >> still had CONFIG_PM_RUNTIME and CONFIG_PM_SLEEP as separate Kconfig
> >> options.
> >>
> >> To make sure these helpers worked for all combinations and without
> >> introducing too much of complexity, the device was always resumed in
> >> pm_runtime_force_resume().
> >>
> >> More precisely, when CONFIG_PM_SLEEP was set and CONFIG_PM_RUNTIME was
> >> unset, we needed to resume the device as the subsystem/driver couldn't
> >> rely on using runtime PM to do it.
> >>
> >> As the CONFIG_PM_RUNTIME option was merged into CONFIG_PM a while ago, it
> >> removed this combination, of using CONFIG_PM_SLEEP without the earlier
> >> CONFIG_PM_RUNTIME.
> >>
> >> For this reason we can now rely on the subsystem/driver to use runtime PM
> >> to resume the device, instead of forcing that to be done in all cases. In
> >> other words, let's defer this to a later point when it's actually needed.
> >>
> >> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
> >> ---
> >>
> >> Note, this patch is based upon another not yet queued patch [1]. The
> >> reason is simply because that [1] is a more important patch as it fixes a
> >> problem. It was posted to linux-pm April 8th and I expect it (or a new
> >> revision of it) to be applied before $subject patch.
> >>
> >> [1]
> >> https://patchwork.kernel.org/patch/8782851
> >>
> >> ---
> >>
> >> drivers/base/power/runtime.c | 11 +++++++++++
> >> 1 file changed, 11 insertions(+)
> >>
> >> diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> >> index b746904..a190ca0 100644
> >> --- a/drivers/base/power/runtime.c
> >> +++ b/drivers/base/power/runtime.c
> >> @@ -1506,6 +1506,17 @@ int pm_runtime_force_resume(struct device *dev)
> >> goto out;
> >> }
> >>
> >> + /*
> >> + * The PM core increases the runtime PM usage count in the system
> >> + * PM prepare phase. If the count is greather than 1 at this point,
> >> + * someone else has also increased it. In such case, let's make
> >> + * sure to runtime resume the device as that is likely what is
> >> + * expected. In other case we trust the subsystem/driver to runtime
> >> + * resume the device when it's actually needed.
> >> + */
> >> + if (atomic_read(&dev->power.usage_count) < 2)
> >> + goto out;
> >> +
> >> ret = pm_runtime_set_active(dev);
> >> if (ret)
> >> goto out;
> >
> > This works in the sense that it prevents devices from being PM resumed at
> > system resume time if not needed. However, devices that are part of a PM
> > domain and that were idle before system suspend are suspended twice (with
> > their .runtime_suspend() handler called twice), which is not good at all.
> >
> > The first suspend occurs at system suspend time, with
> > pm_runtime_force_suspend() rightfully suspending the device as the device
> > is active (due to being woken up by pm_genpd_prepare()). The second
> > suspend occurs at resume time due to device_complete() calling
> > pm_runtime_put().
> >
> > I've tracked the issue to the fact that pm_genpd_complete() calls
> > pm_runtime_set_active() regardless of whether the device was PM resumed or
> > not. As pm_runtime_force_suspend() doesn't resume devices with this patch
> > applied, the pm_runtime_put() call from device_complete() will try to
> > runtime suspend the device a second time as the state is incorrectly set
> > to RPM_ACTIVE.
> >
> > With the current genpd implementation this patch isn't needed (and neither
> > is my patch), as genpd expects the device to be always active when the
> > system is resumed. However, when genpd isn't used,
> > pm_runtime_force_resume() needs to skip resuming devices that were
> > suspended before system suspend. This patch looks good to me to fix that
> > problem.
> >
> > Do we need to fix genpd first ?
>
> Following you reasoning, I agree!
>
> Let's put this patch on hold for a little while. I am already working
> on changing genpd, so it shouldn't take long before I can post some
> additional genpd patches improving the behaviour.
I'd like to see something merged for v4.7 if possible. I agree that my patch
isn't a long term solution (we want to avoid adding additional fields to the
device power structure), but it has the benefit of being available now and
fixing the problem I ran into with drivers that would be broken on v4.7
without a fix. Do you think you could get a better fix ready in time for v4.7
? If so I'm fine with dropping this patch, but otherwise I'd prefer to get it
merged and reverted as part of your better implementation for v4.8.
--
Regards,
Laurent Pinchart
WARNING: multiple messages have this Message-ID (diff)
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] PM / Runtime: Defer resuming of the device in pm_runtime_force_resume()
Date: Mon, 25 Apr 2016 19:52:58 +0300 [thread overview]
Message-ID: <5465506.Z3sjI0lQh6@avalon> (raw)
In-Reply-To: <CAPDyKFoQp+-t=c8-Y6+f9U+WJHMEtwGUQ=+PaVNc1-vUkV8CEw@mail.gmail.com>
Hi Ulf,
On Monday 25 Apr 2016 15:32:52 Ulf Hansson wrote:
> On 21 April 2016 at 19:31, Laurent Pinchart wrote:
> > On Thursday 21 Apr 2016 12:34:02 Ulf Hansson wrote:
> >> When the pm_runtime_force_suspend|resume() helpers were invented, we
> >> still had CONFIG_PM_RUNTIME and CONFIG_PM_SLEEP as separate Kconfig
> >> options.
> >>
> >> To make sure these helpers worked for all combinations and without
> >> introducing too much of complexity, the device was always resumed in
> >> pm_runtime_force_resume().
> >>
> >> More precisely, when CONFIG_PM_SLEEP was set and CONFIG_PM_RUNTIME was
> >> unset, we needed to resume the device as the subsystem/driver couldn't
> >> rely on using runtime PM to do it.
> >>
> >> As the CONFIG_PM_RUNTIME option was merged into CONFIG_PM a while ago, it
> >> removed this combination, of using CONFIG_PM_SLEEP without the earlier
> >> CONFIG_PM_RUNTIME.
> >>
> >> For this reason we can now rely on the subsystem/driver to use runtime PM
> >> to resume the device, instead of forcing that to be done in all cases. In
> >> other words, let's defer this to a later point when it's actually needed.
> >>
> >> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
> >> ---
> >>
> >> Note, this patch is based upon another not yet queued patch [1]. The
> >> reason is simply because that [1] is a more important patch as it fixes a
> >> problem. It was posted to linux-pm April 8th and I expect it (or a new
> >> revision of it) to be applied before $subject patch.
> >>
> >> [1]
> >> https://patchwork.kernel.org/patch/8782851
> >>
> >> ---
> >>
> >> drivers/base/power/runtime.c | 11 +++++++++++
> >> 1 file changed, 11 insertions(+)
> >>
> >> diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> >> index b746904..a190ca0 100644
> >> --- a/drivers/base/power/runtime.c
> >> +++ b/drivers/base/power/runtime.c
> >> @@ -1506,6 +1506,17 @@ int pm_runtime_force_resume(struct device *dev)
> >> goto out;
> >> }
> >>
> >> + /*
> >> + * The PM core increases the runtime PM usage count in the system
> >> + * PM prepare phase. If the count is greather than 1 at this point,
> >> + * someone else has also increased it. In such case, let's make
> >> + * sure to runtime resume the device as that is likely what is
> >> + * expected. In other case we trust the subsystem/driver to runtime
> >> + * resume the device when it's actually needed.
> >> + */
> >> + if (atomic_read(&dev->power.usage_count) < 2)
> >> + goto out;
> >> +
> >> ret = pm_runtime_set_active(dev);
> >> if (ret)
> >> goto out;
> >
> > This works in the sense that it prevents devices from being PM resumed at
> > system resume time if not needed. However, devices that are part of a PM
> > domain and that were idle before system suspend are suspended twice (with
> > their .runtime_suspend() handler called twice), which is not good at all.
> >
> > The first suspend occurs at system suspend time, with
> > pm_runtime_force_suspend() rightfully suspending the device as the device
> > is active (due to being woken up by pm_genpd_prepare()). The second
> > suspend occurs at resume time due to device_complete() calling
> > pm_runtime_put().
> >
> > I've tracked the issue to the fact that pm_genpd_complete() calls
> > pm_runtime_set_active() regardless of whether the device was PM resumed or
> > not. As pm_runtime_force_suspend() doesn't resume devices with this patch
> > applied, the pm_runtime_put() call from device_complete() will try to
> > runtime suspend the device a second time as the state is incorrectly set
> > to RPM_ACTIVE.
> >
> > With the current genpd implementation this patch isn't needed (and neither
> > is my patch), as genpd expects the device to be always active when the
> > system is resumed. However, when genpd isn't used,
> > pm_runtime_force_resume() needs to skip resuming devices that were
> > suspended before system suspend. This patch looks good to me to fix that
> > problem.
> >
> > Do we need to fix genpd first ?
>
> Following you reasoning, I agree!
>
> Let's put this patch on hold for a little while. I am already working
> on changing genpd, so it shouldn't take long before I can post some
> additional genpd patches improving the behaviour.
I'd like to see something merged for v4.7 if possible. I agree that my patch
isn't a long term solution (we want to avoid adding additional fields to the
device power structure), but it has the benefit of being available now and
fixing the problem I ran into with drivers that would be broken on v4.7
without a fix. Do you think you could get a better fix ready in time for v4.7
? If so I'm fine with dropping this patch, but otherwise I'd prefer to get it
merged and reverted as part of your better implementation for v4.8.
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2016-04-25 16:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-21 10:34 [PATCH] PM / Runtime: Defer resuming of the device in pm_runtime_force_resume() Ulf Hansson
2016-04-21 10:34 ` Ulf Hansson
2016-04-21 17:31 ` Laurent Pinchart
2016-04-21 17:31 ` Laurent Pinchart
2016-04-21 20:57 ` Laurent Pinchart
2016-04-21 20:57 ` Laurent Pinchart
2016-04-22 20:27 ` Kevin Hilman
2016-04-22 20:27 ` Kevin Hilman
2016-04-25 8:15 ` Ulf Hansson
2016-04-25 8:15 ` Ulf Hansson
2016-04-25 13:32 ` Ulf Hansson
2016-04-25 13:32 ` Ulf Hansson
2016-04-25 16:52 ` Laurent Pinchart [this message]
2016-04-25 16:52 ` Laurent Pinchart
2016-04-27 14:23 ` Ulf Hansson
2016-04-27 14:23 ` Ulf Hansson
2016-05-12 19:01 ` Laurent Pinchart
2016-05-12 19:01 ` Laurent Pinchart
2016-05-12 20:28 ` Rafael J. Wysocki
2016-05-12 20:28 ` Rafael J. Wysocki
2016-05-13 13:59 ` Ulf Hansson
2016-05-13 13:59 ` Ulf Hansson
2016-04-21 19:23 ` Rafael J. Wysocki
2016-04-21 19:23 ` Rafael J. Wysocki
2016-04-22 6:58 ` Ulf Hansson
2016-04-22 6:58 ` Ulf Hansson
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=5465506.Z3sjI0lQh6@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=andy.gross@linaro.org \
--cc=khilman@kernel.org \
--cc=len.brown@intel.com \
--cc=lina.iyer@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=rjw@rjwysocki.net \
--cc=sergei.shtylyov@cogentembedded.com \
--cc=stern@rowland.harvard.edu \
--cc=ulf.hansson@linaro.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.