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..
@@ -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?