[PATCH 2/3] powernow-k8: switch to *_on_cpu() functions

From: Alexey Dobriyan
Date: Mon Apr 02 2007 - 07:32:47 EST


Remove changes and restoring of allowed cpu masks as they aren't needed now.

Tested on 2-way Opteron.

Signed-off-by: Alexey Dobriyan <adobriyan@xxxxx>
---

arch/i386/kernel/cpu/cpufreq/powernow-k8.c | 102 ++++++++---------------------
1 file changed, 29 insertions(+), 73 deletions(-)

--- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
@@ -32,7 +32,6 @@
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/cpumask.h>
-#include <linux/sched.h> /* for current / set_cpus_allowed() */

#include <asm/msr.h>
#include <asm/io.h>
@@ -84,17 +83,17 @@ static u32 find_khz_freq_from_fiddid(u32 fid, u32 did)
return 1000 * find_freq_from_fiddid(fid, did);
}

-static u32 find_fid_from_pstate(u32 pstate)
+static u32 find_fid_from_pstate(unsigned int cpu, u32 pstate)
{
u32 hi, lo;
- rdmsr(MSR_PSTATE_DEF_BASE + pstate, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_PSTATE_DEF_BASE + pstate, &lo, &hi);
return lo & HW_PSTATE_FID_MASK;
}

-static u32 find_did_from_pstate(u32 pstate)
+static u32 find_did_from_pstate(unsigned int cpu, u32 pstate)
{
u32 hi, lo;
- rdmsr(MSR_PSTATE_DEF_BASE + pstate, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_PSTATE_DEF_BASE + pstate, &lo, &hi);
return (lo & HW_PSTATE_DID_MASK) >> HW_PSTATE_DID_SHIFT;
}

@@ -116,14 +115,14 @@ static u32 convert_fid_to_vco_fid(u32 fid)
* Return 1 if the pending bit is set. Unless we just instructed the processor
* to transition to a new state, seeing this bit set is really bad news.
*/
-static int pending_bit_stuck(void)
+static int pending_bit_stuck(unsigned int cpu)
{
u32 lo, hi;

if (cpu_family == CPU_HW_PSTATE)
return 0;

- rdmsr(MSR_FIDVID_STATUS, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_FIDVID_STATUS, &lo, &hi);
return lo & MSR_S_LO_CHANGE_PENDING ? 1 : 0;
}

@@ -133,13 +132,14 @@ static int pending_bit_stuck(void)
*/
static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
{
+ unsigned int cpu = data->cpu;
u32 lo, hi;
u32 i = 0;

if (cpu_family == CPU_HW_PSTATE) {
- rdmsr(MSR_PSTATE_STATUS, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_PSTATE_STATUS, &lo, &hi);
i = lo & HW_PSTATE_MASK;
- rdmsr(MSR_PSTATE_DEF_BASE + i, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_PSTATE_DEF_BASE + i, &lo, &hi);
data->currfid = lo & HW_PSTATE_FID_MASK;
data->currdid = (lo & HW_PSTATE_DID_MASK) >> HW_PSTATE_DID_SHIFT;
return 0;
@@ -149,7 +149,7 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
dprintk("detected change pending stuck\n");
return 1;
}
- rdmsr(MSR_FIDVID_STATUS, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_FIDVID_STATUS, &lo, &hi);
} while (lo & MSR_S_LO_CHANGE_PENDING);

data->currvid = hi & MSR_S_HI_CURRENT_VID;
@@ -173,18 +173,18 @@ static void count_off_vst(struct powernow_k8_data *data)
}

/* need to init the control msr to a safe value (for each cpu) */
-static void fidvid_msr_init(void)
+static void fidvid_msr_init(unsigned int cpu)
{
u32 lo, hi;
u8 fid, vid;

- rdmsr(MSR_FIDVID_STATUS, lo, hi);
+ rdmsr_on_cpu(cpu, MSR_FIDVID_STATUS, &lo, &hi);
vid = hi & MSR_S_HI_CURRENT_VID;
fid = lo & MSR_S_LO_CURRENT_FID;
lo = fid | (vid << MSR_C_LO_VID_SHIFT);
hi = MSR_C_HI_STP_GNT_BENIGN;
dprintk("cpu%d, init lo 0x%x, hi 0x%x\n", smp_processor_id(), lo, hi);
- wrmsr(MSR_FIDVID_CTL, lo, hi);
+ wrmsr_on_cpu(cpu, MSR_FIDVID_CTL, lo, hi);
}


