cpumask: use work_on_cpu in acpi-cpufreq.c for drv_read and drv_write

Impact: use new cpumask API to reduce stack usage

Replace the saving of current->cpus_allowed and set_cpus_allowed_ptr() with
a work_on_cpu function for drv_read() and drv_write().

Basically converts do_drv_{read,write} into "work_on_cpu" functions that
are now called by drv_read and drv_write.

Signed-off-by: Mike Travis <travis@sgi.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by

Mike Travis and committed by
Ingo Molnar
7503bfba 4d8bb537

+13 -12
+13 -12
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
··· 150 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 156 u32 h; 156 157 157 158 switch (cmd->type) { ··· 167 166 default: 168 167 break; 169 168 } 169 + return 0; 170 170 } 171 171 172 - static void do_drv_write(struct drv_cmd *cmd) 172 + static long do_drv_write(void *_cmd) 173 173 { 174 + struct drv_cmd *cmd = _cmd; 174 175 u32 lo, hi; 175 176 176 177 switch (cmd->type) { ··· 189 186 default: 190 187 break; 191 188 } 189 + return 0; 192 190 } 193 191 194 192 static void drv_read(struct drv_cmd *cmd) 195 193 { 196 - cpumask_t saved_mask = current->cpus_allowed; 197 194 cmd->val = 0; 198 195 199 - set_cpus_allowed_ptr(current, cmd->mask); 200 - do_drv_read(cmd); 201 - set_cpus_allowed_ptr(current, &saved_mask); 196 + work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); 202 197 } 203 198 204 199 static void drv_write(struct drv_cmd *cmd) 205 200 { 206 - cpumask_t saved_mask = current->cpus_allowed; 207 201 unsigned int i; 208 202 209 203 for_each_cpu(i, cmd->mask) { 210 - set_cpus_allowed_ptr(current, cpumask_of(i)); 211 - do_drv_write(cmd); 204 + work_on_cpu(i, do_drv_write, cmd); 212 205 } 213 - 214 - set_cpus_allowed_ptr(current, &saved_mask); 215 - return; 216 206 } 217 207 218 208 static u32 get_cur_val(const struct cpumask *mask) ··· 231 235 return 0; 232 236 } 233 237 238 + if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL))) 239 + return 0; 240 + 234 241 cpumask_copy(cmd.mask, mask); 235 242 236 243 drv_read(&cmd); 244 + 245 + free_cpumask_var(cmd.mask); 237 246 238 247 dprintk("get_cur_val = %u\n", cmd.val); 239 248