* Steven Rostedt <[EMAIL PROTECTED]> wrote: > Ingo, > > I've hit this. I compiled the kernel as CONFIG_PREEMPT, and turned off > IRQ's as threads. > > BUG: scheduling while atomic: swapper/0x00000001/1, CPU#3
> int filevec_add_drain_all(void) > { > return schedule_on_each_cpu(filevec_add_drain_per_cpu, NULL); > } > > > And schedule_on_each_cpu is easily schedulable. > > So it seems that it schedules while holding a spin lock. hm, indeed. I've Cc:-ed Pete who wrote the file-lock scalability patchset. My quick impression is that taking the workqueue_mutex in schedule_on_each_cpu() is unwarranted - i.e. the patch below should fix it. Ingo Index: linux/kernel/workqueue.c =================================================================== --- linux.orig/kernel/workqueue.c +++ linux/kernel/workqueue.c @@ -564,15 +564,15 @@ int schedule_on_each_cpu(void (*func)(vo if (!works) return -ENOMEM; - mutex_lock(&workqueue_mutex); for_each_online_cpu(cpu) { INIT_WORK(per_cpu_ptr(works, cpu), func, info); __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), per_cpu_ptr(works, cpu)); } - mutex_unlock(&workqueue_mutex); flush_workqueue(keventd_wq); + free_percpu(works); + return 0; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/