|
@@ -210,6 +210,13 @@ struct workqueue_struct {
|
|
#endif
|
|
#endif
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+struct workqueue_struct *system_wq __read_mostly;
|
|
|
|
+struct workqueue_struct *system_long_wq __read_mostly;
|
|
|
|
+struct workqueue_struct *system_nrt_wq __read_mostly;
|
|
|
|
+EXPORT_SYMBOL_GPL(system_wq);
|
|
|
|
+EXPORT_SYMBOL_GPL(system_long_wq);
|
|
|
|
+EXPORT_SYMBOL_GPL(system_nrt_wq);
|
|
|
|
+
|
|
#define for_each_busy_worker(worker, i, pos, gcwq) \
|
|
#define for_each_busy_worker(worker, i, pos, gcwq) \
|
|
for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++) \
|
|
for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++) \
|
|
hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry)
|
|
hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry)
|
|
@@ -2306,8 +2313,6 @@ int cancel_delayed_work_sync(struct delayed_work *dwork)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cancel_delayed_work_sync);
|
|
EXPORT_SYMBOL(cancel_delayed_work_sync);
|
|
|
|
|
|
-static struct workqueue_struct *keventd_wq __read_mostly;
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* schedule_work - put work task in global workqueue
|
|
* schedule_work - put work task in global workqueue
|
|
* @work: job to be done
|
|
* @work: job to be done
|
|
@@ -2321,7 +2326,7 @@ static struct workqueue_struct *keventd_wq __read_mostly;
|
|
*/
|
|
*/
|
|
int schedule_work(struct work_struct *work)
|
|
int schedule_work(struct work_struct *work)
|
|
{
|
|
{
|
|
- return queue_work(keventd_wq, work);
|
|
|
|
|
|
+ return queue_work(system_wq, work);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(schedule_work);
|
|
EXPORT_SYMBOL(schedule_work);
|
|
|
|
|
|
@@ -2334,7 +2339,7 @@ EXPORT_SYMBOL(schedule_work);
|
|
*/
|
|
*/
|
|
int schedule_work_on(int cpu, struct work_struct *work)
|
|
int schedule_work_on(int cpu, struct work_struct *work)
|
|
{
|
|
{
|
|
- return queue_work_on(cpu, keventd_wq, work);
|
|
|
|
|
|
+ return queue_work_on(cpu, system_wq, work);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(schedule_work_on);
|
|
EXPORT_SYMBOL(schedule_work_on);
|
|
|
|
|
|
@@ -2349,7 +2354,7 @@ EXPORT_SYMBOL(schedule_work_on);
|
|
int schedule_delayed_work(struct delayed_work *dwork,
|
|
int schedule_delayed_work(struct delayed_work *dwork,
|
|
unsigned long delay)
|
|
unsigned long delay)
|
|
{
|
|
{
|
|
- return queue_delayed_work(keventd_wq, dwork, delay);
|
|
|
|
|
|
+ return queue_delayed_work(system_wq, dwork, delay);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(schedule_delayed_work);
|
|
EXPORT_SYMBOL(schedule_delayed_work);
|
|
|
|
|
|
@@ -2382,7 +2387,7 @@ EXPORT_SYMBOL(flush_delayed_work);
|
|
int schedule_delayed_work_on(int cpu,
|
|
int schedule_delayed_work_on(int cpu,
|
|
struct delayed_work *dwork, unsigned long delay)
|
|
struct delayed_work *dwork, unsigned long delay)
|
|
{
|
|
{
|
|
- return queue_delayed_work_on(cpu, keventd_wq, dwork, delay);
|
|
|
|
|
|
+ return queue_delayed_work_on(cpu, system_wq, dwork, delay);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(schedule_delayed_work_on);
|
|
EXPORT_SYMBOL(schedule_delayed_work_on);
|
|
|
|
|
|
@@ -2447,7 +2452,7 @@ int schedule_on_each_cpu(work_func_t func)
|
|
*/
|
|
*/
|
|
void flush_scheduled_work(void)
|
|
void flush_scheduled_work(void)
|
|
{
|
|
{
|
|
- flush_workqueue(keventd_wq);
|
|
|
|
|
|
+ flush_workqueue(system_wq);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(flush_scheduled_work);
|
|
EXPORT_SYMBOL(flush_scheduled_work);
|
|
|
|
|
|
@@ -2479,7 +2484,7 @@ EXPORT_SYMBOL_GPL(execute_in_process_context);
|
|
|
|
|
|
int keventd_up(void)
|
|
int keventd_up(void)
|
|
{
|
|
{
|
|
- return keventd_wq != NULL;
|
|
|
|
|
|
+ return system_wq != NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static struct cpu_workqueue_struct *alloc_cwqs(void)
|
|
static struct cpu_workqueue_struct *alloc_cwqs(void)
|
|
@@ -2539,15 +2544,16 @@ static int wq_clamp_max_active(int max_active, const char *name)
|
|
return clamp_val(max_active, 1, WQ_MAX_ACTIVE);
|
|
return clamp_val(max_active, 1, WQ_MAX_ACTIVE);
|
|
}
|
|
}
|
|
|
|
|
|
-struct workqueue_struct *__create_workqueue_key(const char *name,
|
|
|
|
- unsigned int flags,
|
|
|
|
- int max_active,
|
|
|
|
- struct lock_class_key *key,
|
|
|
|
- const char *lock_name)
|
|
|
|
|
|
+struct workqueue_struct *__alloc_workqueue_key(const char *name,
|
|
|
|
+ unsigned int flags,
|
|
|
|
+ int max_active,
|
|
|
|
+ struct lock_class_key *key,
|
|
|
|
+ const char *lock_name)
|
|
{
|
|
{
|
|
struct workqueue_struct *wq;
|
|
struct workqueue_struct *wq;
|
|
unsigned int cpu;
|
|
unsigned int cpu;
|
|
|
|
|
|
|
|
+ max_active = max_active ?: WQ_DFL_ACTIVE;
|
|
max_active = wq_clamp_max_active(max_active, name);
|
|
max_active = wq_clamp_max_active(max_active, name);
|
|
|
|
|
|
wq = kzalloc(sizeof(*wq), GFP_KERNEL);
|
|
wq = kzalloc(sizeof(*wq), GFP_KERNEL);
|
|
@@ -2626,7 +2632,7 @@ err:
|
|
}
|
|
}
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(__create_workqueue_key);
|
|
|
|
|
|
+EXPORT_SYMBOL_GPL(__alloc_workqueue_key);
|
|
|
|
|
|
/**
|
|
/**
|
|
* destroy_workqueue - safely terminate a workqueue
|
|
* destroy_workqueue - safely terminate a workqueue
|
|
@@ -2910,7 +2916,7 @@ static int __cpuinit trustee_thread(void *__gcwq)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
debug_work_activate(rebind_work);
|
|
debug_work_activate(rebind_work);
|
|
- insert_work(get_cwq(gcwq->cpu, keventd_wq), rebind_work,
|
|
|
|
|
|
+ insert_work(get_cwq(gcwq->cpu, system_wq), rebind_work,
|
|
worker->scheduled.next,
|
|
worker->scheduled.next,
|
|
work_color_to_flags(WORK_NO_COLOR));
|
|
work_color_to_flags(WORK_NO_COLOR));
|
|
}
|
|
}
|
|
@@ -3287,6 +3293,8 @@ void __init init_workqueues(void)
|
|
spin_unlock_irq(&gcwq->lock);
|
|
spin_unlock_irq(&gcwq->lock);
|
|
}
|
|
}
|
|
|
|
|
|
- keventd_wq = __create_workqueue("events", 0, WQ_DFL_ACTIVE);
|
|
|
|
- BUG_ON(!keventd_wq);
|
|
|
|
|
|
+ system_wq = alloc_workqueue("events", 0, 0);
|
|
|
|
+ system_long_wq = alloc_workqueue("events_long", 0, 0);
|
|
|
|
+ system_nrt_wq = alloc_workqueue("events_nrt", WQ_NON_REENTRANT, 0);
|
|
|
|
+ BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq);
|
|
}
|
|
}
|