Hello, On Tue, Jul 24, 2012 at 05:05:32PM -0700, Peter Boonstoppel wrote: > After a kthread is created it signals the requester using complete() > and enters TASK_UNINTERRUPTIBLE. However, since complete() wakes up > the requesting thread this can cause a preemption. The preemption will > not remove the task from the runqueue (for that schedule() has to be > invoked directly). > > This is a problem if directly after kthread creation you try to do a > kthread_bind(), which will block in HZ steps until the thread is off > the runqueue. > > This patch disables preemption during complete(), since we call > schedule() directly afterwards, so it will correctly enter > TASK_UNINTERRUPTIBLE. This speeds up kthread creation/binding during > cpu hotplug significantly. > > Change-Id: I856ddd4e01ebdb198ba90f343b4a0c5933fd2b23
Is this from internal gerrit? Can you please remove it before sending things upstream? > #include <linux/mutex.h> > #include <linux/slab.h> > #include <linux/freezer.h> > +#include <linux/preempt.h> > +#include <linux/thread_info.h> > #include <trace/events/sched.h> > > static DEFINE_SPINLOCK(kthread_create_lock); > @@ -113,7 +115,10 @@ static int kthread(void *_create) > /* OK, tell user we're spawned, wait for stop or wakeup */ > __set_current_state(TASK_UNINTERRUPTIBLE); > create->result = current; > + preempt_disable(); > complete(&create->done); > + clear_need_resched(); Is the above really necessary given that you're calling preempt_enable_no_resched() right after? > + preempt_enable_no_resched(); > schedule(); Some comments would be really nice. Thanks. -- tejun -- 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/