@@ -206,7 +206,7 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid)
fid, lo, data->plllock * PLL_LOCK_CONVERSION);

do {
- wrmsr(MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION);
+ wrmsr_on_cpu(data->cpu, MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION);
if (i++ > 100) {
printk(KERN_ERR PFX "Hardware error - pending bit very stuck - no further pstate changes possible\n");
return 1;
@@ -248,7 +248,7 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid)
vid, lo, STOP_GRANT_5NS);

do {
- wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS);
+ wrmsr_on_cpu(data->cpu, MSR_FIDVID_CTL, lo, STOP_GRANT_5NS);
if (i++ > 100) {
printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n");
return 1;
@@ -291,8 +291,8 @@ static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid,
/* Change hardware pstate by single MSR write */
static int transition_pstate(struct powernow_k8_data *data, u32 pstate)
{
- wrmsr(MSR_PSTATE_CTRL, pstate, 0);
- data->currfid = find_fid_from_pstate(pstate);
+ wrmsr_on_cpu(data->cpu, MSR_PSTATE_CTRL, pstate, 0);
+ data->currfid = find_fid_from_pstate(data->cpu, pstate);
return 0;
}

@@ -335,7 +335,7 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
smp_processor_id(),
data->currfid, data->currvid, reqvid, data->rvo);

- rdmsr(MSR_FIDVID_STATUS, lo, maxvid);
+ rdmsr_on_cpu(data->cpu, MSR_FIDVID_STATUS, &lo, &maxvid);
maxvid = 0x1f & (maxvid >> 16);
dprintk("ph1 maxvid=0x%x\n", maxvid);
if (reqvid < maxvid) /* lower numbers are higher voltages */
@@ -499,22 +499,13 @@ static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvi

static int check_supported_cpu(unsigned int cpu)
{
- cpumask_t oldmask = CPU_MASK_ALL;
u32 eax, ebx, ecx, edx;
unsigned int rc = 0;

- oldmask = current->cpus_allowed;
- set_cpus_allowed(current, cpumask_of_cpu(cpu));
-
- if (smp_processor_id() != cpu) {
- printk(KERN_ERR PFX "limiting to cpu %u failed\n", cpu);
- goto out;
- }
-
- if (current_cpu_data.x86_vendor != X86_VENDOR_AMD)
+ if (cpu_data[cpu].x86_vendor != X86_VENDOR_AMD)
goto out;

- eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
+ eax = cpuid_eax_on_cpu(cpu, CPUID_PROCESSOR_SIGNATURE);
if (((eax & CPUID_XFAM) != CPUID_XFAM_K8) &&
((eax & CPUID_XFAM) < CPUID_XFAM_10H))
goto out;
@@ -526,20 +517,20 @@ static int check_supported_cpu(unsigned int cpu)
goto out;
}

- eax = cpuid_eax(CPUID_GET_MAX_CAPABILITIES);
+ eax = cpuid_eax_on_cpu(cpu, CPUID_GET_MAX_CAPABILITIES);
if (eax < CPUID_FREQ_VOLT_CAPABILITIES) {
printk(KERN_INFO PFX
"No frequency change capabilities detected\n");
goto out;
}

- cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
+ cpuid_on_cpu(cpu, CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) {
printk(KERN_INFO PFX "Power state transitions not supported\n");
goto out;
}
} else { /* must be a HW Pstate capable processor */
- cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
+ cpuid_on_cpu(cpu, CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
if ((edx & USE_HW_PSTATE) == USE_HW_PSTATE)
cpu_family = CPU_HW_PSTATE;
else
@@ -549,7 +540,6 @@ static int check_supported_cpu(unsigned int cpu)
rc = 1;

out:
- set_cpus_allowed(current, oldmask);
return rc;
}

@@ -849,7 +839,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index);
printk(KERN_ERR PFX "Please report to BIOS manufacturer\n");
}
- rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi);
+ rdmsr_on_cpu(data->cpu, MSR_PSTATE_DEF_BASE + index, &lo, &hi);
if (!(hi & HW_PSTATE_VALID_MASK)) {
dprintk("invalid pstate %d, ignoring\n", index);
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
@@ -1035,8 +1025,8 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned i
}

