X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=kernel%2Fkthread.c;fp=kernel%2Fkthread.c;h=490924cc9e7c8252c447e802f142d0a3a150865d;hb=a1d8561172f369ba56d636df49a6b4d6d77e2123;hp=fdea0bee7b5a4d5e2fcf43ee3b92e1a37dea6c71;hpb=3959df1dfb9538498ec3372a2d390bc7fbdbfac2;p=firefly-linux-kernel-4.4.55.git diff --git a/kernel/kthread.c b/kernel/kthread.c index fdea0bee7b5a..490924cc9e7c 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -327,16 +327,30 @@ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), } EXPORT_SYMBOL(kthread_create_on_node); -static void __kthread_bind(struct task_struct *p, unsigned int cpu, long state) +static void __kthread_bind_mask(struct task_struct *p, const struct cpumask *mask, long state) { - /* Must have done schedule() in kthread() before we set_task_cpu */ + unsigned long flags; + if (!wait_task_inactive(p, state)) { WARN_ON(1); return; } + /* It's safe because the task is inactive. */ - do_set_cpus_allowed(p, cpumask_of(cpu)); + raw_spin_lock_irqsave(&p->pi_lock, flags); + do_set_cpus_allowed(p, mask); p->flags |= PF_NO_SETAFFINITY; + raw_spin_unlock_irqrestore(&p->pi_lock, flags); +} + +static void __kthread_bind(struct task_struct *p, unsigned int cpu, long state) +{ + __kthread_bind_mask(p, cpumask_of(cpu), state); +} + +void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) +{ + __kthread_bind_mask(p, mask, TASK_UNINTERRUPTIBLE); } /**