On Mon, May 29, 2017 at 05:03:01PM -0400, Nicolas Pitre wrote: > On most small systems where user space is tightly controlled, the realtime > scheduling class can often be dispensed with to reduce the kernel footprint. > Let's make it configurable. > > Signed-off-by: Nicolas Pitre <n...@linaro.org> > ---
> static inline int rt_prio(int prio) > { > - if (unlikely(prio < MAX_RT_PRIO)) > + if (IS_ENABLED(CONFIG_SCHED_RT) && unlikely(prio < MAX_RT_PRIO)) > return 1; > return 0; > } > #ifdef CONFIG_PREEMPT_NOTIFIERS > INIT_HLIST_HEAD(&p->preempt_notifiers); > @@ -3716,13 +3720,18 @@ void rt_mutex_setprio(struct task_struct *p, struct > task_struct *pi_task) > p->sched_class = &dl_sched_class; > } else > #endif > +#ifdef CONFIG_SCHED_RT > if (rt_prio(prio)) { This ifdef is not necessary since rt_prio is conditioned on CONFIG_SCHED_RT already. > if (oldprio < prio) > queue_flag |= ENQUEUE_HEAD; > p->sched_class = &rt_sched_class; > - } else { > + } else > +#endif > + { > +#ifdef CONFIG_SCHED_RT > if (rt_prio(oldprio)) > p->rt.timeout = 0; > +#endif > p->sched_class = &fair_sched_class; > } > > @@ -3997,6 +4006,23 @@ static int __sched_setscheduler(struct task_struct *p, > > /* May grab non-irq protected spin_locks: */ > BUG_ON(in_interrupt()); > + > + /* > + * When the RT scheduling class is disabled, let's make sure kernel > threads > + * wanting RT still get lowest nice value to give them highest available > + * priority rather than simply returning an error. Obviously we can't > test > + * rt_policy() here as it is always false in that case. > + */ > + if (!IS_ENABLED(CONFIG_SCHED_RT) && !user && > + (policy == SCHED_FIFO || policy == SCHED_RR)) { > + static const struct sched_attr k_attr = { > + .sched_policy = SCHED_NORMAL, > + .sched_nice = MIN_NICE, > + }; > + attr = &k_attr; > + policy = SCHED_NORMAL; > + } > + > recheck: > /* Double check policy once rq lock held: */ > if (policy < 0) { > @@ -5726,7 +5752,9 @@ void __init sched_init_smp(void) > sched_init_granularity(); > free_cpumask_var(non_isolated_cpus); > > +#ifdef CONFIG_SCHED_RT > init_sched_rt_class(); > +#endif You can do an empty inline function for !CONFIG_SCHED_RT. > #ifdef CONFIG_SCHED_DL > init_sched_dl_class(); > #endif And here in the earlier patch. > @@ -5832,7 +5860,9 @@ void __init sched_init(void) > } > #endif /* CONFIG_CPUMASK_OFFSTACK */ > > +#ifdef CONFIG_SCHED_RT > init_rt_bandwidth(&def_rt_bandwidth, global_rt_period(), > global_rt_runtime()); > +#endif And so on... Rob