diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-31 18:42:28 -0500 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-31 18:42:28 -0500 |
| commit | 41c7bb9588904eb060a95bcad47bd3804a1ece25 (patch) | |
| tree | ccae4bd3cb26be171fad9e26147ef8839405f298 | |
| parent | e0b582ec56f1a1d8b30ebf340a7b91fb09f26c8c (diff) | |
cpumask: convert rest of files in kernel/
Impact: Reduce stack usage, use new cpumask API.
Mainly changing cpumask_t to 'struct cpumask' and similar simple API
conversion. Two conversions worth mentioning:
1) we use cpumask_any_but to avoid a temporary in kernel/softlockup.c,
2) Use cpumask_var_t in taskstats_user_cmd().
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Mike Travis <travis@sgi.com>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
| -rw-r--r-- | include/linux/stop_machine.h | 6 | ||||
| -rw-r--r-- | kernel/power/poweroff.c | 2 | ||||
| -rw-r--r-- | kernel/softlockup.c | 6 | ||||
| -rw-r--r-- | kernel/stop_machine.c | 8 | ||||
| -rw-r--r-- | kernel/taskstats.c | 39 |
5 files changed, 34 insertions, 27 deletions
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index faf1519b5adc..74d59a641362 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | * | 23 | * |
| 24 | * This can be thought of as a very heavy write lock, equivalent to | 24 | * This can be thought of as a very heavy write lock, equivalent to |
| 25 | * grabbing every spinlock in the kernel. */ | 25 | * grabbing every spinlock in the kernel. */ |
| 26 | int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | 26 | int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * __stop_machine: freeze the machine on all CPUs and run this function | 29 | * __stop_machine: freeze the machine on all CPUs and run this function |
| @@ -34,11 +34,11 @@ int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | |||
| 34 | * Description: This is a special version of the above, which assumes cpus | 34 | * Description: This is a special version of the above, which assumes cpus |
| 35 | * won't come or go while it's being called. Used by hotplug cpu. | 35 | * won't come or go while it's being called. Used by hotplug cpu. |
| 36 | */ | 36 | */ |
| 37 | int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | 37 | int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); |
| 38 | #else | 38 | #else |
| 39 | 39 | ||
| 40 | static inline int stop_machine(int (*fn)(void *), void *data, | 40 | static inline int stop_machine(int (*fn)(void *), void *data, |
| 41 | const cpumask_t *cpus) | 41 | const struct cpumask *cpus) |
| 42 | { | 42 | { |
| 43 | int ret; | 43 | int ret; |
| 44 | local_irq_disable(); | 44 | local_irq_disable(); |
diff --git a/kernel/power/poweroff.c b/kernel/power/poweroff.c index 72016f051477..97890831e1b5 100644 --- a/kernel/power/poweroff.c +++ b/kernel/power/poweroff.c | |||
| @@ -27,7 +27,7 @@ static DECLARE_WORK(poweroff_work, do_poweroff); | |||
| 27 | static void handle_poweroff(int key, struct tty_struct *tty) | 27 | static void handle_poweroff(int key, struct tty_struct *tty) |
| 28 | { | 28 | { |
| 29 | /* run sysrq poweroff on boot cpu */ | 29 | /* run sysrq poweroff on boot cpu */ |
| 30 | schedule_work_on(first_cpu(cpu_online_map), &poweroff_work); | 30 | schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static struct sysrq_key_op sysrq_poweroff_op = { | 33 | static struct sysrq_key_op sysrq_poweroff_op = { |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 492f0c72fec5..d9188c66278a 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
| @@ -310,10 +310,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
| 310 | case CPU_DOWN_PREPARE: | 310 | case CPU_DOWN_PREPARE: |
| 311 | case CPU_DOWN_PREPARE_FROZEN: | 311 | case CPU_DOWN_PREPARE_FROZEN: |
| 312 | if (hotcpu == check_cpu) { | 312 | if (hotcpu == check_cpu) { |
| 313 | cpumask_t temp_cpu_online_map = cpu_online_map; | 313 | /* Pick any other online cpu. */ |
| 314 | 314 | check_cpu = cpumask_any_but(cpu_online_mask, hotcpu); | |
| 315 | cpu_clear(hotcpu, temp_cpu_online_map); | ||
| 316 | check_cpu = cpumask_any(&temp_cpu_online_map); | ||
| 317 | } | 315 | } |
| 318 | break; | 316 | break; |
| 319 | 317 | ||
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index 24e8ceacc388..286c41722e8c 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
| @@ -69,10 +69,10 @@ static void stop_cpu(struct work_struct *unused) | |||
| 69 | int err; | 69 | int err; |
| 70 | 70 | ||
| 71 | if (!active_cpus) { | 71 | if (!active_cpus) { |
| 72 | if (cpu == first_cpu(cpu_online_map)) | 72 | if (cpu == cpumask_first(cpu_online_mask)) |
| 73 | smdata = &active; | 73 | smdata = &active; |
| 74 | } else { | 74 | } else { |
| 75 | if (cpu_isset(cpu, *active_cpus)) | 75 | if (cpumask_test_cpu(cpu, active_cpus)) |
| 76 | smdata = &active; | 76 | smdata = &active; |
| 77 | } | 77 | } |
| 78 | /* Simple state machine */ | 78 | /* Simple state machine */ |
| @@ -109,7 +109,7 @@ static int chill(void *unused) | |||
| 109 | return 0; | 109 | return 0; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | 112 | int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus) |
| 113 | { | 113 | { |
| 114 | struct work_struct *sm_work; | 114 | struct work_struct *sm_work; |
| 115 | int i, ret; | 115 | int i, ret; |
| @@ -142,7 +142,7 @@ int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | |||
| 142 | return ret; | 142 | return ret; |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | 145 | int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus) |
| 146 | { | 146 | { |
| 147 | int ret; | 147 | int ret; |
| 148 | 148 | ||
diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 6d7dc4ec4aa5..888adbcca30c 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c | |||
| @@ -290,18 +290,17 @@ ret: | |||
| 290 | return; | 290 | return; |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd) | 293 | static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd) |
| 294 | { | 294 | { |
| 295 | struct listener_list *listeners; | 295 | struct listener_list *listeners; |
| 296 | struct listener *s, *tmp; | 296 | struct listener *s, *tmp; |
| 297 | unsigned int cpu; | 297 | unsigned int cpu; |
| 298 | cpumask_t mask = *maskp; | ||
| 299 | 298 | ||
| 300 | if (!cpus_subset(mask, cpu_possible_map)) | 299 | if (!cpumask_subset(mask, cpu_possible_mask)) |
| 301 | return -EINVAL; | 300 | return -EINVAL; |
| 302 | 301 | ||
| 303 | if (isadd == REGISTER) { | 302 | if (isadd == REGISTER) { |
| 304 | for_each_cpu_mask_nr(cpu, mask) { | 303 | for_each_cpu(cpu, mask) { |
| 305 | s = kmalloc_node(sizeof(struct listener), GFP_KERNEL, | 304 | s = kmalloc_node(sizeof(struct listener), GFP_KERNEL, |
| 306 | cpu_to_node(cpu)); | 305 | cpu_to_node(cpu)); |
| 307 | if (!s) | 306 | if (!s) |
| @@ -320,7 +319,7 @@ static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd) | |||
| 320 | 319 | ||
| 321 | /* Deregister or cleanup */ | 320 | /* Deregister or cleanup */ |
| 322 | cleanup: | 321 | cleanup: |
| 323 | for_each_cpu_mask_nr(cpu, mask) { | 322 | for_each_cpu(cpu, mask) { |
| 324 | listeners = &per_cpu(listener_array, cpu); | 323 | listeners = &per_cpu(listener_array, cpu); |
| 325 | down_write(&listeners->sem); | 324 | down_write(&listeners->sem); |
| 326 | list_for_each_entry_safe(s, tmp, &listeners->list, list) { | 325 | list_for_each_entry_safe(s, tmp, &listeners->list, list) { |
| @@ -335,7 +334,7 @@ cleanup: | |||
| 335 | return 0; | 334 | return 0; |
| 336 | } | 335 | } |
| 337 | 336 | ||
| 338 | static int parse(struct nlattr *na, cpumask_t *mask) | 337 | static int parse(struct nlattr *na, struct cpumask *mask) |
| 339 | { | 338 | { |
| 340 | char *data; | 339 | char *data; |
| 341 | int len; | 340 | int len; |
| @@ -428,23 +427,33 @@ err: | |||
| 428 | 427 | ||
| 429 | static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) | 428 | static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) |
| 430 | { | 429 | { |
| 431 | int rc = 0; | 430 | int rc; |
| 432 | struct sk_buff *rep_skb; | 431 | struct sk_buff *rep_skb; |
| 433 | struct taskstats *stats; | 432 | struct taskstats *stats; |
| 434 | size_t size; | 433 | size_t size; |
| 435 | cpumask_t mask; | 434 | cpumask_var_t mask; |
| 435 | |||
| 436 | if (!alloc_cpumask_var(&mask, GFP_KERNEL)) | ||
| 437 | return -ENOMEM; | ||
| 436 | 438 | ||
| 437 | rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], &mask); | 439 | rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], mask); |
| 438 | if (rc < 0) | 440 | if (rc < 0) |
| 439 | return rc; | 441 | goto free_return_rc; |
| 440 | if (rc == 0) | 442 | if (rc == 0) { |
| 441 | return add_del_listener(info->snd_pid, &mask, REGISTER); | 443 | rc = add_del_listener(info->snd_pid, mask, REGISTER); |
| 444 | goto free_return_rc; | ||
| 445 | } | ||
| 442 | 446 | ||
| 443 | rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], &mask); | 447 | rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], mask); |
| 444 | if (rc < 0) | 448 | if (rc < 0) |
| 449 | goto free_return_rc; | ||
| 450 | if (rc == 0) { | ||
| 451 | rc = add_del_listener(info->snd_pid, mask, DEREGISTER); | ||
| 452 | free_return_rc: | ||
| 453 | free_cpumask_var(mask); | ||
| 445 | return rc; | 454 | return rc; |
| 446 | if (rc == 0) | 455 | } |
| 447 | return add_del_listener(info->snd_pid, &mask, DEREGISTER); | 456 | free_cpumask_var(mask); |
| 448 | 457 | ||
| 449 | /* | 458 | /* |
| 450 | * Size includes space for nested attributes | 459 | * Size includes space for nested attributes |
