Re: [PATCH 03/13] workqueue: don't set work cwq until we queued it on pool

Lai Jiangshan
2013-02-06T11:35:27Z

On Wed, Feb 6, 2013 at 12:45 AM, Tejun Heo <tj@kernel.org> wrote:
> Hey, Lai.
>
> On Tue, Feb 05, 2013 at 11:00:42PM +0800, Lai Jiangshan wrote:
>> The @cpu can be WORK_CPU_UNBOUND, and the current code will delay
>> to determine on which cpu should this work be queued until timeout,
>> I didn't want to change this behavior when I wrote the patch.
>
> Hmmm? The current code determines the CPU on queue_delayed_work().
>
> /*
> * If we cannot get the last pool from @work directly,
> * select the last CPU such that it avoids unnecessarily
> * triggering non-reentrancy check in __queue_work().
> */
> lcpu = cpu;
> if (pool)
> lcpu = pool->cpu;
> if (lcpu == WORK_CPU_UNBOUND)
> lcpu = raw_smp_processor_id();
>
> @lcpu is never WORK_CPU_UNBOUND for bound workqueues and for unbound
> workqueues we of course have cwq for WORK_CPU_UNBOUND.

Are you sure?
@lcpu is only used when it tries to set cwq to work data without
breaking nrt logic.

void delayed_work_timer_fn(unsigned long __data)
{
struct delayed_work *dwork = (struct delayed_work *)__data;
struct cpu_workqueue_struct *cwq = get_work_cwq(&dwork->work);

/* should have been called from irqsafe timer with irq already off */
__queue_work(dwork->cpu, cwq->wq, &dwork->work);
}

>
>> PS, again, @cpu and @wq can be saved/encoded in dwork.work.entry if needed.
>
> If possible, I'd much prefer to keep it inside delayed_work() proper.
>
> Thanks.
>
> --
> tejun