linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 0/2] acpi x86: Make aperf mperf MSR usage in acpi_cpufreq read only
@ 2009-04-06 18:26 venkatesh.pallipadi
  2009-04-06 18:26 ` [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf venkatesh.pallipadi
  2009-04-06 18:26 ` [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only venkatesh.pallipadi
  0 siblings, 2 replies; 5+ messages in thread
From: venkatesh.pallipadi @ 2009-04-06 18:26 UTC (permalink / raw)
  To: lenb; +Cc: linux-acpi, Venkatesh Pallipadi

Patchset makes aperf mperf MSR access in acpi_cpufreq read only. This
enables other kernel and usaer level components to share read access
to these MSRs.

-- 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf
  2009-04-06 18:26 [patch 0/2] acpi x86: Make aperf mperf MSR usage in acpi_cpufreq read only venkatesh.pallipadi
@ 2009-04-06 18:26 ` venkatesh.pallipadi
  2009-04-07  5:34   ` Len Brown
  2009-04-06 18:26 ` [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only venkatesh.pallipadi
  1 sibling, 1 reply; 5+ messages in thread
From: venkatesh.pallipadi @ 2009-04-06 18:26 UTC (permalink / raw)
  To: lenb; +Cc: linux-acpi, Venkatesh Pallipadi

[-- Attachment #1: 0001-acpi-x86-Cleanup-acpi_cpufreq-structures-related-to.patch --]
[-- Type: text/plain, Size: 3383 bytes --]

Change structure name to make the code cleaner and simpler. No
functionality change in this patch.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
---
 arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   42 +++++++++++++--------------
 1 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 19f6b9d..340bdbe 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -241,23 +241,23 @@ static u32 get_cur_val(const struct cpumask *mask)
 	return cmd.val;
 }
 
-struct perf_cur {
+struct perf_pair {
 	union {
 		struct {
 			u32 lo;
 			u32 hi;
 		} split;
 		u64 whole;
-	} aperf_cur, mperf_cur;
+	} aperf, mperf;
 };
 
 
 static long read_measured_perf_ctrs(void *_cur)
 {
-	struct perf_cur *cur = _cur;
+	struct perf_pair *cur = _cur;
 
-	rdmsr(MSR_IA32_APERF, cur->aperf_cur.split.lo, cur->aperf_cur.split.hi);
-	rdmsr(MSR_IA32_MPERF, cur->mperf_cur.split.lo, cur->mperf_cur.split.hi);
+	rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
+	rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
 
 	wrmsr(MSR_IA32_APERF, 0, 0);
 	wrmsr(MSR_IA32_MPERF, 0, 0);
@@ -281,7 +281,7 @@ static long read_measured_perf_ctrs(void *_cur)
 static unsigned int get_measured_perf(struct cpufreq_policy *policy,
 				      unsigned int cpu)
 {
-	struct perf_cur cur;
+	struct perf_pair cur;
 	unsigned int perf_percent;
 	unsigned int retval;
 
@@ -294,39 +294,37 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy,
 	 * Get an approximate value. Return failure in case we cannot get
 	 * an approximate value.
 	 */
-	if (unlikely(cur.aperf_cur.split.hi || cur.mperf_cur.split.hi)) {
+	if (unlikely(cur.aperf.split.hi || cur.mperf.split.hi)) {
 		int shift_count;
 		u32 h;
 
-		h = max_t(u32, cur.aperf_cur.split.hi, cur.mperf_cur.split.hi);
+		h = max_t(u32, cur.aperf.split.hi, cur.mperf.split.hi);
 		shift_count = fls(h);
 
-		cur.aperf_cur.whole >>= shift_count;
-		cur.mperf_cur.whole >>= shift_count;
+		cur.aperf.whole >>= shift_count;
+		cur.mperf.whole >>= shift_count;
 	}
 
-	if (((unsigned long)(-1) / 100) < cur.aperf_cur.split.lo) {
+	if (((unsigned long)(-1) / 100) < cur.aperf.split.lo) {
 		int shift_count = 7;
-		cur.aperf_cur.split.lo >>= shift_count;
-		cur.mperf_cur.split.lo >>= shift_count;
+		cur.aperf.split.lo >>= shift_count;
+		cur.mperf.split.lo >>= shift_count;
 	}
 
-	if (cur.aperf_cur.split.lo && cur.mperf_cur.split.lo)
-		perf_percent = (cur.aperf_cur.split.lo * 100) /
-				cur.mperf_cur.split.lo;
+	if (cur.aperf.split.lo && cur.mperf.split.lo)
+		perf_percent = (cur.aperf.split.lo * 100) / cur.mperf.split.lo;
 	else
 		perf_percent = 0;
 
 #else
-	if (unlikely(((unsigned long)(-1) / 100) < cur.aperf_cur.whole)) {
+	if (unlikely(((unsigned long)(-1) / 100) < cur.aperf.whole)) {
 		int shift_count = 7;
-		cur.aperf_cur.whole >>= shift_count;
-		cur.mperf_cur.whole >>= shift_count;
+		cur.aperf.whole >>= shift_count;
+		cur.mperf.whole >>= shift_count;
 	}
 
-	if (cur.aperf_cur.whole && cur.mperf_cur.whole)
-		perf_percent = (cur.aperf_cur.whole * 100) /
-				cur.mperf_cur.whole;
+	if (cur.aperf.whole && cur.mperf.whole)
+		perf_percent = (cur.aperf.whole * 100) / cur.mperf.whole;
 	else
 		perf_percent = 0;
 
-- 
1.6.0.6

-- 


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only
  2009-04-06 18:26 [patch 0/2] acpi x86: Make aperf mperf MSR usage in acpi_cpufreq read only venkatesh.pallipadi
  2009-04-06 18:26 ` [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf venkatesh.pallipadi
@ 2009-04-06 18:26 ` venkatesh.pallipadi
  2009-04-07  5:35   ` Len Brown
  1 sibling, 1 reply; 5+ messages in thread
From: venkatesh.pallipadi @ 2009-04-06 18:26 UTC (permalink / raw)
  To: lenb; +Cc: linux-acpi, Venkatesh Pallipadi

[-- Attachment #1: 0002-acpi-x86-Make-aperf-mperf-MSR-access-in-acpi_cpufre.patch --]
[-- Type: text/plain, Size: 1843 bytes --]

Not write zeroes to APERF and MPERF by ondemand governor. With this
change, other users can share these MSRs for reads.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
---
 arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 340bdbe..9d3af38 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -68,6 +68,7 @@ struct acpi_cpufreq_data {
 	unsigned int max_freq;
 	unsigned int resume;
 	unsigned int cpu_feature;
+	u64 saved_aperf, saved_mperf;
 };
 
 static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
@@ -259,9 +260,6 @@ static long read_measured_perf_ctrs(void *_cur)
 	rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
 	rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
 
-	wrmsr(MSR_IA32_APERF, 0, 0);
-	wrmsr(MSR_IA32_MPERF, 0, 0);
-
 	return 0;
 }
 
@@ -281,13 +279,20 @@ static long read_measured_perf_ctrs(void *_cur)
 static unsigned int get_measured_perf(struct cpufreq_policy *policy,
 				      unsigned int cpu)
 {
-	struct perf_pair cur;
+	struct perf_pair readin, cur;
 	unsigned int perf_percent;
 	unsigned int retval;
 
-	if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur))
+	if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin))
 		return 0;
 
+	cur.aperf.whole = readin.aperf.whole -
+				per_cpu(drv_data, cpu)->saved_aperf;
+	cur.mperf.whole = readin.mperf.whole -
+				per_cpu(drv_data, cpu)->saved_mperf;
+	per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole;
+	per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole;
+
 #ifdef __i386__
 	/*
 	 * We dont want to do 64 bit divide with 32 bit kernel
-- 
1.6.0.6

-- 


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf
  2009-04-06 18:26 ` [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf venkatesh.pallipadi
@ 2009-04-07  5:34   ` Len Brown
  0 siblings, 0 replies; 5+ messages in thread
From: Len Brown @ 2009-04-07  5:34 UTC (permalink / raw)
  To: Venkatesh Pallipadi; +Cc: linux-acpi, cpufreq

applied

(and cpufreq@vger.kernel.org added to cc)

thanks,
Len Brown, Intel Open Source Technology Center

On Mon, 6 Apr 2009, venkatesh.pallipadi@intel.com wrote:

> Change structure name to make the code cleaner and simpler. No
> functionality change in this patch.
> 
> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> ---
>  arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   42 +++++++++++++--------------
>  1 files changed, 20 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> index 19f6b9d..340bdbe 100644
> --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> @@ -241,23 +241,23 @@ static u32 get_cur_val(const struct cpumask *mask)
>  	return cmd.val;
>  }
>  
> -struct perf_cur {
> +struct perf_pair {
>  	union {
>  		struct {
>  			u32 lo;
>  			u32 hi;
>  		} split;
>  		u64 whole;
> -	} aperf_cur, mperf_cur;
> +	} aperf, mperf;
>  };
>  
>  
>  static long read_measured_perf_ctrs(void *_cur)
>  {
> -	struct perf_cur *cur = _cur;
> +	struct perf_pair *cur = _cur;
>  
> -	rdmsr(MSR_IA32_APERF, cur->aperf_cur.split.lo, cur->aperf_cur.split.hi);
> -	rdmsr(MSR_IA32_MPERF, cur->mperf_cur.split.lo, cur->mperf_cur.split.hi);
> +	rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
> +	rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
>  
>  	wrmsr(MSR_IA32_APERF, 0, 0);
>  	wrmsr(MSR_IA32_MPERF, 0, 0);
> @@ -281,7 +281,7 @@ static long read_measured_perf_ctrs(void *_cur)
>  static unsigned int get_measured_perf(struct cpufreq_policy *policy,
>  				      unsigned int cpu)
>  {
> -	struct perf_cur cur;
> +	struct perf_pair cur;
>  	unsigned int perf_percent;
>  	unsigned int retval;
>  
> @@ -294,39 +294,37 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy,
>  	 * Get an approximate value. Return failure in case we cannot get
>  	 * an approximate value.
>  	 */
> -	if (unlikely(cur.aperf_cur.split.hi || cur.mperf_cur.split.hi)) {
> +	if (unlikely(cur.aperf.split.hi || cur.mperf.split.hi)) {
>  		int shift_count;
>  		u32 h;
>  
> -		h = max_t(u32, cur.aperf_cur.split.hi, cur.mperf_cur.split.hi);
> +		h = max_t(u32, cur.aperf.split.hi, cur.mperf.split.hi);
>  		shift_count = fls(h);
>  
> -		cur.aperf_cur.whole >>= shift_count;
> -		cur.mperf_cur.whole >>= shift_count;
> +		cur.aperf.whole >>= shift_count;
> +		cur.mperf.whole >>= shift_count;
>  	}
>  
> -	if (((unsigned long)(-1) / 100) < cur.aperf_cur.split.lo) {
> +	if (((unsigned long)(-1) / 100) < cur.aperf.split.lo) {
>  		int shift_count = 7;
> -		cur.aperf_cur.split.lo >>= shift_count;
> -		cur.mperf_cur.split.lo >>= shift_count;
> +		cur.aperf.split.lo >>= shift_count;
> +		cur.mperf.split.lo >>= shift_count;
>  	}
>  
> -	if (cur.aperf_cur.split.lo && cur.mperf_cur.split.lo)
> -		perf_percent = (cur.aperf_cur.split.lo * 100) /
> -				cur.mperf_cur.split.lo;
> +	if (cur.aperf.split.lo && cur.mperf.split.lo)
> +		perf_percent = (cur.aperf.split.lo * 100) / cur.mperf.split.lo;
>  	else
>  		perf_percent = 0;
>  
>  #else
> -	if (unlikely(((unsigned long)(-1) / 100) < cur.aperf_cur.whole)) {
> +	if (unlikely(((unsigned long)(-1) / 100) < cur.aperf.whole)) {
>  		int shift_count = 7;
> -		cur.aperf_cur.whole >>= shift_count;
> -		cur.mperf_cur.whole >>= shift_count;
> +		cur.aperf.whole >>= shift_count;
> +		cur.mperf.whole >>= shift_count;
>  	}
>  
> -	if (cur.aperf_cur.whole && cur.mperf_cur.whole)
> -		perf_percent = (cur.aperf_cur.whole * 100) /
> -				cur.mperf_cur.whole;
> +	if (cur.aperf.whole && cur.mperf.whole)
> +		perf_percent = (cur.aperf.whole * 100) / cur.mperf.whole;
>  	else
>  		perf_percent = 0;
>  
> -- 
> 1.6.0.6
> 
> -- 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only
  2009-04-06 18:26 ` [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only venkatesh.pallipadi
@ 2009-04-07  5:35   ` Len Brown
  0 siblings, 0 replies; 5+ messages in thread
From: Len Brown @ 2009-04-07  5:35 UTC (permalink / raw)
  To: Venkatesh Pallipadi; +Cc: linux-acpi, cpufreq

applied

(and cpufreq@vger.kernel.org cc'd)

thanks,
Len Brown, Intel Open Source Technology Center

On Mon, 6 Apr 2009, venkatesh.pallipadi@intel.com wrote:

> Not write zeroes to APERF and MPERF by ondemand governor. With this
> change, other users can share these MSRs for reads.
> 
> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> ---
>  arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   15 ++++++++++-----
>  1 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> index 340bdbe..9d3af38 100644
> --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> @@ -68,6 +68,7 @@ struct acpi_cpufreq_data {
>  	unsigned int max_freq;
>  	unsigned int resume;
>  	unsigned int cpu_feature;
> +	u64 saved_aperf, saved_mperf;
>  };
>  
>  static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
> @@ -259,9 +260,6 @@ static long read_measured_perf_ctrs(void *_cur)
>  	rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
>  	rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
>  
> -	wrmsr(MSR_IA32_APERF, 0, 0);
> -	wrmsr(MSR_IA32_MPERF, 0, 0);
> -
>  	return 0;
>  }
>  
> @@ -281,13 +279,20 @@ static long read_measured_perf_ctrs(void *_cur)
>  static unsigned int get_measured_perf(struct cpufreq_policy *policy,
>  				      unsigned int cpu)
>  {
> -	struct perf_pair cur;
> +	struct perf_pair readin, cur;
>  	unsigned int perf_percent;
>  	unsigned int retval;
>  
> -	if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur))
> +	if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin))
>  		return 0;
>  
> +	cur.aperf.whole = readin.aperf.whole -
> +				per_cpu(drv_data, cpu)->saved_aperf;
> +	cur.mperf.whole = readin.mperf.whole -
> +				per_cpu(drv_data, cpu)->saved_mperf;
> +	per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole;
> +	per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole;
> +
>  #ifdef __i386__
>  	/*
>  	 * We dont want to do 64 bit divide with 32 bit kernel
> -- 
> 1.6.0.6
> 
> -- 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-04-07  5:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-06 18:26 [patch 0/2] acpi x86: Make aperf mperf MSR usage in acpi_cpufreq read only venkatesh.pallipadi
2009-04-06 18:26 ` [patch 1/2] acpi x86: Cleanup acpi_cpufreq structures related to aperf/mperf venkatesh.pallipadi
2009-04-07  5:34   ` Len Brown
2009-04-06 18:26 ` [patch 2/2] acpi x86: Make aperf/mperf MSR access in acpi_cpufreq read_only venkatesh.pallipadi
2009-04-07  5:35   ` Len Brown

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).