Commit 41c7bb95 authored by Rusty Russell's avatar Rusty Russell

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: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarMike Travis <travis@sgi.com>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
parent e0b582ec
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* *
* This can be thought of as a very heavy write lock, equivalent to * This can be thought of as a very heavy write lock, equivalent to
* grabbing every spinlock in the kernel. */ * grabbing every spinlock in the kernel. */
int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus);
/** /**
* __stop_machine: freeze the machine on all CPUs and run this function * __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,11 +34,11 @@ int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus);
* Description: This is a special version of the above, which assumes cpus * Description: This is a special version of the above, which assumes cpus
* won't come or go while it's being called. Used by hotplug cpu. * won't come or go while it's being called. Used by hotplug cpu.
*/ */
int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus);
#else #else
static inline int stop_machine(int (*fn)(void *), void *data, static inline int stop_machine(int (*fn)(void *), void *data,
const cpumask_t *cpus) const struct cpumask *cpus)
{ {
int ret; int ret;
local_irq_disable(); local_irq_disable();
......
...@@ -27,7 +27,7 @@ static DECLARE_WORK(poweroff_work, do_poweroff); ...@@ -27,7 +27,7 @@ static DECLARE_WORK(poweroff_work, do_poweroff);
static void handle_poweroff(int key, struct tty_struct *tty) static void handle_poweroff(int key, struct tty_struct *tty)
{ {
/* run sysrq poweroff on boot cpu */ /* run sysrq poweroff on boot cpu */
schedule_work_on(first_cpu(cpu_online_map), &poweroff_work); schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work);
} }
static struct sysrq_key_op sysrq_poweroff_op = { static struct sysrq_key_op sysrq_poweroff_op = {
......
...@@ -310,10 +310,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) ...@@ -310,10 +310,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE:
case CPU_DOWN_PREPARE_FROZEN: case CPU_DOWN_PREPARE_FROZEN:
if (hotcpu == check_cpu) { if (hotcpu == check_cpu) {
cpumask_t temp_cpu_online_map = cpu_online_map; /* Pick any other online cpu. */
check_cpu = cpumask_any_but(cpu_online_mask, hotcpu);
cpu_clear(hotcpu, temp_cpu_online_map);
check_cpu = cpumask_any(&temp_cpu_online_map);
} }
break; break;
......
...@@ -69,10 +69,10 @@ static void stop_cpu(struct work_struct *unused) ...@@ -69,10 +69,10 @@ static void stop_cpu(struct work_struct *unused)
int err; int err;
if (!active_cpus) { if (!active_cpus) {
if (cpu == first_cpu(cpu_online_map)) if (cpu == cpumask_first(cpu_online_mask))
smdata = &active; smdata = &active;
} else { } else {
if (cpu_isset(cpu, *active_cpus)) if (cpumask_test_cpu(cpu, active_cpus))
smdata = &active; smdata = &active;
} }
/* Simple state machine */ /* Simple state machine */
...@@ -109,7 +109,7 @@ static int chill(void *unused) ...@@ -109,7 +109,7 @@ static int chill(void *unused)
return 0; return 0;
} }
int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
{ {
struct work_struct *sm_work; struct work_struct *sm_work;
int i, ret; int i, ret;
...@@ -142,7 +142,7 @@ int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) ...@@ -142,7 +142,7 @@ int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus)
return ret; return ret;
} }
int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
{ {
int ret; int ret;
......
...@@ -290,18 +290,17 @@ static void fill_tgid_exit(struct task_struct *tsk) ...@@ -290,18 +290,17 @@ static void fill_tgid_exit(struct task_struct *tsk)
return; return;
} }
static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd) static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd)
{ {
struct listener_list *listeners; struct listener_list *listeners;
struct listener *s, *tmp; struct listener *s, *tmp;
unsigned int cpu; unsigned int cpu;
cpumask_t mask = *maskp;
if (!cpus_subset(mask, cpu_possible_map)) if (!cpumask_subset(mask, cpu_possible_mask))
return -EINVAL; return -EINVAL;
if (isadd == REGISTER) { if (isadd == REGISTER) {
for_each_cpu_mask_nr(cpu, mask) { for_each_cpu(cpu, mask) {
s = kmalloc_node(sizeof(struct listener), GFP_KERNEL, s = kmalloc_node(sizeof(struct listener), GFP_KERNEL,
cpu_to_node(cpu)); cpu_to_node(cpu));
if (!s) if (!s)
...@@ -320,7 +319,7 @@ static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd) ...@@ -320,7 +319,7 @@ static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd)
/* Deregister or cleanup */ /* Deregister or cleanup */
cleanup: cleanup:
for_each_cpu_mask_nr(cpu, mask) { for_each_cpu(cpu, mask) {
listeners = &per_cpu(listener_array, cpu); listeners = &per_cpu(listener_array, cpu);
down_write(&listeners->sem); down_write(&listeners->sem);
list_for_each_entry_safe(s, tmp, &listeners->list, list) { list_for_each_entry_safe(s, tmp, &listeners->list, list) {
...@@ -335,7 +334,7 @@ static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd) ...@@ -335,7 +334,7 @@ static int add_del_listener(pid_t pid, cpumask_t *maskp, int isadd)
return 0; return 0;
} }
static int parse(struct nlattr *na, cpumask_t *mask) static int parse(struct nlattr *na, struct cpumask *mask)
{ {
char *data; char *data;
int len; int len;
...@@ -428,23 +427,33 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info) ...@@ -428,23 +427,33 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
{ {
int rc = 0; int rc;
struct sk_buff *rep_skb; struct sk_buff *rep_skb;
struct taskstats *stats; struct taskstats *stats;
size_t size; size_t size;
cpumask_t mask; cpumask_var_t mask;
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
return -ENOMEM;
rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], &mask); rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], mask);
if (rc < 0) if (rc < 0)
return rc; goto free_return_rc;
if (rc == 0) if (rc == 0) {
return add_del_listener(info->snd_pid, &mask, REGISTER); rc = add_del_listener(info->snd_pid, mask, REGISTER);
goto free_return_rc;
}
rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], &mask); rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], mask);
if (rc < 0) if (rc < 0)
goto free_return_rc;
if (rc == 0) {
rc = add_del_listener(info->snd_pid, mask, DEREGISTER);
free_return_rc:
free_cpumask_var(mask);
return rc; return rc;
if (rc == 0) }
return add_del_listener(info->snd_pid, &mask, DEREGISTER); free_cpumask_var(mask);
/* /*
* Size includes space for nested attributes * Size includes space for nested attributes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment