History

workqueue: introduce system_highpri_wq

Commit 3270476a6c0ce322354df8679652f060d66526dc ('workqueue: reimplement WQ_HIGHPRI using a separate worker_pool') introduce separate worker pool for HIGHPRI. When we handle busyworkers for gcwq, it can be normal worker or highpri worker. But, we don't consider this difference in rebind_workers(), we use just system_wq for highpri worker. It makes mismatch between cwq->pool and worker->pool. It doesn't make error in current implementation, but possible in the future. Now, we introduce system_highpri_wq to use proper cwq for highpri workers in rebind_workers(). Following patch fix this issue properly. tj: Even apart from rebinding, having system_highpri_wq generally makes sense.

Joonsoo Kim committed 14 years ago

Commit 1aabe901 parent e42986d1 file · +6 −3Browse files

Showing the changes to kernel/workqueue.c (1 of 1 file). Show all

Unified · Split

kernel/workqueue.c+6−3
@@ -269,12 +269,14 @@ struct workqueue_struct { · 268 unmodified lines
269269 };
270270
271271 struct workqueue_struct *system_wq __read_mostly;
272+struct workqueue_struct *system_highpri_wq __read_mostly;
272273 struct workqueue_struct *system_long_wq __read_mostly;
273274 struct workqueue_struct *system_nrt_wq __read_mostly;
274275 struct workqueue_struct *system_unbound_wq __read_mostly;
275276 struct workqueue_struct *system_freezable_wq __read_mostly;
276277 struct workqueue_struct *system_nrt_freezable_wq __read_mostly;
277278 EXPORT_SYMBOL_GPL(system_wq);
279+EXPORT_SYMBOL_GPL(system_highpri_wq);
278280 EXPORT_SYMBOL_GPL(system_long_wq);
279281 EXPORT_SYMBOL_GPL(system_nrt_wq);
280282 EXPORT_SYMBOL_GPL(system_unbound_wq);
@@ -3928,6 +3930,7 @@ static int __init init_workqueues(void) · 3647 unmodified lines
39283930 }
39293931
39303932 system_wq = alloc_workqueue("events", 0, 0);
3933+ system_highpri_wq = alloc_workqueue("events_highpri", WQ_HIGHPRI, 0);
39313934 system_long_wq = alloc_workqueue("events_long", 0, 0);
39323935 system_nrt_wq = alloc_workqueue("events_nrt", WQ_NON_REENTRANT, 0);
39333936 system_unbound_wq = alloc_workqueue("events_unbound", WQ_UNBOUND,
@@ -3936,9 +3939,9 @@ static int __init init_workqueues(void) · 2 unmodified lines
39363939 WQ_FREEZABLE, 0);
39373940 system_nrt_freezable_wq = alloc_workqueue("events_nrt_freezable",
39383941 WQ_NON_REENTRANT | WQ_FREEZABLE, 0);
3939− BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq ||
3940− !system_unbound_wq || !system_freezable_wq ||
3941− !system_nrt_freezable_wq);
3942+ BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq ||
3943+ !system_nrt_wq || !system_unbound_wq || !system_freezable_wq ||
3944+ !system_nrt_freezable_wq);
39423945 return 0;
39433946 }
39443947 early_initcall(init_workqueues);