On 25 September 2012 16:52, Peter Zijlstra <pet...@infradead.org> wrote: > On Tue, 2012-09-25 at 16:06 +0530, Viresh Kumar wrote: >> @@ -1066,8 +1076,9 @@ int queue_work(struct workqueue_struct *wq, >> struct work_struct *work) >> { >> int ret; >> >> - ret = queue_work_on(get_cpu(), wq, work); >> - put_cpu(); >> + preempt_disable(); >> + ret = queue_work_on(wq_select_cpu(), wq, work); >> + preempt_enable(); >> >> return ret; >> } > > Right, so the problem I see here is that wq_select_cpu() is horridly > expensive..
But this is what the initial idea during LPC we had. Any improvements here you can suggest? >> @@ -1102,7 +1113,7 @@ static 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); >> >> - __queue_work(smp_processor_id(), cwq->wq, &dwork->work); >> + __queue_work(wq_select_cpu(), cwq->wq, &dwork->work); >> } > > Shouldn't timer migration have sorted this one? Maybe yes. Will investigate more on it. Thanks for your early feedback. -- viresh _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev