Commit 56fefe50 authored by Rusty Russell's avatar Rusty Russell Committed by David S. Miller

[PATCH] Workqueue Exit Neatening

Jeff Garzik points out the initializing the exit completion at
exit time is foolish: we should just initialize it at creation time
live everything else in that structure, and avoid the memory barrier.
parent c4d6625d
...@@ -275,6 +275,7 @@ static int create_workqueue_thread(struct workqueue_struct *wq, ...@@ -275,6 +275,7 @@ static int create_workqueue_thread(struct workqueue_struct *wq,
INIT_LIST_HEAD(&cwq->worklist); INIT_LIST_HEAD(&cwq->worklist);
init_waitqueue_head(&cwq->more_work); init_waitqueue_head(&cwq->more_work);
init_waitqueue_head(&cwq->work_done); init_waitqueue_head(&cwq->work_done);
init_completion(&cwq->exit);
init_completion(&startup.done); init_completion(&startup.done);
startup.cwq = cwq; startup.cwq = cwq;
...@@ -320,10 +321,7 @@ static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu) ...@@ -320,10 +321,7 @@ static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu)
cwq = wq->cpu_wq + cpu; cwq = wq->cpu_wq + cpu;
if (cwq->thread) { if (cwq->thread) {
printk("Cleaning up workqueue thread for %i\n", cpu); /* Tell thread to exit and wait for it. */
/* Initiate an exit and wait for it: */
init_completion(&cwq->exit);
wmb(); /* Thread must see !cwq->thread after completion init */
cwq->thread = NULL; cwq->thread = NULL;
wake_up(&cwq->more_work); wake_up(&cwq->more_work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment