On Wed, Nov 09, 2016 at 11:05:10AM -0800, Jacob Pan wrote:
>  static inline bool is_idle_task(const struct task_struct *p)
>  {
> -     return p->pid == 0;
> +     return !!(p->flags & PF_IDLE);
>  }

> +void play_idle()
> +{
> +     /*
> +      * Only FIFO tasks can disable the tick since they don't need the forced
> +      * preemption.
> +      */
> +     WARN_ON_ONCE(current->policy != SCHED_FIFO);
> +     WARN_ON_ONCE(current->nr_cpus_allowed != 1);
> +     WARN_ON_ONCE(!(current->flags & PF_KTHREAD));
> +     WARN_ON_ONCE(!(current->flags & PF_NO_SETAFFINITY));
> +     rcu_sleep_check();
> +
> +     preempt_disable();
> +     current->flags |= PF_IDLE;
> +     do_idle();
> +     current->flags &= ~PF_IDLE;

Whoops, that will clear PF_IDLE from the idle thread. Maybe do something
like:

        unsigned int idle_flag = (~current->flags & PF_IDLE)

        current->flags |= PF_IDLE;

        current->flags ^= idle_flag;

> +
> +     preempt_fold_need_resched();
> +     preempt_enable();
> +}
> +EXPORT_SYMBOL_GPL(play_idle);

> @@ -299,5 +313,7 @@ void cpu_startup_entry(enum cpuhp_state state)
>  #endif
>       arch_cpu_idle_prepare();
>       cpuhp_online_idle(state);
> -     cpu_idle_loop();
> +     while (1)
> +             do_idle();
> +
>  }

Reply via email to