diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 4952322cba45..2f445833ae37 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -73,7 +73,7 @@ static DEFINE_SPINLOCK(workqueue_lock); | |||
| 73 | static LIST_HEAD(workqueues); | 73 | static LIST_HEAD(workqueues); |
| 74 | 74 | ||
| 75 | static int singlethread_cpu __read_mostly; | 75 | static int singlethread_cpu __read_mostly; |
| 76 | static cpumask_t cpu_singlethread_map __read_mostly; | 76 | static const struct cpumask *cpu_singlethread_map __read_mostly; |
| 77 | /* | 77 | /* |
| 78 | * _cpu_down() first removes CPU from cpu_online_map, then CPU_DEAD | 78 | * _cpu_down() first removes CPU from cpu_online_map, then CPU_DEAD |
| 79 | * flushes cwq->worklist. This means that flush_workqueue/wait_on_work | 79 | * flushes cwq->worklist. This means that flush_workqueue/wait_on_work |
| @@ -81,7 +81,7 @@ static cpumask_t cpu_singlethread_map __read_mostly; | |||
| 81 | * use cpu_possible_map, the cpumask below is more a documentation | 81 | * use cpu_possible_map, the cpumask below is more a documentation |
| 82 | * than optimization. | 82 | * than optimization. |
| 83 | */ | 83 | */ |
| 84 | static cpumask_t cpu_populated_map __read_mostly; | 84 | static cpumask_var_t cpu_populated_map __read_mostly; |
| 85 | 85 | ||
| 86 | /* If it's single threaded, it isn't in the list of workqueues. */ | 86 | /* If it's single threaded, it isn't in the list of workqueues. */ |
| 87 | static inline int is_wq_single_threaded(struct workqueue_struct *wq) | 87 | static inline int is_wq_single_threaded(struct workqueue_struct *wq) |
| @@ -89,10 +89,10 @@ static inline int is_wq_single_threaded(struct workqueue_struct *wq) | |||
| 89 | return wq->singlethread; | 89 | return wq->singlethread; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | static const cpumask_t *wq_cpu_map(struct workqueue_struct *wq) | 92 | static const struct cpumask *wq_cpu_map(struct workqueue_struct *wq) |
| 93 | { | 93 | { |
| 94 | return is_wq_single_threaded(wq) | 94 | return is_wq_single_threaded(wq) |
| 95 | ? &cpu_singlethread_map : &cpu_populated_map; | 95 | ? cpu_singlethread_map : cpu_populated_map; |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | static | 98 | static |
| @@ -410,7 +410,7 @@ static int flush_cpu_workqueue(struct cpu_workqueue_struct *cwq) | |||
| 410 | */ | 410 | */ |
| 411 | void flush_workqueue(struct workqueue_struct *wq) | 411 | void flush_workqueue(struct workqueue_struct *wq) |
| 412 | { | 412 | { |
| 413 | const cpumask_t *cpu_map = wq_cpu_map(wq); | 413 | const struct cpumask *cpu_map = wq_cpu_map(wq); |
| 414 | int cpu; | 414 | int cpu; |
| 415 | 415 | ||
| 416 | might_sleep(); | 416 | might_sleep(); |
| @@ -532,7 +532,7 @@ static void wait_on_work(struct work_struct *work) | |||
| 532 | { | 532 | { |
| 533 | struct cpu_workqueue_struct *cwq; | 533 | struct cpu_workqueue_struct *cwq; |
| 534 | struct workqueue_struct *wq; | 534 | struct workqueue_struct *wq; |
| 535 | const cpumask_t *cpu_map; | 535 | const struct cpumask *cpu_map; |
| 536 | int cpu; | 536 | int cpu; |
| 537 | 537 | ||
| 538 | might_sleep(); | 538 | might_sleep(); |
| @@ -903,7 +903,7 @@ static void cleanup_workqueue_thread(struct cpu_workqueue_struct *cwq) | |||
| 903 | */ | 903 | */ |
| 904 | void destroy_workqueue(struct workqueue_struct *wq) | 904 | void destroy_workqueue(struct workqueue_struct *wq) |
| 905 | { | 905 | { |
| 906 | const cpumask_t *cpu_map = wq_cpu_map(wq); | 906 | const struct cpumask *cpu_map = wq_cpu_map(wq); |
| 907 | int cpu; | 907 | int cpu; |
| 908 | 908 | ||
| 909 | cpu_maps_update_begin(); | 909 | cpu_maps_update_begin(); |
| @@ -933,7 +933,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | |||
| 933 | 933 | ||
| 934 | switch (action) { | 934 | switch (action) { |
| 935 | case CPU_UP_PREPARE: | 935 | case CPU_UP_PREPARE: |
| 936 | cpu_set(cpu, cpu_populated_map); | 936 | cpumask_set_cpu(cpu, cpu_populated_map); |
| 937 | } | 937 | } |
| 938 | undo: | 938 | undo: |
| 939 | list_for_each_entry(wq, &workqueues, list) { | 939 | list_for_each_entry(wq, &workqueues, list) { |
| @@ -964,7 +964,7 @@ undo: | |||
| 964 | switch (action) { | 964 | switch (action) { |
| 965 | case CPU_UP_CANCELED: | 965 | case CPU_UP_CANCELED: |
| 966 | case CPU_POST_DEAD: | 966 | case CPU_POST_DEAD: |
| 967 | cpu_clear(cpu, cpu_populated_map); | 967 | cpumask_clear_cpu(cpu, cpu_populated_map); |
| 968 | } | 968 | } |
| 969 | 969 | ||
| 970 | return ret; | 970 | return ret; |
| @@ -1017,9 +1017,11 @@ EXPORT_SYMBOL_GPL(work_on_cpu); | |||
| 1017 | 1017 | ||
| 1018 | void __init init_workqueues(void) | 1018 | void __init init_workqueues(void) |
| 1019 | { | 1019 | { |
| 1020 | cpu_populated_map = cpu_online_map; | 1020 | alloc_cpumask_var(&cpu_populated_map, GFP_KERNEL); |
| 1021 | singlethread_cpu = first_cpu(cpu_possible_map); | 1021 | |
| 1022 | cpu_singlethread_map = cpumask_of_cpu(singlethread_cpu); | 1022 | cpumask_copy(cpu_populated_map, cpu_online_mask); |
| 1023 | singlethread_cpu = cpumask_first(cpu_possible_mask); | ||
| 1024 | cpu_singlethread_map = cpumask_of(singlethread_cpu); | ||
| 1023 | hotcpu_notifier(workqueue_cpu_callback, 0); | 1025 | hotcpu_notifier(workqueue_cpu_callback, 0); |
| 1024 | keventd_wq = create_workqueue("events"); | 1026 | keventd_wq = create_workqueue("events"); |
| 1025 | BUG_ON(!keventd_wq); | 1027 | BUG_ON(!keventd_wq); |
