diff options
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index bec7b5b53e03..5abf42f63c08 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -253,11 +253,13 @@ struct workqueue_struct *system_long_wq __read_mostly; | |||
253 | struct workqueue_struct *system_nrt_wq __read_mostly; | 253 | struct workqueue_struct *system_nrt_wq __read_mostly; |
254 | struct workqueue_struct *system_unbound_wq __read_mostly; | 254 | struct workqueue_struct *system_unbound_wq __read_mostly; |
255 | struct workqueue_struct *system_freezable_wq __read_mostly; | 255 | struct workqueue_struct *system_freezable_wq __read_mostly; |
256 | struct workqueue_struct *system_nrt_freezable_wq __read_mostly; | ||
256 | EXPORT_SYMBOL_GPL(system_wq); | 257 | EXPORT_SYMBOL_GPL(system_wq); |
257 | EXPORT_SYMBOL_GPL(system_long_wq); | 258 | EXPORT_SYMBOL_GPL(system_long_wq); |
258 | EXPORT_SYMBOL_GPL(system_nrt_wq); | 259 | EXPORT_SYMBOL_GPL(system_nrt_wq); |
259 | EXPORT_SYMBOL_GPL(system_unbound_wq); | 260 | EXPORT_SYMBOL_GPL(system_unbound_wq); |
260 | EXPORT_SYMBOL_GPL(system_freezable_wq); | 261 | EXPORT_SYMBOL_GPL(system_freezable_wq); |
262 | EXPORT_SYMBOL_GPL(system_nrt_freezable_wq); | ||
261 | 263 | ||
262 | #define CREATE_TRACE_POINTS | 264 | #define CREATE_TRACE_POINTS |
263 | #include <trace/events/workqueue.h> | 265 | #include <trace/events/workqueue.h> |
@@ -474,13 +476,8 @@ static struct cpu_workqueue_struct *get_cwq(unsigned int cpu, | |||
474 | struct workqueue_struct *wq) | 476 | struct workqueue_struct *wq) |
475 | { | 477 | { |
476 | if (!(wq->flags & WQ_UNBOUND)) { | 478 | if (!(wq->flags & WQ_UNBOUND)) { |
477 | if (likely(cpu < nr_cpu_ids)) { | 479 | if (likely(cpu < nr_cpu_ids)) |
478 | #ifdef CONFIG_SMP | ||
479 | return per_cpu_ptr(wq->cpu_wq.pcpu, cpu); | 480 | return per_cpu_ptr(wq->cpu_wq.pcpu, cpu); |
480 | #else | ||
481 | return wq->cpu_wq.single; | ||
482 | #endif | ||
483 | } | ||
484 | } else if (likely(cpu == WORK_CPU_UNBOUND)) | 481 | } else if (likely(cpu == WORK_CPU_UNBOUND)) |
485 | return wq->cpu_wq.single; | 482 | return wq->cpu_wq.single; |
486 | return NULL; | 483 | return NULL; |
@@ -2897,13 +2894,8 @@ static int alloc_cwqs(struct workqueue_struct *wq) | |||
2897 | const size_t size = sizeof(struct cpu_workqueue_struct); | 2894 | const size_t size = sizeof(struct cpu_workqueue_struct); |
2898 | const size_t align = max_t(size_t, 1 << WORK_STRUCT_FLAG_BITS, | 2895 | const size_t align = max_t(size_t, 1 << WORK_STRUCT_FLAG_BITS, |
2899 | __alignof__(unsigned long long)); | 2896 | __alignof__(unsigned long long)); |
2900 | #ifdef CONFIG_SMP | ||
2901 | bool percpu = !(wq->flags & WQ_UNBOUND); | ||
2902 | #else | ||
2903 | bool percpu = false; | ||
2904 | #endif | ||
2905 | 2897 | ||
2906 | if (percpu) | 2898 | if (!(wq->flags & WQ_UNBOUND)) |
2907 | wq->cpu_wq.pcpu = __alloc_percpu(size, align); | 2899 | wq->cpu_wq.pcpu = __alloc_percpu(size, align); |
2908 | else { | 2900 | else { |
2909 | void *ptr; | 2901 | void *ptr; |
@@ -2927,13 +2919,7 @@ static int alloc_cwqs(struct workqueue_struct *wq) | |||
2927 | 2919 | ||
2928 | static void free_cwqs(struct workqueue_struct *wq) | 2920 | static void free_cwqs(struct workqueue_struct *wq) |
2929 | { | 2921 | { |
2930 | #ifdef CONFIG_SMP | 2922 | if (!(wq->flags & WQ_UNBOUND)) |
2931 | bool percpu = !(wq->flags & WQ_UNBOUND); | ||
2932 | #else | ||
2933 | bool percpu = false; | ||
2934 | #endif | ||
2935 | |||
2936 | if (percpu) | ||
2937 | free_percpu(wq->cpu_wq.pcpu); | 2923 | free_percpu(wq->cpu_wq.pcpu); |
2938 | else if (wq->cpu_wq.single) { | 2924 | else if (wq->cpu_wq.single) { |
2939 | /* the pointer to free is stored right after the cwq */ | 2925 | /* the pointer to free is stored right after the cwq */ |
@@ -3833,8 +3819,11 @@ static int __init init_workqueues(void) | |||
3833 | WQ_UNBOUND_MAX_ACTIVE); | 3819 | WQ_UNBOUND_MAX_ACTIVE); |
3834 | system_freezable_wq = alloc_workqueue("events_freezable", | 3820 | system_freezable_wq = alloc_workqueue("events_freezable", |
3835 | WQ_FREEZABLE, 0); | 3821 | WQ_FREEZABLE, 0); |
3822 | system_nrt_freezable_wq = alloc_workqueue("events_nrt_freezable", | ||
3823 | WQ_NON_REENTRANT | WQ_FREEZABLE, 0); | ||
3836 | BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq || | 3824 | BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq || |
3837 | !system_unbound_wq || !system_freezable_wq); | 3825 | !system_unbound_wq || !system_freezable_wq || |
3826 | !system_nrt_freezable_wq); | ||
3838 | return 0; | 3827 | return 0; |
3839 | } | 3828 | } |
3840 | early_initcall(init_workqueues); | 3829 | early_initcall(init_workqueues); |