res = transition_pstate(data, pstate);
- data->currfid = find_fid_from_pstate(pstate);
- data->currdid = find_did_from_pstate(pstate);
+ data->currfid = find_fid_from_pstate(data->cpu, pstate);
+ data->currdid = find_did_from_pstate(data->cpu, pstate);
freqs.new = find_khz_freq_from_fiddid(data->currfid, data->currdid);

for_each_cpu_mask(i, *(data->available_cores)) {
@@ -1049,7 +1039,6 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned i
/* Driver entry point to switch to the target frequency */
static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsigned relation)
{
- cpumask_t oldmask = CPU_MASK_ALL;
struct powernow_k8_data *data = powernow_data[pol->cpu];
u32 checkfid;
u32 checkvid;
@@ -1062,16 +1051,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
checkfid = data->currfid;
checkvid = data->currvid;

- /* only run on specific CPU from here on */
- oldmask = current->cpus_allowed;
- set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
-
- if (smp_processor_id() != pol->cpu) {
- printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
- goto err_out;
- }
-
- if (pending_bit_stuck()) {
+ if (pending_bit_stuck(pol->cpu)) {
printk(KERN_ERR PFX "failing targ, change pending bit set\n");
goto err_out;
}
@@ -1122,7 +1102,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
ret = 0;

err_out:
- set_cpus_allowed(current, oldmask);
return ret;
}

@@ -1141,7 +1120,6 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
{
struct powernow_k8_data *data;
- cpumask_t oldmask = CPU_MASK_ALL;
int rc;

if (!cpu_online(pol->cpu))
@@ -1180,16 +1158,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
}
}

- /* only run on specific CPU from here on */
- oldmask = current->cpus_allowed;
- set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
-
- if (smp_processor_id() != pol->cpu) {
- printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
- goto err_out;
- }
-
- if (pending_bit_stuck()) {
+ if (pending_bit_stuck(pol->cpu)) {
printk(KERN_ERR PFX "failing init, change pending bit set\n");
goto err_out;
}
@@ -1198,10 +1167,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
goto err_out;

if (cpu_family == CPU_OPTERON)
- fidvid_msr_init();
-
- /* run on any CPU again */
- set_cpus_allowed(current, oldmask);
+ fidvid_msr_init(pol->cpu);

pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
if (cpu_family == CPU_HW_PSTATE)
@@ -1244,7 +1210,6 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
return 0;

err_out:
- set_cpus_allowed(current, oldmask);
powernow_k8_cpu_exit_acpi(data);

kfree(data);
@@ -1271,7 +1236,6 @@ static int __devexit powernowk8_cpu_exit (struct cpufreq_policy *pol)
static unsigned int powernowk8_get (unsigned int cpu)
{
struct powernow_k8_data *data;
- cpumask_t oldmask = current->cpus_allowed;
unsigned int khz = 0;

data = powernow_data[first_cpu(cpu_core_map[cpu])];
@@ -1279,13 +1243,6 @@ static unsigned int powernowk8_get (unsigned int cpu)
if (!data)
return -EINVAL;

- set_cpus_allowed(current, cpumask_of_cpu(cpu));
- if (smp_processor_id() != cpu) {
- printk(KERN_ERR PFX "limiting to CPU %d failed in powernowk8_get\n", cpu);
- set_cpus_allowed(current, oldmask);
- return 0;
- }
-
if (query_current_values_with_pending_wait(data))
goto out;

@@ -1296,7 +1253,6 @@ static unsigned int powernowk8_get (unsigned int cpu)


out:
- set_cpus_allowed(current, oldmask);
return khz;
}


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/