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 bec7b5b53e0..5abf42f63c0 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -253,11 +253,13 @@ struct workqueue_struct *system_long_wq __read_mostly;  struct workqueue_struct *system_nrt_wq __read_mostly;  struct workqueue_struct *system_unbound_wq __read_mostly;  struct workqueue_struct *system_freezable_wq __read_mostly; +struct workqueue_struct *system_nrt_freezable_wq __read_mostly;  EXPORT_SYMBOL_GPL(system_wq);  EXPORT_SYMBOL_GPL(system_long_wq);  EXPORT_SYMBOL_GPL(system_nrt_wq);  EXPORT_SYMBOL_GPL(system_unbound_wq);  EXPORT_SYMBOL_GPL(system_freezable_wq); +EXPORT_SYMBOL_GPL(system_nrt_freezable_wq);  #define CREATE_TRACE_POINTS  #include <trace/events/workqueue.h> @@ -474,13 +476,8 @@ static struct cpu_workqueue_struct *get_cwq(unsigned int cpu,  					    struct workqueue_struct *wq)  {  	if (!(wq->flags & WQ_UNBOUND)) { -		if (likely(cpu < nr_cpu_ids)) { -#ifdef CONFIG_SMP +		if (likely(cpu < nr_cpu_ids))  			return per_cpu_ptr(wq->cpu_wq.pcpu, cpu); -#else -			return wq->cpu_wq.single; -#endif -		}  	} else if (likely(cpu == WORK_CPU_UNBOUND))  		return wq->cpu_wq.single;  	return NULL; @@ -2897,13 +2894,8 @@ static int alloc_cwqs(struct workqueue_struct *wq)  	const size_t size = sizeof(struct cpu_workqueue_struct);  	const size_t align = max_t(size_t, 1 << WORK_STRUCT_FLAG_BITS,  				   __alignof__(unsigned long long)); -#ifdef CONFIG_SMP -	bool percpu = !(wq->flags & WQ_UNBOUND); -#else -	bool percpu = false; -#endif -	if (percpu) +	if (!(wq->flags & WQ_UNBOUND))  		wq->cpu_wq.pcpu = __alloc_percpu(size, align);  	else {  		void *ptr; @@ -2927,13 +2919,7 @@ static int alloc_cwqs(struct workqueue_struct *wq)  static void free_cwqs(struct workqueue_struct *wq)  { -#ifdef CONFIG_SMP -	bool percpu = !(wq->flags & WQ_UNBOUND); -#else -	bool percpu = false; -#endif - -	if (percpu) +	if (!(wq->flags & WQ_UNBOUND))  		free_percpu(wq->cpu_wq.pcpu);  	else if (wq->cpu_wq.single) {  		/* the pointer to free is stored right after the cwq */ @@ -3833,8 +3819,11 @@ static int __init init_workqueues(void)  					    WQ_UNBOUND_MAX_ACTIVE);  	system_freezable_wq = alloc_workqueue("events_freezable",  					      WQ_FREEZABLE, 0); +	system_nrt_freezable_wq = alloc_workqueue("events_nrt_freezable", +			WQ_NON_REENTRANT | WQ_FREEZABLE, 0);  	BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq || -	       !system_unbound_wq || !system_freezable_wq); +	       !system_unbound_wq || !system_freezable_wq || +		!system_nrt_freezable_wq);  	return 0;  }  early_initcall(init_workqueues); | 
