Merge branch 'for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
Pull workqueue changes from Tejun Heo:
"There are three major changes.
- WQ_HIGHPRI has been reimplemented so that high priority work items
are served by worker threads with -20 nice value from dedicated
highpri worker pools.
- CPU hotplug support has been reimplemented such that idle workers
are kept across CPU hotplug events. This makes CPU hotplug cheaper
(for PM) and makes the code simpler.
- flush_kthread_work() has been reimplemented so that a work item can
be freed while executing. This removes an annoying behavior
difference between kthread_worker and workqueue."
* 'for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:
workqueue: fix spurious CPU locality WARN from process_one_work()
kthread_worker: reimplement flush_kthread_work() to allow freeing the work item being executed
kthread_worker: reorganize to prepare for flush_kthread_work() reimplementation
workqueue: simplify CPU hotplug code
workqueue: remove CPU offline trustee
workqueue: don't butcher idle workers on an offline CPU
workqueue: reimplement CPU online rebinding to handle idle workers
workqueue: drop @bind from create_worker()
workqueue: use mutex for global_cwq manager exclusion
workqueue: ROGUE workers are UNBOUND workers
workqueue: drop CPU_DYING notifier operation
workqueue: perform cpu down operations from low priority cpu_notifier()
workqueue: reimplement WQ_HIGHPRI using a separate worker_pool
workqueue: introduce NR_WORKER_POOLS and for_each_worker_pool()
workqueue: separate out worker_pool flags
workqueue: use @pool instead of @gcwq or @cpu where applicable
workqueue: factor out worker_pool from global_cwq
workqueue: don't use WQ_HIGHPRI for unbound workqueues
This commit is contained in:
commit
a08489c569
6 changed files with 636 additions and 730 deletions
|
|
@ -73,8 +73,9 @@ enum {
|
|||
/* migration should happen before other stuff but after perf */
|
||||
CPU_PRI_PERF = 20,
|
||||
CPU_PRI_MIGRATION = 10,
|
||||
/* prepare workqueues for other notifiers */
|
||||
CPU_PRI_WORKQUEUE = 5,
|
||||
/* bring up workqueues before normal notifiers and down after */
|
||||
CPU_PRI_WORKQUEUE_UP = 5,
|
||||
CPU_PRI_WORKQUEUE_DOWN = -5,
|
||||
};
|
||||
|
||||
#define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ extern int tsk_fork_get_node(struct task_struct *tsk);
|
|||
* can be queued and flushed using queue/flush_kthread_work()
|
||||
* respectively. Queued kthread_works are processed by a kthread
|
||||
* running kthread_worker_fn().
|
||||
*
|
||||
* A kthread_work can't be freed while it is executing.
|
||||
*/
|
||||
struct kthread_work;
|
||||
typedef void (*kthread_work_func_t)(struct kthread_work *work);
|
||||
|
|
@ -59,15 +57,14 @@ struct kthread_worker {
|
|||
spinlock_t lock;
|
||||
struct list_head work_list;
|
||||
struct task_struct *task;
|
||||
struct kthread_work *current_work;
|
||||
};
|
||||
|
||||
struct kthread_work {
|
||||
struct list_head node;
|
||||
kthread_work_func_t func;
|
||||
wait_queue_head_t done;
|
||||
atomic_t flushing;
|
||||
int queue_seq;
|
||||
int done_seq;
|
||||
struct kthread_worker *worker;
|
||||
};
|
||||
|
||||
#define KTHREAD_WORKER_INIT(worker) { \
|
||||
|
|
@ -79,7 +76,6 @@ struct kthread_work {
|
|||
.node = LIST_HEAD_INIT((work).node), \
|
||||
.func = (fn), \
|
||||
.done = __WAIT_QUEUE_HEAD_INITIALIZER((work).done), \
|
||||
.flushing = ATOMIC_INIT(0), \
|
||||
}
|
||||
|
||||
#define DEFINE_KTHREAD_WORKER(worker) \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue