Messages in this thread | | | Date | Mon, 24 Aug 2009 10:06:26 +0200 | From | Jens Axboe <> | Subject | Re: [PATCH 2/6] workqueue: add support for lazy workqueues |
| |
On Thu, Aug 20 2009, Andrew Morton wrote: > On Thu, 20 Aug 2009 12:17:39 +0200 > Jens Axboe <jens.axboe@oracle.com> wrote: > > > Lazy workqueues are like normal workqueues, except they don't > > start a thread per CPU by default. Instead threads are started > > when they are needed, and exit when they have been idle for > > some time. > > > > > > ... > > > > @@ -280,7 +309,34 @@ static void run_workqueue(struct cpu_workqueue_struct *cwq) > > trace_workqueue_execution(cwq->thread, work); > > cwq->current_work = work; > > list_del_init(cwq->worklist.next); > > + cpu = smp_processor_id(); > > spin_unlock_irq(&cwq->lock); > > + did_work = 1; > > + > > + /* > > + * If work->cpu isn't us, then we need to create the target > > + * workqueue thread (if someone didn't already do that) and > > + * move the work over there. > > + */ > > + if ((cwq->wq->flags & WQ_F_LAZY) && work->cpu != cpu) { > > + struct cpu_workqueue_struct *__cwq; > > + struct task_struct *p; > > + int err; > > + > > + __cwq = wq_per_cpu(cwq->wq, work->cpu); > > + p = __cwq->thread; > > + if (!p) > > + err = create_workqueue_thread(__cwq, work->cpu); > > + p = __cwq->thread; > > + if (p) { > > + if (work->cpu >= 0) > > It's an unsigned int. This test is always true. > > > + kthread_bind(p, work->cpu); > > I wonder what happens if work->cpu isn't online any more.
That's a good question. The workqueue "documentation" states that it is the callers responsibility to ensure that the CPU stays online, but I think that requirement is pretty much ignored. Probably since it'd be costly to do.
So that bits needs looking into.
-- Jens Axboe
| |