linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support
@ 2010-03-26 13:39 Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 1/6] x86, cpu: Add AMD core boosting feature flag to /proc/cpuinfo Borislav Petkov
                   ` (5 more replies)
  0 siblings, 6 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Borislav Petkov <borislav.petkov@amd.com>

Hi,

here's the next version. This one adds only the move of APERF/MPERF
cpuid fragment to vendor-agnostic x86 init path, as Thomas suggested.

Changelog:

v1: add a /proc/cpuinfo flag and remove the scaling_cur_freq interface
overload in favor of cpufreq-aperf userspace tool.

v0: initial submission


-- 
Regards/Gruss,
Boris.

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

* [-v2 PATCH 1/6] x86, cpu: Add AMD core boosting feature flag to /proc/cpuinfo
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
@ 2010-03-26 13:39 ` Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 2/6] powernow-k8: Add core performance boost support Borislav Petkov
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Borislav Petkov <borislav.petkov@amd.com>

By semi-popular demand, this adds the Core Performance Boost feature
flag to /proc/cpuinfo. Possible use case for this is userspace tools
like cpufreq-aperf, for example, so that they don't have to jump through
hoops of accessing "/dev/cpu/%d/cpuid" in order to check for CPB hw
support, or call cpuid from userspace.

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 arch/x86/include/asm/cpufeature.h          |    1 +
 arch/x86/kernel/cpu/addon_cpuid_features.c |    5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 0cd82d0..630e623 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -161,6 +161,7 @@
  */
 #define X86_FEATURE_IDA		(7*32+ 0) /* Intel Dynamic Acceleration */
 #define X86_FEATURE_ARAT	(7*32+ 1) /* Always Running APIC Timer */
+#define X86_FEATURE_CPB		(7*32+ 2) /* AMD Core Performance Boost */
 
 /* Virtualization flags: Linux defined */
 #define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */
diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c
index 97ad79c..ead2a1c 100644
--- a/arch/x86/kernel/cpu/addon_cpuid_features.c
+++ b/arch/x86/kernel/cpu/addon_cpuid_features.c
@@ -30,8 +30,9 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
 	const struct cpuid_bit *cb;
 
 	static const struct cpuid_bit __cpuinitconst cpuid_bits[] = {
-		{ X86_FEATURE_IDA, CR_EAX, 1, 0x00000006 },
-		{ X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006 },
+		{ X86_FEATURE_IDA,   CR_EAX, 1, 0x00000006 },
+		{ X86_FEATURE_ARAT,  CR_EAX, 2, 0x00000006 },
+		{ X86_FEATURE_CPB,   CR_EDX, 9, 0x80000007 },
 		{ X86_FEATURE_NPT,   CR_EDX, 0, 0x8000000a },
 		{ X86_FEATURE_LBRV,  CR_EDX, 1, 0x8000000a },
 		{ X86_FEATURE_SVML,  CR_EDX, 2, 0x8000000a },
-- 
1.7.0


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

* [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 1/6] x86, cpu: Add AMD core boosting feature flag to /proc/cpuinfo Borislav Petkov
@ 2010-03-26 13:39 ` Borislav Petkov
  2010-03-30 22:42   ` Andrew Morton
  2010-03-26 13:39 ` [-v2 PATCH 3/6] x86: Unify APERF/MPERF support Borislav Petkov
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Borislav Petkov <borislav.petkov@amd.com>

Starting with F10h, revE, AMD processors add support for a dynamic
core boosting feature called Core Performance Boost. When a specific
condition is present, a subset of the cores on a system are boosted
beyond their P0 operating frequency to speed up the performance of
single-threaded applications.

In the normal case, the system comes out of reset with core boosting
enabled. This patch adds a sysfs knob with which core boosting can be
switched on or off for benchmarking purposes.

While at it, cleanup the driver init codepath and update copyrights.

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 arch/x86/kernel/cpu/cpufreq/powernow-k8.c |  110 ++++++++++++++++++++++++++---
 arch/x86/kernel/cpu/cpufreq/powernow-k8.h |    2 -
 2 files changed, 100 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
index d360b56..b86daa6 100644
--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
@@ -1,6 +1,5 @@
-
 /*
- *   (c) 2003-2006 Advanced Micro Devices, Inc.
+ *   (c) 2003-2010 Advanced Micro Devices, Inc.
  *  Your use of this code is subject to the terms and conditions of the
  *  GNU general public license version 2. See "COPYING" or
  *  http://www.gnu.org/licenses/gpl.html
@@ -54,6 +53,10 @@ static DEFINE_PER_CPU(struct powernow_k8_data *, powernow_data);
 
 static int cpu_family = CPU_OPTERON;
 
+/* core performance boost */
+static bool cpb_capable, cpb_enabled;
+static struct msr __percpu *msrs;
+
 #ifndef CONFIG_SMP
 static inline const struct cpumask *cpu_core_mask(int cpu)
 {
@@ -1393,8 +1396,73 @@ out:
 	return khz;
 }
 
+static void _cpb_toggle_msrs(bool t)
+{
+	int cpu;
+
+	rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
+
+	for_each_cpu(cpu, cpu_online_mask) {
+		struct msr *reg = per_cpu_ptr(msrs, cpu);
+		if (t)
+			reg->l &= ~BIT(25);
+		else
+			reg->l |= BIT(25);
+	}
+	wrmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
+}
+
+/*
+ * Switch on/off core performance boosting.
+ *
+ * 0=disable
+ * 1=enable.
+ */
+static void cpb_toggle(bool t)
+{
+	if (!cpb_capable)
+		return;
+
+	if (t && !cpb_enabled) {
+		cpb_enabled = true;
+		_cpb_toggle_msrs(t);
+		printk(KERN_INFO PFX "Core Boosting enabled.\n");
+	} else if (!t && cpb_enabled) {
+		cpb_enabled = false;
+		_cpb_toggle_msrs(t);
+		printk(KERN_INFO PFX "Core Boosting disabled.\n");
+	}
+}
+
+static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
+				 size_t count)
+{
+	int ret = -EINVAL;
+	unsigned long val = 0;
+
+	ret = strict_strtoul(buf, 10, &val);
+	if (!ret && (val == 0 || val == 1) && cpb_capable)
+		cpb_toggle(val);
+	else
+		return -EINVAL;
+
+	return count;
+}
+
+static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
+{
+	return sprintf(buf, "%u\n", cpb_enabled);
+}
+
+#define define_one_rw(_name) \
+static struct freq_attr _name = \
+__ATTR(_name, 0644, show_##_name, store_##_name)
+
+define_one_rw(cpb);
+
 static struct freq_attr *powernow_k8_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+	&cpb,
 	NULL,
 };
 
@@ -1413,7 +1481,7 @@ static struct cpufreq_driver cpufreq_amd64_driver = {
 /* driver entry point for init */
 static int __cpuinit powernowk8_init(void)
 {
-	unsigned int i, supported_cpus = 0;
+	unsigned int i, supported_cpus = 0, cpu;
 
 	for_each_online_cpu(i) {
 		int rc;
@@ -1422,15 +1490,34 @@ static int __cpuinit powernowk8_init(void)
 			supported_cpus++;
 	}
 
-	if (supported_cpus == num_online_cpus()) {
-		printk(KERN_INFO PFX "Found %d %s "
-			"processors (%d cpu cores) (" VERSION ")\n",
-			num_online_nodes(),
-			boot_cpu_data.x86_model_id, supported_cpus);
-		return cpufreq_register_driver(&cpufreq_amd64_driver);
+	if (supported_cpus != num_online_cpus())
+		return -ENODEV;
+
+	printk(KERN_INFO PFX "Found %d %s (%d cpu cores) (" VERSION ")\n",
+		num_online_nodes(), boot_cpu_data.x86_model_id, supported_cpus);
+
+	if (boot_cpu_has(X86_FEATURE_CPB)) {
+
+		cpb_capable = true;
+
+		msrs = msrs_alloc();
+		if (!msrs) {
+			printk(KERN_ERR "%s: Error allocating msrs!\n", __func__);
+			return -ENOMEM;
+		}
+
+		rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
+
+		for_each_cpu(cpu, cpu_online_mask) {
+			struct msr *reg = per_cpu_ptr(msrs, cpu);
+			cpb_enabled |= !(!!(reg->l & BIT(25)));
+		}
+
+		printk(KERN_INFO PFX "Core Performance Boosting: %s.\n",
+			(cpb_enabled ? "on" : "off"));
 	}
 
-	return -ENODEV;
+	return cpufreq_register_driver(&cpufreq_amd64_driver);
 }
 
 /* driver entry point for term */
@@ -1438,6 +1525,9 @@ static void __exit powernowk8_exit(void)
 {
 	dprintk("exit\n");
 
+	msrs_free(msrs);
+	msrs = NULL;
+
 	cpufreq_unregister_driver(&cpufreq_amd64_driver);
 }
 
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
index 02ce824..df3529b 100644
--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
@@ -5,7 +5,6 @@
  *  http://www.gnu.org/licenses/gpl.html
  */
 
-
 enum pstate {
 	HW_PSTATE_INVALID = 0xff,
 	HW_PSTATE_0 = 0,
@@ -55,7 +54,6 @@ struct powernow_k8_data {
 	struct cpumask *available_cores;
 };
 
-
 /* processor's cpuid instruction support */
 #define CPUID_PROCESSOR_SIGNATURE	1	/* function 1 */
 #define CPUID_XFAM			0x0ff00000	/* extended family */
-- 
1.7.0


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

* [-v2 PATCH 3/6] x86: Unify APERF/MPERF support
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 1/6] x86, cpu: Add AMD core boosting feature flag to /proc/cpuinfo Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 2/6] powernow-k8: Add core performance boost support Borislav Petkov
@ 2010-03-26 13:39 ` Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 4/6] cpufreq: Add APERF/MPERF support for AMD processors Borislav Petkov
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Borislav Petkov <borislav.petkov@amd.com>

Initialize this CPUID flag feature in common code. It could be made a
standalone function later, maybe, if more functionality is duplicated.

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 arch/x86/kernel/cpu/addon_cpuid_features.c |    8 ++++++++
 arch/x86/kernel/cpu/intel.c                |    6 ------
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c
index ead2a1c..fd1fc19 100644
--- a/arch/x86/kernel/cpu/addon_cpuid_features.c
+++ b/arch/x86/kernel/cpu/addon_cpuid_features.c
@@ -54,6 +54,14 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
 		if (regs[cb->reg] & (1 << cb->bit))
 			set_cpu_cap(c, cb->feature);
 	}
+
+	/*
+	 * common AMD/Intel features
+	 */
+	if (c->cpuid_level >= 6) {
+		if (cpuid_ecx(6) & 0x1)
+			set_cpu_cap(c, X86_FEATURE_APERFMPERF);
+	}
 }
 
 /* leaf 0xb SMT level */
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 7e1cca1..3830258 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -352,12 +352,6 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
 			set_cpu_cap(c, X86_FEATURE_ARCH_PERFMON);
 	}
 
-	if (c->cpuid_level > 6) {
-		unsigned ecx = cpuid_ecx(6);
-		if (ecx & 0x01)
-			set_cpu_cap(c, X86_FEATURE_APERFMPERF);
-	}
-
 	if (cpu_has_xmm2)
 		set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
 	if (cpu_has_ds) {
-- 
1.7.0


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

* [-v2 PATCH 4/6] cpufreq: Add APERF/MPERF support for AMD processors
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
                   ` (2 preceding siblings ...)
  2010-03-26 13:39 ` [-v2 PATCH 3/6] x86: Unify APERF/MPERF support Borislav Petkov
@ 2010-03-26 13:39 ` Borislav Petkov
  2010-03-26 13:39 ` [-v2 PATCH 5/6] powernow-k8: Fix frequency reporting Borislav Petkov
  2010-03-26 13:40 ` [-v2 PATCH 6/6] cpufreq: Unify sysfs attribute definition macros Borislav Petkov
  5 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Mark Langsdorf <mark.langsdorf@amd.com>

Starting with model 10 of Family 0x10, AMD processors may have
support for APERF/MPERF.  Add support for identifying it and using
it within cpufreq.  Move the APERF/MPERF functions out of the
acpi-cpufreq code and into their own file so they can easily be
shared.

Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 arch/x86/kernel/cpu/cpufreq/Makefile       |    4 +-
 arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   44 +-----------------------
 arch/x86/kernel/cpu/cpufreq/mperf.c        |   50 ++++++++++++++++++++++++++++
 arch/x86/kernel/cpu/cpufreq/mperf.h        |    9 +++++
 arch/x86/kernel/cpu/cpufreq/powernow-k8.c  |    8 ++++
 5 files changed, 71 insertions(+), 44 deletions(-)
 create mode 100644 arch/x86/kernel/cpu/cpufreq/mperf.c
 create mode 100644 arch/x86/kernel/cpu/cpufreq/mperf.h

diff --git a/arch/x86/kernel/cpu/cpufreq/Makefile b/arch/x86/kernel/cpu/cpufreq/Makefile
index 1840c0a..bd54bf6 100644
--- a/arch/x86/kernel/cpu/cpufreq/Makefile
+++ b/arch/x86/kernel/cpu/cpufreq/Makefile
@@ -2,8 +2,8 @@
 # K8 systems. ACPI is preferred to all other hardware-specific drivers.
 # speedstep-* is preferred over p4-clockmod.
 
-obj-$(CONFIG_X86_POWERNOW_K8)		+= powernow-k8.o
-obj-$(CONFIG_X86_ACPI_CPUFREQ)		+= acpi-cpufreq.o
+obj-$(CONFIG_X86_POWERNOW_K8)		+= powernow-k8.o mperf.o
+obj-$(CONFIG_X86_ACPI_CPUFREQ)		+= acpi-cpufreq.o mperf.o
 obj-$(CONFIG_X86_PCC_CPUFREQ)		+= pcc-cpufreq.o
 obj-$(CONFIG_X86_POWERNOW_K6)		+= powernow-k6.o
 obj-$(CONFIG_X86_POWERNOW_K7)		+= powernow-k7.o
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 1b1920f..dc68e5c 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -45,6 +45,7 @@
 #include <asm/msr.h>
 #include <asm/processor.h>
 #include <asm/cpufeature.h>
+#include "mperf.h"
 
 #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
 		"acpi-cpufreq", msg)
@@ -70,8 +71,6 @@ struct acpi_cpufreq_data {
 
 static DEFINE_PER_CPU(struct acpi_cpufreq_data *, acfreq_data);
 
-static DEFINE_PER_CPU(struct aperfmperf, acfreq_old_perf);
-
 /* acpi_perf_data is a pointer to percpu data. */
 static struct acpi_processor_performance *acpi_perf_data;
 
@@ -239,45 +238,6 @@ static u32 get_cur_val(const struct cpumask *mask)
 	return cmd.val;
 }
 
-/* Called via smp_call_function_single(), on the target CPU */
-static void read_measured_perf_ctrs(void *_cur)
-{
-	struct aperfmperf *am = _cur;
-
-	get_aperfmperf(am);
-}
-
-/*
- * Return the measured active (C0) frequency on this CPU since last call
- * to this function.
- * Input: cpu number
- * Return: Average CPU frequency in terms of max frequency (zero on error)
- *
- * We use IA32_MPERF and IA32_APERF MSRs to get the measured performance
- * over a period of time, while CPU is in C0 state.
- * IA32_MPERF counts at the rate of max advertised frequency
- * IA32_APERF counts at the rate of actual CPU frequency
- * Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
- * no meaning should be associated with absolute values of these MSRs.
- */
-static unsigned int get_measured_perf(struct cpufreq_policy *policy,
-				      unsigned int cpu)
-{
-	struct aperfmperf perf;
-	unsigned long ratio;
-	unsigned int retval;
-
-	if (smp_call_function_single(cpu, read_measured_perf_ctrs, &perf, 1))
-		return 0;
-
-	ratio = calc_aperfmperf_ratio(&per_cpu(acfreq_old_perf, cpu), &perf);
-	per_cpu(acfreq_old_perf, cpu) = perf;
-
-	retval = (policy->cpuinfo.max_freq * ratio) >> APERFMPERF_SHIFT;
-
-	return retval;
-}
-
 static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, cpu);
@@ -701,7 +661,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
 	/* Check for APERF/MPERF support in hardware */
 	if (cpu_has(c, X86_FEATURE_APERFMPERF))
-		acpi_cpufreq_driver.getavg = get_measured_perf;
+		acpi_cpufreq_driver.getavg = cpufreq_get_measured_perf;
 
 	dprintk("CPU%u - ACPI performance management activated.\n", cpu);
 	for (i = 0; i < perf->state_count; i++)
diff --git a/arch/x86/kernel/cpu/cpufreq/mperf.c b/arch/x86/kernel/cpu/cpufreq/mperf.c
new file mode 100644
index 0000000..bc5a5df
--- /dev/null
+++ b/arch/x86/kernel/cpu/cpufreq/mperf.c
@@ -0,0 +1,50 @@
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/cpufreq.h>
+#include <linux/slab.h>
+
+#include "mperf.h"
+
+static DEFINE_PER_CPU(struct aperfmperf, acfreq_old_perf);
+
+/* Called via smp_call_function_single(), on the target CPU */
+static void read_measured_perf_ctrs(void *_cur)
+{
+	struct aperfmperf *am = _cur;
+
+	get_aperfmperf(am);
+}
+
+/*
+ * Return the measured active (C0) frequency on this CPU since last call
+ * to this function.
+ * Input: cpu number
+ * Return: Average CPU frequency in terms of max frequency (zero on error)
+ *
+ * We use IA32_MPERF and IA32_APERF MSRs to get the measured performance
+ * over a period of time, while CPU is in C0 state.
+ * IA32_MPERF counts at the rate of max advertised frequency
+ * IA32_APERF counts at the rate of actual CPU frequency
+ * Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
+ * no meaning should be associated with absolute values of these MSRs.
+ */
+unsigned int cpufreq_get_measured_perf(struct cpufreq_policy *policy,
+					unsigned int cpu)
+{
+	struct aperfmperf perf;
+	unsigned long ratio;
+	unsigned int retval;
+
+	if (smp_call_function_single(cpu, read_measured_perf_ctrs, &perf, 1))
+		return 0;
+
+	ratio = calc_aperfmperf_ratio(&per_cpu(acfreq_old_perf, cpu), &perf);
+	per_cpu(acfreq_old_perf, cpu) = perf;
+
+	retval = (policy->cpuinfo.max_freq * ratio) >> APERFMPERF_SHIFT;
+
+	return retval;
+}
+EXPORT_SYMBOL_GPL(cpufreq_get_measured_perf);
diff --git a/arch/x86/kernel/cpu/cpufreq/mperf.h b/arch/x86/kernel/cpu/cpufreq/mperf.h
new file mode 100644
index 0000000..5dbf295
--- /dev/null
+++ b/arch/x86/kernel/cpu/cpufreq/mperf.h
@@ -0,0 +1,9 @@
+/*
+ *  (c) 2010 Advanced Micro Devices, Inc.
+ *  Your use of this code is subject to the terms and conditions of the
+ *  GNU general public license version 2. See "COPYING" or
+ *  http://www.gnu.org/licenses/gpl.html
+ */
+
+unsigned int cpufreq_get_measured_perf(struct cpufreq_policy *policy,
+					unsigned int cpu);
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
index b86daa6..1dd292c 100644
--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
@@ -45,6 +45,7 @@
 #define PFX "powernow-k8: "
 #define VERSION "version 2.20.00"
 #include "powernow-k8.h"
+#include "mperf.h"
 
 /* serialize freq changes  */
 static DEFINE_MUTEX(fidvid_mutex);
@@ -57,6 +58,8 @@ static int cpu_family = CPU_OPTERON;
 static bool cpb_capable, cpb_enabled;
 static struct msr __percpu *msrs;
 
+static struct cpufreq_driver cpufreq_amd64_driver;
+
 #ifndef CONFIG_SMP
 static inline const struct cpumask *cpu_core_mask(int cpu)
 {
@@ -1251,6 +1254,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
 	struct powernow_k8_data *data;
 	struct init_on_cpu init_on_cpu;
 	int rc;
+	struct cpuinfo_x86 *c = &cpu_data(pol->cpu);
 
 	if (!cpu_online(pol->cpu))
 		return -ENODEV;
@@ -1325,6 +1329,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
 		return -EINVAL;
 	}
 
+	/* Check for APERF/MPERF support in hardware */
+	if (cpu_has(c, X86_FEATURE_APERFMPERF))
+		cpufreq_amd64_driver.getavg = cpufreq_get_measured_perf;
+
 	cpufreq_frequency_table_get_attr(data->powernow_table, pol->cpu);
 
 	if (cpu_family == CPU_HW_PSTATE)
-- 
1.7.0


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

* [-v2 PATCH 5/6] powernow-k8: Fix frequency reporting
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
                   ` (3 preceding siblings ...)
  2010-03-26 13:39 ` [-v2 PATCH 4/6] cpufreq: Add APERF/MPERF support for AMD processors Borislav Petkov
@ 2010-03-26 13:39 ` Borislav Petkov
  2010-03-26 13:40 ` [-v2 PATCH 6/6] cpufreq: Unify sysfs attribute definition macros Borislav Petkov
  5 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:39 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Mark Langsdorf <mark.langsdorf@amd.com>

With F10, model 10, all valid frequencies are in the ACPI _PST table.

Cc: <stable@kernel.org> # 33.x 32.x
Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 arch/x86/kernel/cpu/cpufreq/powernow-k8.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
index 1dd292c..317db7b 100644
--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
@@ -935,7 +935,8 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,
 		powernow_table[i].index = index;
 
 		/* Frequency may be rounded for these */
-		if (boot_cpu_data.x86 == 0x10 || boot_cpu_data.x86 == 0x11) {
+		if ((boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model < 10)
+				 || boot_cpu_data.x86 == 0x11) {
 			powernow_table[i].frequency =
 				freq_from_fid_did(lo & 0x3f, (lo >> 6) & 7);
 		} else
-- 
1.7.0


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

* [-v2 PATCH 6/6] cpufreq: Unify sysfs attribute definition macros
  2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
                   ` (4 preceding siblings ...)
  2010-03-26 13:39 ` [-v2 PATCH 5/6] powernow-k8: Fix frequency reporting Borislav Petkov
@ 2010-03-26 13:40 ` Borislav Petkov
  5 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-26 13:40 UTC (permalink / raw)
  To: akpm, davej; +Cc: trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Borislav Petkov <borislav.petkov@amd.com>

Multiple modules used to define those which are with identical
functionality and were needlessly replicated among the different cpufreq
drivers. Push them into the header and remove duplication.

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Reviewed-by: Thomas Renninger <trenn@suse.de>
---
 drivers/cpufreq/cpufreq.c              |   40 +++++++++-----------------
 drivers/cpufreq/cpufreq_conservative.c |   48 ++++++++++---------------------
 drivers/cpufreq/cpufreq_ondemand.c     |   40 ++++++++------------------
 include/linux/cpufreq.h                |   30 ++++++++++++++++++++
 4 files changed, 72 insertions(+), 86 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 2d5d575..e02e417 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -662,32 +662,20 @@ static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
 	return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
 }
 
-#define define_one_ro(_name) \
-static struct freq_attr _name = \
-__ATTR(_name, 0444, show_##_name, NULL)
-
-#define define_one_ro0400(_name) \
-static struct freq_attr _name = \
-__ATTR(_name, 0400, show_##_name, NULL)
-
-#define define_one_rw(_name) \
-static struct freq_attr _name = \
-__ATTR(_name, 0644, show_##_name, store_##_name)
-
-define_one_ro0400(cpuinfo_cur_freq);
-define_one_ro(cpuinfo_min_freq);
-define_one_ro(cpuinfo_max_freq);
-define_one_ro(cpuinfo_transition_latency);
-define_one_ro(scaling_available_governors);
-define_one_ro(scaling_driver);
-define_one_ro(scaling_cur_freq);
-define_one_ro(bios_limit);
-define_one_ro(related_cpus);
-define_one_ro(affected_cpus);
-define_one_rw(scaling_min_freq);
-define_one_rw(scaling_max_freq);
-define_one_rw(scaling_governor);
-define_one_rw(scaling_setspeed);
+cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
+cpufreq_freq_attr_ro(cpuinfo_min_freq);
+cpufreq_freq_attr_ro(cpuinfo_max_freq);
+cpufreq_freq_attr_ro(cpuinfo_transition_latency);
+cpufreq_freq_attr_ro(scaling_available_governors);
+cpufreq_freq_attr_ro(scaling_driver);
+cpufreq_freq_attr_ro(scaling_cur_freq);
+cpufreq_freq_attr_ro(bios_limit);
+cpufreq_freq_attr_ro(related_cpus);
+cpufreq_freq_attr_ro(affected_cpus);
+cpufreq_freq_attr_rw(scaling_min_freq);
+cpufreq_freq_attr_rw(scaling_max_freq);
+cpufreq_freq_attr_rw(scaling_governor);
+cpufreq_freq_attr_rw(scaling_setspeed);
 
 static struct attribute *default_attrs[] = {
 	&cpuinfo_min_freq.attr,
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index 599a40b..ce5248e 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -178,12 +178,8 @@ static ssize_t show_sampling_rate_min(struct kobject *kobj,
 	return sprintf(buf, "%u\n", min_sampling_rate);
 }
 
-#define define_one_ro(_name)		\
-static struct global_attr _name =	\
-__ATTR(_name, 0444, show_##_name, NULL)
-
-define_one_ro(sampling_rate_max);
-define_one_ro(sampling_rate_min);
+define_one_global_ro(sampling_rate_max);
+define_one_global_ro(sampling_rate_min);
 
 /* cpufreq_conservative Governor Tunables */
 #define show_one(file_name, object)					\
@@ -221,12 +217,8 @@ show_one_old(freq_step);
 show_one_old(sampling_rate_min);
 show_one_old(sampling_rate_max);
 
-#define define_one_ro_old(object, _name)	\
-static struct freq_attr object =		\
-__ATTR(_name, 0444, show_##_name##_old, NULL)
-
-define_one_ro_old(sampling_rate_min_old, sampling_rate_min);
-define_one_ro_old(sampling_rate_max_old, sampling_rate_max);
+cpufreq_freq_attr_ro_old(sampling_rate_min);
+cpufreq_freq_attr_ro_old(sampling_rate_max);
 
 /*** delete after deprecation time ***/
 
@@ -364,16 +356,12 @@ static ssize_t store_freq_step(struct kobject *a, struct attribute *b,
 	return count;
 }
 
-#define define_one_rw(_name) \
-static struct global_attr _name = \
-__ATTR(_name, 0644, show_##_name, store_##_name)
-
-define_one_rw(sampling_rate);
-define_one_rw(sampling_down_factor);
-define_one_rw(up_threshold);
-define_one_rw(down_threshold);
-define_one_rw(ignore_nice_load);
-define_one_rw(freq_step);
+define_one_global_rw(sampling_rate);
+define_one_global_rw(sampling_down_factor);
+define_one_global_rw(up_threshold);
+define_one_global_rw(down_threshold);
+define_one_global_rw(ignore_nice_load);
+define_one_global_rw(freq_step);
 
 static struct attribute *dbs_attributes[] = {
 	&sampling_rate_max.attr,
@@ -409,16 +397,12 @@ write_one_old(down_threshold);
 write_one_old(ignore_nice_load);
 write_one_old(freq_step);
 
-#define define_one_rw_old(object, _name)	\
-static struct freq_attr object =		\
-__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old)
-
-define_one_rw_old(sampling_rate_old, sampling_rate);
-define_one_rw_old(sampling_down_factor_old, sampling_down_factor);
-define_one_rw_old(up_threshold_old, up_threshold);
-define_one_rw_old(down_threshold_old, down_threshold);
-define_one_rw_old(ignore_nice_load_old, ignore_nice_load);
-define_one_rw_old(freq_step_old, freq_step);
+cpufreq_freq_attr_rw_old(sampling_rate);
+cpufreq_freq_attr_rw_old(sampling_down_factor);
+cpufreq_freq_attr_rw_old(up_threshold);
+cpufreq_freq_attr_rw_old(down_threshold);
+cpufreq_freq_attr_rw_old(ignore_nice_load);
+cpufreq_freq_attr_rw_old(freq_step);
 
 static struct attribute *dbs_attributes_old[] = {
 	&sampling_rate_max_old.attr,
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index bd444dc..c00b25f 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -234,12 +234,8 @@ static ssize_t show_sampling_rate_min(struct kobject *kobj,
 	return sprintf(buf, "%u\n", min_sampling_rate);
 }
 
-#define define_one_ro(_name)		\
-static struct global_attr _name =	\
-__ATTR(_name, 0444, show_##_name, NULL)
-
-define_one_ro(sampling_rate_max);
-define_one_ro(sampling_rate_min);
+define_one_global_ro(sampling_rate_max);
+define_one_global_ro(sampling_rate_min);
 
 /* cpufreq_ondemand Governor Tunables */
 #define show_one(file_name, object)					\
@@ -274,12 +270,8 @@ show_one_old(powersave_bias);
 show_one_old(sampling_rate_min);
 show_one_old(sampling_rate_max);
 
-#define define_one_ro_old(object, _name)       \
-static struct freq_attr object =               \
-__ATTR(_name, 0444, show_##_name##_old, NULL)
-
-define_one_ro_old(sampling_rate_min_old, sampling_rate_min);
-define_one_ro_old(sampling_rate_max_old, sampling_rate_max);
+cpufreq_freq_attr_ro_old(sampling_rate_min);
+cpufreq_freq_attr_ro_old(sampling_rate_max);
 
 /*** delete after deprecation time ***/
 
@@ -376,14 +368,10 @@ static ssize_t store_powersave_bias(struct kobject *a, struct attribute *b,
 	return count;
 }
 
-#define define_one_rw(_name) \
-static struct global_attr _name = \
-__ATTR(_name, 0644, show_##_name, store_##_name)
-
-define_one_rw(sampling_rate);
-define_one_rw(up_threshold);
-define_one_rw(ignore_nice_load);
-define_one_rw(powersave_bias);
+define_one_global_rw(sampling_rate);
+define_one_global_rw(up_threshold);
+define_one_global_rw(ignore_nice_load);
+define_one_global_rw(powersave_bias);
 
 static struct attribute *dbs_attributes[] = {
 	&sampling_rate_max.attr,
@@ -415,14 +403,10 @@ write_one_old(up_threshold);
 write_one_old(ignore_nice_load);
 write_one_old(powersave_bias);
 
-#define define_one_rw_old(object, _name)       \
-static struct freq_attr object =               \
-__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old)
-
-define_one_rw_old(sampling_rate_old, sampling_rate);
-define_one_rw_old(up_threshold_old, up_threshold);
-define_one_rw_old(ignore_nice_load_old, ignore_nice_load);
-define_one_rw_old(powersave_bias_old, powersave_bias);
+cpufreq_freq_attr_rw_old(sampling_rate);
+cpufreq_freq_attr_rw_old(up_threshold);
+cpufreq_freq_attr_rw_old(ignore_nice_load);
+cpufreq_freq_attr_rw_old(powersave_bias);
 
 static struct attribute *dbs_attributes_old[] = {
        &sampling_rate_max_old.attr,
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 4de02b1..9f15150 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -278,6 +278,27 @@ struct freq_attr {
 	ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
 };
 
+#define cpufreq_freq_attr_ro(_name)		\
+static struct freq_attr _name =			\
+__ATTR(_name, 0444, show_##_name, NULL)
+
+#define cpufreq_freq_attr_ro_perm(_name, _perm)	\
+static struct freq_attr _name =			\
+__ATTR(_name, _perm, show_##_name, NULL)
+
+#define cpufreq_freq_attr_ro_old(_name)		\
+static struct freq_attr _name##_old =		\
+__ATTR(_name, 0444, show_##_name##_old, NULL)
+
+#define cpufreq_freq_attr_rw(_name)		\
+static struct freq_attr _name =			\
+__ATTR(_name, 0644, show_##_name, store_##_name)
+
+#define cpufreq_freq_attr_rw_old(_name)		\
+static struct freq_attr _name##_old =		\
+__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old)
+
+
 struct global_attr {
 	struct attribute attr;
 	ssize_t (*show)(struct kobject *kobj,
@@ -286,6 +307,15 @@ struct global_attr {
 			 const char *c, size_t count);
 };
 
+#define define_one_global_ro(_name)		\
+static struct global_attr _name =		\
+__ATTR(_name, 0444, show_##_name, NULL)
+
+#define define_one_global_rw(_name)		\
+static struct global_attr _name =		\
+__ATTR(_name, 0644, show_##_name, store_##_name)
+
+
 /*********************************************************************
  *                        CPUFREQ 2.6. INTERFACE                     *
  *********************************************************************/
-- 
1.7.0


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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-26 13:39 ` [-v2 PATCH 2/6] powernow-k8: Add core performance boost support Borislav Petkov
@ 2010-03-30 22:42   ` Andrew Morton
  2010-03-31  6:13     ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Andrew Morton @ 2010-03-30 22:42 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: davej, trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

On Fri, 26 Mar 2010 14:39:56 +0100
Borislav Petkov <bp@amd64.org> wrote:

> From: Borislav Petkov <borislav.petkov@amd.com>
> 
> Starting with F10h, revE, AMD processors add support for a dynamic
> core boosting feature called Core Performance Boost. When a specific
> condition is present, a subset of the cores on a system are boosted
> beyond their P0 operating frequency to speed up the performance of
> single-threaded applications.
> 
> In the normal case, the system comes out of reset with core boosting
> enabled. This patch adds a sysfs knob with which core boosting can be
> switched on or off for benchmarking purposes.
> 
> While at it, cleanup the driver init codepath and update copyrights.
> 
> ...
>
> +static void _cpb_toggle_msrs(bool t)
> +{
> +	int cpu;
> +
> +	rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> +
> +	for_each_cpu(cpu, cpu_online_mask) {
> +		struct msr *reg = per_cpu_ptr(msrs, cpu);
> +		if (t)
> +			reg->l &= ~BIT(25);
> +		else
> +			reg->l |= BIT(25);
> +	}
> +	wrmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> +}

What prevents cpu_online_mask from changing while this is happening?

> @@ -1422,15 +1490,34 @@ static int __cpuinit powernowk8_init(void)
>  			supported_cpus++;
>  	}
>  
> -	if (supported_cpus == num_online_cpus()) {
> -		printk(KERN_INFO PFX "Found %d %s "
> -			"processors (%d cpu cores) (" VERSION ")\n",
> -			num_online_nodes(),
> -			boot_cpu_data.x86_model_id, supported_cpus);
> -		return cpufreq_register_driver(&cpufreq_amd64_driver);
> +	if (supported_cpus != num_online_cpus())
> +		return -ENODEV;
> +
> +	printk(KERN_INFO PFX "Found %d %s (%d cpu cores) (" VERSION ")\n",
> +		num_online_nodes(), boot_cpu_data.x86_model_id, supported_cpus);
> +
> +	if (boot_cpu_has(X86_FEATURE_CPB)) {
> +
> +		cpb_capable = true;
> +
> +		msrs = msrs_alloc();
> +		if (!msrs) {
> +			printk(KERN_ERR "%s: Error allocating msrs!\n", __func__);
> +			return -ENOMEM;
> +		}
> +
> +		rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> +
> +		for_each_cpu(cpu, cpu_online_mask) {
> +			struct msr *reg = per_cpu_ptr(msrs, cpu);
> +			cpb_enabled |= !(!!(reg->l & BIT(25)));
> +		}

Ditto.

I assume these changes get applied to new CPUs as they come online?

> ...

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  6:13     ` Borislav Petkov
@ 2010-03-31  3:22       ` Andrew Morton
  2010-03-31  6:35         ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Andrew Morton @ 2010-03-31  3:22 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: davej, trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

On Wed, 31 Mar 2010 08:13:43 +0200 Borislav Petkov <bp@amd64.org> wrote:

> > > +static void _cpb_toggle_msrs(bool t)
> > > +{
> > > +	int cpu;
> > > +
> > > +	rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > > +
> > > +	for_each_cpu(cpu, cpu_online_mask) {
> > > +		struct msr *reg = per_cpu_ptr(msrs, cpu);
> > > +		if (t)
> > > +			reg->l &= ~BIT(25);
> > > +		else
> > > +			reg->l |= BIT(25);
> > > +	}
> > > +	wrmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > > +}
> > 
> > What prevents cpu_online_mask from changing while this is happening?
> 
> Frankly, nothing.

Sneak a get_online_cpus()/put_online_cpus() in there?

> And yes, we talked a lot about this internally, since,
> you need this bit cleared on _all_ cores for the processor to boost.
> Now, if you've offlined some of the cores, you won't be able to execute
> any code on them and thus clear this bit.
> 
> However, this interface is there only for benchmarking purposes and
> stuff, i.e. normally, you shouldn't need to touch it _at_ _all_ and
> boosting will work out of the box and without user interaction.
> 
> So, IMHO, hotplug notifiers won't work since you need all cores online
> at that particular moment to enable boosting. It sounds more reasonable
> to me to WARN when a core is missing from the mask that boosting cannot
> be enabled. I'll cook up something later today.

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  6:35         ` Borislav Petkov
@ 2010-03-31  3:38           ` Andrew Morton
  2010-03-31  6:42             ` H. Peter Anvin
  0 siblings, 1 reply; 18+ messages in thread
From: Andrew Morton @ 2010-03-31  3:38 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: davej, trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

On Wed, 31 Mar 2010 08:35:47 +0200 Borislav Petkov <bp@amd64.org> wrote:

> Do you want a relative diff ontop of this patch or
> should I redo the original one?

I don't mind really.  I'll turn it into a delta locally so I can see
what changed.

I've unilaterally decided that all six patches should be merged via the
x86 tree, btw.  They could be split between x86 and cpufreq, but I
suspect there are interdependencies which would make that hard.



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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-30 22:42   ` Andrew Morton
@ 2010-03-31  6:13     ` Borislav Petkov
  2010-03-31  3:22       ` Andrew Morton
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2010-03-31  6:13 UTC (permalink / raw)
  To: Andrew Morton
  Cc: davej, trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Andrew Morton <akpm@linux-foundation.org>
Date: Tue, Mar 30, 2010 at 03:42:29PM -0700

Hi Andrew,

> On Fri, 26 Mar 2010 14:39:56 +0100
> Borislav Petkov <bp@amd64.org> wrote:
> 
> > From: Borislav Petkov <borislav.petkov@amd.com>
> > 
> > Starting with F10h, revE, AMD processors add support for a dynamic
> > core boosting feature called Core Performance Boost. When a specific
> > condition is present, a subset of the cores on a system are boosted
> > beyond their P0 operating frequency to speed up the performance of
> > single-threaded applications.
> > 
> > In the normal case, the system comes out of reset with core boosting
> > enabled. This patch adds a sysfs knob with which core boosting can be
> > switched on or off for benchmarking purposes.
> > 
> > While at it, cleanup the driver init codepath and update copyrights.
> > 
> > ...
> >
> > +static void _cpb_toggle_msrs(bool t)
> > +{
> > +	int cpu;
> > +
> > +	rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > +
> > +	for_each_cpu(cpu, cpu_online_mask) {
> > +		struct msr *reg = per_cpu_ptr(msrs, cpu);
> > +		if (t)
> > +			reg->l &= ~BIT(25);
> > +		else
> > +			reg->l |= BIT(25);
> > +	}
> > +	wrmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > +}
> 
> What prevents cpu_online_mask from changing while this is happening?

Frankly, nothing. And yes, we talked a lot about this internally, since,
you need this bit cleared on _all_ cores for the processor to boost.
Now, if you've offlined some of the cores, you won't be able to execute
any code on them and thus clear this bit.

However, this interface is there only for benchmarking purposes and
stuff, i.e. normally, you shouldn't need to touch it _at_ _all_ and
boosting will work out of the box and without user interaction.

So, IMHO, hotplug notifiers won't work since you need all cores online
at that particular moment to enable boosting. It sounds more reasonable
to me to WARN when a core is missing from the mask that boosting cannot
be enabled. I'll cook up something later today.

Thanks.

-- 
Regards/Gruss,
Boris.

--
Advanced Micro Devices, Inc.
Operating Systems Research Center

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  3:22       ` Andrew Morton
@ 2010-03-31  6:35         ` Borislav Petkov
  2010-03-31  3:38           ` Andrew Morton
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2010-03-31  6:35 UTC (permalink / raw)
  To: Andrew Morton
  Cc: davej, trenn, linux, mingo, hpa, tglx, cpufreq, x86, linux-kernel

From: Andrew Morton <akpm@linux-foundation.org>
Date: Tue, Mar 30, 2010 at 11:22:21PM -0400

> On Wed, 31 Mar 2010 08:13:43 +0200 Borislav Petkov <bp@amd64.org> wrote:
> 
> > > > +static void _cpb_toggle_msrs(bool t)
> > > > +{
> > > > +	int cpu;
> > > > +
> > > > +	rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > > > +
> > > > +	for_each_cpu(cpu, cpu_online_mask) {
> > > > +		struct msr *reg = per_cpu_ptr(msrs, cpu);
> > > > +		if (t)
> > > > +			reg->l &= ~BIT(25);
> > > > +		else
> > > > +			reg->l |= BIT(25);
> > > > +	}
> > > > +	wrmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs);
> > > > +}
> > > 
> > > What prevents cpu_online_mask from changing while this is happening?
> > 
> > Frankly, nothing.
> 
> Sneak a get_online_cpus()/put_online_cpus() in there?

Yep, that'll make it safe wrt to accessing the mask. I'll also have to
check whether there are some cores missing before toggling the bit and
warn accordingly. Do you want a relative diff ontop of this patch or
should I redo the original one?

Thanks.

-- 
Regards/Gruss,
Boris.

--
Advanced Micro Devices, Inc.
Operating Systems Research Center

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  3:38           ` Andrew Morton
@ 2010-03-31  6:42             ` H. Peter Anvin
  2010-03-31 15:08               ` Borislav Petkov
  2010-04-08  9:48               ` Borislav Petkov
  0 siblings, 2 replies; 18+ messages in thread
From: H. Peter Anvin @ 2010-03-31  6:42 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Borislav Petkov, davej, trenn, linux, mingo, tglx, cpufreq, x86,
	linux-kernel

On 03/30/2010 08:38 PM, Andrew Morton wrote:
> 
> I've unilaterally decided that all six patches should be merged via the
> x86 tree, btw.  They could be split between x86 and cpufreq, but I
> suspect there are interdependencies which would make that hard.
> 

I would agree with that.  I'll try to get them in tomorrow.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  6:42             ` H. Peter Anvin
@ 2010-03-31 15:08               ` Borislav Petkov
  2010-03-31 15:16                 ` Dave Jones
  2010-04-09 20:57                 ` H. Peter Anvin
  2010-04-08  9:48               ` Borislav Petkov
  1 sibling, 2 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-03-31 15:08 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Andrew Morton, davej, trenn, linux, mingo, tglx, cpufreq, x86,
	linux-kernel

From: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue, Mar 30, 2010 at 11:42:41PM -0700

> On 03/30/2010 08:38 PM, Andrew Morton wrote:
> > 
> > I've unilaterally decided that all six patches should be merged via the
> > x86 tree, btw.  They could be split between x86 and cpufreq, but I
> > suspect there are interdependencies which would make that hard.
> > 
> 
> I would agree with that.  I'll try to get them in tomorrow.

Cool. I'll have updated versions of the patches soon - just don't take
those yet.

Thanks.

-- 
Regards/Gruss,
Boris.

--
Advanced Micro Devices, Inc.
Operating Systems Research Center

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31 15:08               ` Borislav Petkov
@ 2010-03-31 15:16                 ` Dave Jones
  2010-04-09 20:57                 ` H. Peter Anvin
  1 sibling, 0 replies; 18+ messages in thread
From: Dave Jones @ 2010-03-31 15:16 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: H. Peter Anvin, Andrew Morton, trenn, linux, mingo, tglx,
	cpufreq, x86, linux-kernel

On Wed, Mar 31, 2010 at 05:08:54PM +0200, Borislav Petkov wrote:
 > From: "H. Peter Anvin" <hpa@zytor.com>
 > Date: Tue, Mar 30, 2010 at 11:42:41PM -0700
 > 
 > > On 03/30/2010 08:38 PM, Andrew Morton wrote:
 > > > 
 > > > I've unilaterally decided that all six patches should be merged via the
 > > > x86 tree, btw.  They could be split between x86 and cpufreq, but I
 > > > suspect there are interdependencies which would make that hard.
 > > > 
 > > 
 > > I would agree with that.  I'll try to get them in tomorrow.
 > 
 > Cool. I'll have updated versions of the patches soon - just don't take
 > those yet.

fine, I'll drop these from the cpufreq git tree later.

	Dave


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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31  6:42             ` H. Peter Anvin
  2010-03-31 15:08               ` Borislav Petkov
@ 2010-04-08  9:48               ` Borislav Petkov
  1 sibling, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2010-04-08  9:48 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Andrew Morton, Borislav Petkov, davej, trenn, linux, mingo, tglx,
	cpufreq, x86, linux-kernel

From: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue, Mar 30, 2010 at 11:42:41PM -0700

> On 03/30/2010 08:38 PM, Andrew Morton wrote:
> > 
> > I've unilaterally decided that all six patches should be merged via the
> > x86 tree, btw.  They could be split between x86 and cpufreq, but I
> > suspect there are interdependencies which would make that hard.
> > 
> 
> I would agree with that.  I'll try to get them in tomorrow.

Ping.

Any progress here? Let me know if you want me to resend the latest
version.

Thanks.

-- 
Regards/Gruss,
Boris.

--
Advanced Micro Devices, Inc.
Operating Systems Research Center

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-03-31 15:08               ` Borislav Petkov
  2010-03-31 15:16                 ` Dave Jones
@ 2010-04-09 20:57                 ` H. Peter Anvin
  2010-04-09 20:59                   ` H. Peter Anvin
  1 sibling, 1 reply; 18+ messages in thread
From: H. Peter Anvin @ 2010-04-09 20:57 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Andrew Morton, davej, trenn, linux, mingo, tglx, cpufreq, x86,
	linux-kernel

On 03/31/2010 08:08 AM, Borislav Petkov wrote:
> From: "H. Peter Anvin" <hpa@zytor.com>
> Date: Tue, Mar 30, 2010 at 11:42:41PM -0700
> 
>> On 03/30/2010 08:38 PM, Andrew Morton wrote:
>>>
>>> I've unilaterally decided that all six patches should be merged via the
>>> x86 tree, btw.  They could be split between x86 and cpufreq, but I
>>> suspect there are interdependencies which would make that hard.
>>>
>>
>> I would agree with that.  I'll try to get them in tomorrow.
> 
> Cool. I'll have updated versions of the patches soon - just don't take
> those yet.
> 
  [...]

> Ping.
> 
> Any progress here? Let me know if you want me to resend the latest
> version.

As far as I can tell I'm still waiting for those updated patches...

	-hpa

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

* Re: [-v2 PATCH 2/6] powernow-k8: Add core performance boost support
  2010-04-09 20:57                 ` H. Peter Anvin
@ 2010-04-09 20:59                   ` H. Peter Anvin
  0 siblings, 0 replies; 18+ messages in thread
From: H. Peter Anvin @ 2010-04-09 20:59 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Andrew Morton, davej, trenn, linux, mingo, tglx, cpufreq, x86,
	linux-kernel

On 04/09/2010 01:57 PM, H. Peter Anvin wrote:
> 
>> Ping.
>>
>> Any progress here? Let me know if you want me to resend the latest
>> version.
> 
> As far as I can tell I'm still waiting for those updated patches...
> 

Nevermind... MUA out of order error.

	-hpa


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

end of thread, other threads:[~2010-04-09 21:00 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-26 13:39 [-v2 PATCH 0/6] powernow-k8: Core Performance Boost and effective frequency support Borislav Petkov
2010-03-26 13:39 ` [-v2 PATCH 1/6] x86, cpu: Add AMD core boosting feature flag to /proc/cpuinfo Borislav Petkov
2010-03-26 13:39 ` [-v2 PATCH 2/6] powernow-k8: Add core performance boost support Borislav Petkov
2010-03-30 22:42   ` Andrew Morton
2010-03-31  6:13     ` Borislav Petkov
2010-03-31  3:22       ` Andrew Morton
2010-03-31  6:35         ` Borislav Petkov
2010-03-31  3:38           ` Andrew Morton
2010-03-31  6:42             ` H. Peter Anvin
2010-03-31 15:08               ` Borislav Petkov
2010-03-31 15:16                 ` Dave Jones
2010-04-09 20:57                 ` H. Peter Anvin
2010-04-09 20:59                   ` H. Peter Anvin
2010-04-08  9:48               ` Borislav Petkov
2010-03-26 13:39 ` [-v2 PATCH 3/6] x86: Unify APERF/MPERF support Borislav Petkov
2010-03-26 13:39 ` [-v2 PATCH 4/6] cpufreq: Add APERF/MPERF support for AMD processors Borislav Petkov
2010-03-26 13:39 ` [-v2 PATCH 5/6] powernow-k8: Fix frequency reporting Borislav Petkov
2010-03-26 13:40 ` [-v2 PATCH 6/6] cpufreq: Unify sysfs attribute definition macros Borislav Petkov

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