Re: [PATCH 2/6] workqueue: add support for lazy workqueues

From: Jens Axboe
Date: Mon Aug 24 2009 - 04:06:34 EST


On Thu, Aug 20 2009, Andrew Morton wrote:
> On Thu, 20 Aug 2009 12:17:39 +0200
> Jens Axboe <jens.axboe@xxxxxxxxxx> 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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/