From: Thomas Renninger <trenn@suse.de>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org, Gautham R Shenoy <ego@in.ibm.com>,
Andreas Herrmann <andreas.herrmann3@amd.com>,
Balbir Singh <balbir@in.ibm.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>,
Yanmin <yanmin_zhang@linux.intel.com>,
Dave Jones <davej@redhat.com>, Len Brown <len.brown@intel.com>,
Yinghai Lu <yhlu.kernel@gmail.com>,
cpufreq@vger.kernel.org
Subject: Re: [RFC][PATCH 10/14] x86: generic aperf/mperf code.
Date: Fri, 4 Sep 2009 11:19:05 +0200 [thread overview]
Message-ID: <200909041119.06979.trenn@suse.de> (raw)
In-Reply-To: <20090903132213.006719409@chello.nl>
On Thursday 03 September 2009 15:21:55 Peter Zijlstra wrote:
> Move some of the aperf/mperf code out from the cpufreq driver thingy
> so that other people can enjoy it too.
>
> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: H. Peter Anvin <hpa@zytor.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> Cc: Yanmin <yanmin_zhang@linux.intel.com>
> Cc: Dave Jones <davej@redhat.com>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Yinghai Lu <yhlu.kernel@gmail.com>
> Cc: cpufreq@vger.kernel.org
> ---
> arch/x86/include/asm/processor.h | 12 ++++++++
> arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 41
+++++++++--------------------
> 2 files changed, 26 insertions(+), 27 deletions(-)
>
> Index: linux-2.6/arch/x86/include/asm/processor.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/processor.h
> +++ linux-2.6/arch/x86/include/asm/processor.h
> @@ -1000,4 +1000,16 @@ extern void start_thread(struct pt_regs
> extern int get_tsc_mode(unsigned long adr);
> extern int set_tsc_mode(unsigned int val);
>
> +struct aperfmperf {
> + u64 aperf, mperf;
> +};
> +
> +static inline void get_aperfmperf(struct aperfmperf *am)
> +{
> + WARN_ON_ONCE(!boot_cpu_has(X86_FEATURE_APERFMPERF));
> +
> + rdmsrl(MSR_IA32_APERF, am->aperf);
> + rdmsrl(MSR_IA32_MPERF, am->mperf);
> +}
> +
> #endif /* _ASM_X86_PROCESSOR_H */
> Index: linux-2.6/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> +++ linux-2.6/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> @@ -243,23 +243,12 @@ static u32 get_cur_val(const struct cpum
> return cmd.val;
> }
>
> -struct perf_pair {
> - union {
> - struct {
> - u32 lo;
> - u32 hi;
> - } split;
> - u64 whole;
> - } aperf, mperf;
> -};
> -
> /* Called via smp_call_function_single(), on the target CPU */
> static void read_measured_perf_ctrs(void *_cur)
> {
> - struct perf_pair *cur = _cur;
> + struct aperfmperf *am = _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);
> + get_aperfmperf(am);
> }
>
> /*
> @@ -278,19 +267,17 @@ static void read_measured_perf_ctrs(void
> static unsigned int get_measured_perf(struct cpufreq_policy *policy,
> unsigned int cpu)
> {
> - struct perf_pair readin, cur;
> + struct aperfmperf readin, cur;
> unsigned int perf_percent;
> unsigned int retval;
>
> if (smp_call_function_single(cpu, read_measured_perf_ctrs, &readin,
1))
> return 0;
>
> - cur.aperf.whole = readin.aperf.whole -
> - per_cpu(msr_data, cpu).saved_aperf;
> - cur.mperf.whole = readin.mperf.whole -
> - per_cpu(msr_data, cpu).saved_mperf;
> - per_cpu(msr_data, cpu).saved_aperf = readin.aperf.whole;
> - per_cpu(msr_data, cpu).saved_mperf = readin.mperf.whole;
> + cur.aperf = readin.aperf - per_cpu(msr_data, cpu).saved_aperf;
> + cur.mperf = readin.mperf - per_cpu(msr_data, cpu).saved_mperf;
> + per_cpu(msr_data, cpu).saved_aperf = readin.aperf;
> + per_cpu(msr_data, cpu).saved_mperf = readin.mperf;
>
> #ifdef __i386__
> /*
> @@ -305,8 +292,8 @@ static unsigned int get_measured_perf(st
> h = max_t(u32, cur.aperf.split.hi, cur.mperf.split.hi);
You still use struct perf_pair split/hi/lo members in #ifdef __i386__
case which you deleted above.
> shift_count = fls(h);
>
> - cur.aperf.whole >>= shift_count;
> - cur.mperf.whole >>= shift_count;
> + cur.aperf >>= shift_count;
> + cur.mperf >>= shift_count;
> }
>
> if (((unsigned long)(-1) / 100) < cur.aperf.split.lo) {
Same here, possibly still elsewhere.
Is this only x86_64 compile tested?
Thomas
> @@ -321,14 +308,14 @@ static unsigned int get_measured_perf(st
> perf_percent = 0;
>
> #else
> - if (unlikely(((unsigned long)(-1) / 100) < cur.aperf.whole)) {
> + if (unlikely(((unsigned long)(-1) / 100) < cur.aperf)) {
> int shift_count = 7;
> - cur.aperf.whole >>= shift_count;
> - cur.mperf.whole >>= shift_count;
> + cur.aperf >>= shift_count;
> + cur.mperf >>= shift_count;
> }
>
> - if (cur.aperf.whole && cur.mperf.whole)
> - perf_percent = (cur.aperf.whole * 100) / cur.mperf.whole;
> + if (cur.aperf && cur.mperf)
> + perf_percent = (cur.aperf * 100) / cur.mperf;
> else
> perf_percent = 0;
>
>
> --
>
> --
> To unsubscribe from this list: send the line "unsubscribe cpufreq" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2009-09-04 9:19 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-03 13:21 [RFC][PATCH 00/14] load-balancing and cpu_power -v3 Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 01/14] sched: restore __cpu_power to a straight sum of power Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 02/14] sched: SD_PREFER_SIBLING Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 03/14] sched: update the cpu_power sum during load-balance Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 04/14] sched: add smt_gain Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 05/14] sched: dynamic cpu_power Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 06/14] sched: scale down cpu_power due to RT tasks Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 07/14] sched: try to deal with low capacity Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 08/14] sched: remove reciprocal for cpu_power Peter Zijlstra
2009-09-03 13:59 ` Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 09/14] x86: move APERF/MPERF into a X86_FEATURE Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 10/14] x86: generic aperf/mperf code Peter Zijlstra
2009-09-04 9:19 ` Thomas Renninger [this message]
2009-09-04 9:25 ` Peter Zijlstra
2009-09-04 9:27 ` Peter Zijlstra
2009-09-04 9:34 ` Thomas Renninger
2009-09-04 14:22 ` Dave Jones
2009-09-04 14:42 ` Peter Zijlstra
2009-09-04 17:45 ` H. Peter Anvin
2009-09-03 13:21 ` [RFC][PATCH 11/14] sched: provide arch_scale_freq_power Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 12/14] x86: sched: provide arch implementations using aperf/mperf Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 13/14] sched: cleanup wake_idle power saving Peter Zijlstra
2009-09-03 13:21 ` [RFC][PATCH 14/14] sched: cleanup wake_idle Peter Zijlstra
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=200909041119.06979.trenn@suse.de \
--to=trenn@suse.de \
--cc=a.p.zijlstra@chello.nl \
--cc=andreas.herrmann3@amd.com \
--cc=balbir@in.ibm.com \
--cc=cpufreq@vger.kernel.org \
--cc=davej@redhat.com \
--cc=ego@in.ibm.com \
--cc=hpa@zytor.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=venkatesh.pallipadi@intel.com \
--cc=yanmin_zhang@linux.intel.com \
--cc=yhlu.kernel@gmail.com \
/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.