linux-sh.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linux PM list <linux-pm@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Kevin Hilman <khilman@ti.com>,
	Magnus Damm <magnus.damm@gmail.com>,
	linux-sh@vger.kernel.org,
	Mark Brown <broonie@opensource.wolfsonmicro.com>,
	markgross@thegnar.org, Jean Pihet <j-pihet@ti.com>
Subject: Re: [PATCH 2/3] PM / Domains: Rework default device stop governor function
Date: Tue, 24 Apr 2012 21:55:48 +0000	[thread overview]
Message-ID: <201204242355.48498.rjw@sisk.pl> (raw)
In-Reply-To: <201204242350.41844.rjw@sisk.pl>

The subject is wrong, it should be:

[PATCH 2/3] PM / Domains: Rework default domain power off governor function

On Tuesday, April 24, 2012, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rjw@sisk.pl>
> 
> The existing default domain power down governor function for PM
> domains, default_power_down_ok(), is supposed to check whether or not
> the PM QoS latency constraints of the devices in the domain will be
> violated if the domain is turned off by pm_genpd_poweroff().
> However, the computations carried out by it don't reflect the
> definition of the PM QoS latency constrait in
> Documentation/ABI/testing/sysfs-devices-power.
> 
> Make default_power_down_ok() follow the definition of the PM QoS
> latency constrait.  In particular, make it only take latencies into
> account, because it doesn't matter how much time has elapsed since
> the domain's devices were suspended for the computation.
> 
> Remove the break_even_ns and power_off_time fields from
> struct generic_pm_domain, because they are not necessary any more.
> 
> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> ---
>  drivers/base/power/domain.c          |    1 
>  drivers/base/power/domain_governor.c |   62 ++++++++++++++---------------------
>  include/linux/pm_domain.h            |    2 -
>  3 files changed, 25 insertions(+), 40 deletions(-)
> 
> Index: linux/drivers/base/power/domain_governor.c
> =================================> --- linux.orig/drivers/base/power/domain_governor.c
> +++ linux/drivers/base/power/domain_governor.c
> @@ -80,8 +80,8 @@ static bool default_power_down_ok(struct
>  	struct pm_domain_data *pdd;
>  	s64 min_dev_off_time_ns;
>  	s64 off_on_time_ns;
> -	ktime_t time_now = ktime_get();
>  
> +	genpd->max_off_time_ns = -1;
>  	off_on_time_ns = genpd->power_off_latency_ns +
>  				genpd->power_on_latency_ns;
>  	/*
> @@ -109,8 +109,6 @@ static bool default_power_down_ok(struct
>  		if (sd_max_off_ns < 0)
>  			continue;
>  
> -		sd_max_off_ns -= ktime_to_ns(ktime_sub(time_now,
> -						       sd->power_off_time));
>  		/*
>  		 * Check if the subdomain is allowed to be off long enough for
>  		 * the current domain to turn off and on (that's how much time
> @@ -125,53 +123,43 @@ static bool default_power_down_ok(struct
>  	 */
>  	min_dev_off_time_ns = -1;
>  	list_for_each_entry(pdd, &genpd->dev_list, list_node) {
> -		struct gpd_timing_data *td;
> -		struct device *dev = pdd->dev;
> -		s64 dev_off_time_ns;
> +		s64 constraint_ns;
>  
> -		if (!dev->driver || dev->power.max_time_suspended_ns < 0)
> +		if (!pdd->dev->driver)
>  			continue;
>  
> -		td = &to_gpd_data(pdd)->td;
> -		dev_off_time_ns = dev->power.max_time_suspended_ns -
> -			(td->start_latency_ns + td->restore_state_latency_ns +
> -				ktime_to_ns(ktime_sub(time_now,
> -						dev->power.suspend_time)));
> -		if (dev_off_time_ns <= off_on_time_ns)
> +		/*
> +		 * Check if the device is allowed to be off long enough for the
> +		 * domain to turn off and on (that's how much time it will
> +		 * have to wait worst case).
> +		 */
> +		constraint_ns = to_gpd_data(pdd)->td.effective_constraint_ns;
> +		if (constraint_ns = 0)
> +			continue;
> +
> +		if (constraint_ns <= off_on_time_ns)
>  			return false;
>  
> -		if (min_dev_off_time_ns > dev_off_time_ns
> +		if (min_dev_off_time_ns > constraint_ns
>  		    || min_dev_off_time_ns < 0)
> -			min_dev_off_time_ns = dev_off_time_ns;
> -	}
> -
> -	if (min_dev_off_time_ns < 0) {
> -		/*
> -		 * There are no latency constraints, so the domain can spend
> -		 * arbitrary time in the "off" state.
> -		 */
> -		genpd->max_off_time_ns = -1;
> -		return true;
> +			min_dev_off_time_ns = constraint_ns;
>  	}
>  
>  	/*
> -	 * The difference between the computed minimum delta and the time needed
> -	 * to turn the domain on is the maximum theoretical time this domain can
> -	 * spend in the "off" state.
> +	 * If the computed minimum device off time is negative, there are no
> +	 * latency constraints, so the domain can spend arbitrary time in the
> +	 * "off" state.
>  	 */
> -	min_dev_off_time_ns -= genpd->power_on_latency_ns;
> +	if (min_dev_off_time_ns < 0)
> +		return true;
>  
>  	/*
> -	 * If the difference between the computed minimum delta and the time
> -	 * needed to turn the domain off and back on on is smaller than the
> -	 * domain's power break even time, removing power from the domain is not
> -	 * worth it.
> +	 * The difference between the computed minimum device off time and the
> +	 * time needed to turn the domain on is the maximum theoretical time
> +	 * this domain can spend in the "off" state.
>  	 */
> -	if (genpd->break_even_ns >
> -	    min_dev_off_time_ns - genpd->power_off_latency_ns)
> -		return false;
> -
> -	genpd->max_off_time_ns = min_dev_off_time_ns;
> +	genpd->max_off_time_ns = min_dev_off_time_ns -
> +					genpd->power_on_latency_ns;
>  	return true;
>  }
>  
> Index: linux/include/linux/pm_domain.h
> =================================> --- linux.orig/include/linux/pm_domain.h
> +++ linux/include/linux/pm_domain.h
> @@ -70,9 +70,7 @@ struct generic_pm_domain {
>  	int (*power_on)(struct generic_pm_domain *domain);
>  	s64 power_on_latency_ns;
>  	struct gpd_dev_ops dev_ops;
> -	s64 break_even_ns;	/* Power break even for the entire domain. */
>  	s64 max_off_time_ns;	/* Maximum allowed "suspended" time. */
> -	ktime_t power_off_time;
>  	struct device_node *of_node; /* Node in device tree */
>  };
>  
> Index: linux/drivers/base/power/domain.c
> =================================> --- linux.orig/drivers/base/power/domain.c
> +++ linux/drivers/base/power/domain.c
> @@ -443,7 +443,6 @@ static int pm_genpd_poweroff(struct gene
>  	}
>  
>  	genpd->status = GPD_STATE_POWER_OFF;
> -	genpd->power_off_time = ktime_get();
>  
>  	/* Update PM QoS information for devices in the domain. */
>  	list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) {
> 
> --
> 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
> 
> 


  reply	other threads:[~2012-04-24 21:55 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-24 21:49 [PATCH 0/3] PM / Domains: Fix device stop and domain power off governor functions Rafael J. Wysocki
2012-04-24 21:50 ` [PATCH 1/3] PM / Domains: Rework default device stop governor function Rafael J. Wysocki
2012-04-24 21:50 ` [PATCH 2/3] " Rafael J. Wysocki
2012-04-24 21:55   ` Rafael J. Wysocki [this message]
2012-04-24 21:51 ` [PATCH 3/3] PM / Runtime: Remove device fields related to suspend time Rafael J. Wysocki
2012-04-25 19:28 ` [PATCH 0/3] PM / Domains: Fix device stop and domain power off governor functions, take 2 Rafael J. Wysocki
2012-04-25 19:29   ` [PATCH 1/3] PM / Domains: Rework default device stop governor function, v2 Rafael J. Wysocki
2012-04-25 19:30   ` [PATCH 2/3] PM / Domains: Rework default domain power off " Rafael J. Wysocki
2012-04-25 19:30   ` [PATCH 3/3] PM / Runtime: Remove device fields related to suspend time, v2 Rafael J. Wysocki

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=201204242355.48498.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=j-pihet@ti.com \
    --cc=khilman@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=magnus.damm@gmail.com \
    --cc=markgross@thegnar.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;
as well as URLs for NNTP newsgroup(s).