diff mbox

[1/1] Cpufreq: Keep cpufreq sysfs nodes across S2RAM/S2DISK when using intel_pstate driver.

Message ID 1411023787-11458-1-git-send-email-tianyu.lan@intel.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

lan,Tianyu Sept. 18, 2014, 7:03 a.m. UTC
Cpufreq core introduces cpufreq_suspended flag to let cpufreq sysfs nodes
across S2RAM/S2DISK. But the flag is only set in the cpufreq_suspend()
for cpufreq drivers which have target or target_index callback. This
skips intel_pstate driver. This patch is to set the flag before checking
target or target_index callback.

Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
---
 drivers/cpufreq/cpufreq.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Rafael J. Wysocki Sept. 22, 2014, 2:07 p.m. UTC | #1
On Thursday, September 18, 2014 03:03:07 PM Lan Tianyu wrote:
> Cpufreq core introduces cpufreq_suspended flag to let cpufreq sysfs nodes
> across S2RAM/S2DISK. But the flag is only set in the cpufreq_suspend()
> for cpufreq drivers which have target or target_index callback. This
> skips intel_pstate driver. This patch is to set the flag before checking
> target or target_index callback.
> 
> Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>

Viresh, Dirk, this looks like a fix that should go into 3.17, so I'm
queuing it up accordingly.  Please let me know if that's not correct.

> ---
>  drivers/cpufreq/cpufreq.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index d9fdedd..eb9bb78 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1656,6 +1656,8 @@ void cpufreq_suspend(void)
>  	if (!cpufreq_driver)
>  		return;
>  
> +	cpufreq_suspended = true;
> +
>  	if (!has_target())
>  		return;
>  
> @@ -1670,8 +1672,6 @@ void cpufreq_suspend(void)
>  			pr_err("%s: Failed to suspend driver: %p\n", __func__,
>  				policy);
>  	}
> -
> -	cpufreq_suspended = true;
>  }
>  
>  /**
> @@ -1687,13 +1687,13 @@ void cpufreq_resume(void)
>  	if (!cpufreq_driver)
>  		return;
>  
> +	cpufreq_suspended = false;
> +
>  	if (!has_target())
>  		return;
>  
>  	pr_debug("%s: Resuming Governors\n", __func__);
>  
> -	cpufreq_suspended = false;
> -
>  	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
>  		if (cpufreq_driver->resume && cpufreq_driver->resume(policy))
>  			pr_err("%s: Failed to resume driver: %p\n", __func__,
>
Viresh Kumar Sept. 29, 2014, 8:20 a.m. UTC | #2
Sorry for being late on this. Was away for a week for Linaro Connect followed
by a week of vacations :(

On 18 September 2014 00:03, Lan Tianyu <tianyu.lan@intel.com> wrote:
> Cpufreq core introduces cpufreq_suspended flag to let cpufreq sysfs nodes
> across S2RAM/S2DISK. But the flag is only set in the cpufreq_suspend()
> for cpufreq drivers which have target or target_index callback. This
> skips intel_pstate driver. This patch is to set the flag before checking
> target or target_index callback.

Oh yes, this looks to be the right thing to do..

> Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
> ---
>  drivers/cpufreq/cpufreq.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index d9fdedd..eb9bb78 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1656,6 +1656,8 @@ void cpufreq_suspend(void)
>         if (!cpufreq_driver)
>                 return;
>
> +       cpufreq_suspended = true;
> +
>         if (!has_target())
>                 return;
>
> @@ -1670,8 +1672,6 @@ void cpufreq_suspend(void)
>                         pr_err("%s: Failed to suspend driver: %p\n", __func__,
>                                 policy);
>         }
> -
> -       cpufreq_suspended = true;

But this change is buggy.. Because you are updating 'cpufreq_suspended'
before actually stopping the governor, any calls to __cpufreq_governor()
will be converted to NO-operations because of this in __cpufreq_governor():

/* Don't start any governor operations if we are entering suspend */
if (cpufreq_suspended)
    return 0;

And so the governor's will never stop :(

So you need to keep the above line where it was :)
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael J. Wysocki Sept. 29, 2014, 11:44 p.m. UTC | #3
On Monday, September 29, 2014 01:20:44 AM Viresh Kumar wrote:
> Sorry for being late on this. Was away for a week for Linaro Connect followed
> by a week of vacations :(
> 
> On 18 September 2014 00:03, Lan Tianyu <tianyu.lan@intel.com> wrote:
> > Cpufreq core introduces cpufreq_suspended flag to let cpufreq sysfs nodes
> > across S2RAM/S2DISK. But the flag is only set in the cpufreq_suspend()
> > for cpufreq drivers which have target or target_index callback. This
> > skips intel_pstate driver. This patch is to set the flag before checking
> > target or target_index callback.
> 
> Oh yes, this looks to be the right thing to do..
> 
> > Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
> > ---
> >  drivers/cpufreq/cpufreq.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index d9fdedd..eb9bb78 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -1656,6 +1656,8 @@ void cpufreq_suspend(void)
> >         if (!cpufreq_driver)
> >                 return;
> >
> > +       cpufreq_suspended = true;
> > +
> >         if (!has_target())
> >                 return;
> >
> > @@ -1670,8 +1672,6 @@ void cpufreq_suspend(void)
> >                         pr_err("%s: Failed to suspend driver: %p\n", __func__,
> >                                 policy);
> >         }
> > -
> > -       cpufreq_suspended = true;
> 
> But this change is buggy.. Because you are updating 'cpufreq_suspended'
> before actually stopping the governor, any calls to __cpufreq_governor()
> will be converted to NO-operations because of this in __cpufreq_governor():
> 
> /* Don't start any governor operations if we are entering suspend */
> if (cpufreq_suspended)
>     return 0;
> 
> And so the governor's will never stop :(
> 
> So you need to keep the above line where it was :)

OK, so please send a fix for that against the Linus' tree.
lan,Tianyu Oct. 8, 2014, 6:48 a.m. UTC | #4
Sorry later response and just back from vacation.

On 2014?09?29? 16:20, Viresh Kumar wrote:
> But this change is buggy.. Because you are updating 'cpufreq_suspended'
> before actually stopping the governor, any calls to __cpufreq_governor()
> will be converted to NO-operations because of this in __cpufreq_governor():
> 
> /* Don't start any governor operations if we are entering suspend */
> if (cpufreq_suspended)
>     return 0;
> 
> And so the governor's will never stop :(
> 
> So you need to keep the above line where it was :)
> 

Yes, you are right. Thanks for fixing it.
diff mbox

Patch

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index d9fdedd..eb9bb78 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1656,6 +1656,8 @@  void cpufreq_suspend(void)
 	if (!cpufreq_driver)
 		return;
 
+	cpufreq_suspended = true;
+
 	if (!has_target())
 		return;
 
@@ -1670,8 +1672,6 @@  void cpufreq_suspend(void)
 			pr_err("%s: Failed to suspend driver: %p\n", __func__,
 				policy);
 	}
-
-	cpufreq_suspended = true;
 }
 
 /**
@@ -1687,13 +1687,13 @@  void cpufreq_resume(void)
 	if (!cpufreq_driver)
 		return;
 
+	cpufreq_suspended = false;
+
 	if (!has_target())
 		return;
 
 	pr_debug("%s: Resuming Governors\n", __func__);
 
-	cpufreq_suspended = false;
-
 	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
 		if (cpufreq_driver->resume && cpufreq_driver->resume(policy))
 			pr_err("%s: Failed to resume driver: %p\n", __func__,