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? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/