cpumask: don't put a cpumask on the stack in x86...cpufreq/powernow-k8.c
PATCH 8/14 cpumask: don't put a cpumask on the stack in x86...cpufreq/powernow-k8.c
It's still mugging the current process's cpumask, but as comment in 1ff6e97f1d says, it's not a trivial fix.
So, at least we can use a cpumask_var_t to do the Wrong Thing the Right Way :)
Signed-off-by Rusty Russell <[email protected]>
To: [email protected]
Cc: Mark Langsdorf <[email protected]>
Cc: Dave Jones <[email protected]>
--- arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
arch/x86/kernel/cpu/cpufreq/powernow-k8.c +10 -5
@@ -1118,7 +1118,7 @@ static int transition_frequency_pstate(sstatic int powernowk8_target (struct cpufreq_policy *pol,unsigned targfreq,unsigned relation) { -cpumask_t oldmask; +cpumask_var_t oldmask;struct powernow_k8_data *data =per_cpu (powernow_data, pol->cpu);u32 checkfid;u32 checkvid;
@@ -1131,9 +1131,13 @@ static int powernowk8_target(struct cpuf checkfid = data->currfid; checkvid = data->currvid; -/* only run on specific CPU from here on */ - oldmask = current->cpus_allowed; -set_cpus_allowed_ptr (current, &cpumask_of_cpu (pol->cpu)); +/* only run on specific CPU from here on. */ +/* This is poor form: use a workqueue or smp_call_function_single */ +if (!alloc_cpumask_var (&oldmask,GFP_KERNEL )) +return -ENOMEM ; + +cpumask_copy (oldmask,tsk_cpumask (current)); +set_cpus_allowed_ptr (current,cpumask_of (pol->cpu));if (smp_processor_id () != pol->cpu) { printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
@@ -1193,7 +1197,8 @@ static int powernowk8_target(struct cpuf ret =0 ; err_out: -set_cpus_allowed_ptr (current, &oldmask); +set_cpus_allowed_ptr (current, oldmask); +free_cpumask_var (oldmask);return ret; }