static 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;
        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);
        ret = 0;
 
 err_out:
-       set_cpus_allowed_ptr(current, &oldmask);
+       set_cpus_allowed_ptr(current, oldmask);
+       free_cpumask_var(oldmask);
        return ret;
 }