cpumask: use work_on_cpu in acpi-cpufreq.c for drv_read and drv_write
[firefly-linux-kernel-4.4.55.git] / arch / x86 / kernel / cpu / cpufreq / acpi-cpufreq.c
index fb594170dc53215e634d1ae16a33baa7180d7962..4e4f2b04dac2451899d241145269328935cf02ca 100644 (file)
@@ -150,8 +150,9 @@ struct drv_cmd {
        u32 val;
 };
 
-static void do_drv_read(struct drv_cmd *cmd)
+static long do_drv_read(void *_cmd)
 {
+       struct drv_cmd *cmd = _cmd;
        u32 h;
 
        switch (cmd->type) {
@@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd)
        default:
                break;
        }
+       return 0;
 }
 
-static void do_drv_write(struct drv_cmd *cmd)
+static long do_drv_write(void *_cmd)
 {
+       struct drv_cmd *cmd = _cmd;
        u32 lo, hi;
 
        switch (cmd->type) {
@@ -186,30 +189,23 @@ static void do_drv_write(struct drv_cmd *cmd)
        default:
                break;
        }
+       return 0;
 }
 
 static void drv_read(struct drv_cmd *cmd)
 {
-       cpumask_t saved_mask = current->cpus_allowed;
        cmd->val = 0;
 
-       set_cpus_allowed_ptr(current, cmd->mask);
-       do_drv_read(cmd);
-       set_cpus_allowed_ptr(current, &saved_mask);
+       work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd);
 }
 
 static void drv_write(struct drv_cmd *cmd)
 {
-       cpumask_t saved_mask = current->cpus_allowed;
        unsigned int i;
 
        for_each_cpu(i, cmd->mask) {
-               set_cpus_allowed_ptr(current, cpumask_of(i));
-               do_drv_write(cmd);
+               work_on_cpu(i, do_drv_write, cmd);
        }
-
-       set_cpus_allowed_ptr(current, &saved_mask);
-       return;
 }
 
 static u32 get_cur_val(const struct cpumask *mask)
@@ -235,10 +231,15 @@ static u32 get_cur_val(const struct cpumask *mask)
                return 0;
        }
 
+       if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL)))
+               return 0;
+
        cpumask_copy(cmd.mask, mask);
 
        drv_read(&cmd);
 
+       free_cpumask_var(cmd.mask);
+
        dprintk("get_cur_val = %u\n", cmd.val);
 
        return cmd.val;