Messages in this thread | | | Date | Mon, 13 Aug 2012 11:00:17 -0700 | From | Tejun Heo <> | Subject | Re: [PATCH 2/5] workqueue: change value of lcpu in queue_delayed_work_on() |
| |
Hello,
On Tue, Aug 14, 2012 at 02:43:28AM +0900, JoonSoo Kim wrote: > >> And, do u mean @cpu is WORK_CPU_UNBOUND? > > > > @cpu could be WORK_CPU_UNBOUND at that point. The timer will be added > > to local CPU but @work->data would be pointing to WORK_CPU_UNBOUND, > > again triggering the condition. Given that @cpu being > > WORK_CPU_UNBOUND is far more common than an actual CPU number, the > > patch would actually increase spurious nrt lookups. The right thing > > to do is probably setting cpu to raw_smp_processor_id() beforehand. > > I got your point. > Thanks for kind illustration. > > Following is a alternative implementation for this. > I thinks this is too rare case, so it doesn't help in any real workload. > But how do you thinks? > > @@ -1156,7 +1156,9 @@ int queue_delayed_work_on(int cpu, struct > workqueue_struct *wq, > if (!(wq->flags & WQ_UNBOUND)) { > struct global_cwq *gcwq = get_work_gcwq(work); > > - if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND) > + if (!gcwq) > + lcpu = cpu; > + else if (gcwq->cpu != WORK_CPU_UNBOUND) > lcpu = gcwq->cpu; > else > lcpu = raw_smp_processor_id();
Why not just do
if (cpu == WORK_CPU_UNBOUND) cpu = raw_smp_processor_id();
if (!(wq->flags...) { ... if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND) lcpu = gcwq->cpu; else lcpu = cpu; } ...
add_timer_on(timer, cpu);
Also, can you please base the patches on top of the following git branch?
git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git for-3.7
Thanks.
-- tejun
| |