diff options
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index fb594170dc53..4e4f2b04dac2 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
| @@ -150,8 +150,9 @@ struct drv_cmd { | |||
| 150 | u32 val; | 150 | u32 val; |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | static void do_drv_read(struct drv_cmd *cmd) | 153 | static long do_drv_read(void *_cmd) |
| 154 | { | 154 | { |
| 155 | struct drv_cmd *cmd = _cmd; | ||
| 155 | u32 h; | 156 | u32 h; |
| 156 | 157 | ||
| 157 | switch (cmd->type) { | 158 | switch (cmd->type) { |
| @@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd) | |||
| 166 | default: | 167 | default: |
| 167 | break; | 168 | break; |
| 168 | } | 169 | } |
| 170 | return 0; | ||
| 169 | } | 171 | } |
| 170 | 172 | ||
| 171 | static void do_drv_write(struct drv_cmd *cmd) | 173 | static long do_drv_write(void *_cmd) |
| 172 | { | 174 | { |
| 175 | struct drv_cmd *cmd = _cmd; | ||
| 173 | u32 lo, hi; | 176 | u32 lo, hi; |
| 174 | 177 | ||
| 175 | switch (cmd->type) { | 178 | switch (cmd->type) { |
| @@ -186,30 +189,23 @@ static void do_drv_write(struct drv_cmd *cmd) | |||
| 186 | default: | 189 | default: |
| 187 | break; | 190 | break; |
| 188 | } | 191 | } |
| 192 | return 0; | ||
| 189 | } | 193 | } |
| 190 | 194 | ||
| 191 | static void drv_read(struct drv_cmd *cmd) | 195 | static void drv_read(struct drv_cmd *cmd) |
| 192 | { | 196 | { |
| 193 | cpumask_t saved_mask = current->cpus_allowed; | ||
| 194 | cmd->val = 0; | 197 | cmd->val = 0; |
| 195 | 198 | ||
| 196 | set_cpus_allowed_ptr(current, cmd->mask); | 199 | work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); |
| 197 | do_drv_read(cmd); | ||
| 198 | set_cpus_allowed_ptr(current, &saved_mask); | ||
| 199 | } | 200 | } |
| 200 | 201 | ||
| 201 | static void drv_write(struct drv_cmd *cmd) | 202 | static void drv_write(struct drv_cmd *cmd) |
| 202 | { | 203 | { |
| 203 | cpumask_t saved_mask = current->cpus_allowed; | ||
| 204 | unsigned int i; | 204 | unsigned int i; |
| 205 | 205 | ||
| 206 | for_each_cpu(i, cmd->mask) { | 206 | for_each_cpu(i, cmd->mask) { |
| 207 | set_cpus_allowed_ptr(current, cpumask_of(i)); | 207 | work_on_cpu(i, do_drv_write, cmd); |
| 208 | do_drv_write(cmd); | ||
| 209 | } | 208 | } |
| 210 | |||
| 211 | set_cpus_allowed_ptr(current, &saved_mask); | ||
| 212 | return; | ||
| 213 | } | 209 | } |
| 214 | 210 | ||
| 215 | static u32 get_cur_val(const struct cpumask *mask) | 211 | static u32 get_cur_val(const struct cpumask *mask) |
| @@ -235,10 +231,15 @@ static u32 get_cur_val(const struct cpumask *mask) | |||
| 235 | return 0; | 231 | return 0; |
| 236 | } | 232 | } |
| 237 | 233 | ||
| 234 | if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL))) | ||
| 235 | return 0; | ||
| 236 | |||
| 238 | cpumask_copy(cmd.mask, mask); | 237 | cpumask_copy(cmd.mask, mask); |
| 239 | 238 | ||
| 240 | drv_read(&cmd); | 239 | drv_read(&cmd); |
| 241 | 240 | ||
| 241 | free_cpumask_var(cmd.mask); | ||
| 242 | |||
| 242 | dprintk("get_cur_val = %u\n", cmd.val); | 243 | dprintk("get_cur_val = %u\n", cmd.val); |
| 243 | 244 | ||
| 244 | return cmd.val; | 245 | return cmd.val; |
