lkml.org 
[lkml]   [2009]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [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



\
 
 \ /
  Last update: 2009-08-24 10:09    [W:0.136 / U:2.360 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site