Re: sched: Provide migrate_disable/enable() inlines
From: Ingo Molnar
Date: Sun Feb 09 2020 - 14:12:54 EST
* Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote:
> Code which solely needs to prevent migration of a task uses
> preempt_disable()/enable() pairs. This is the only reliable way to do so
> as setting the task affinity to a single CPU can be undone by a
> setaffinity operation from a different task/process.
>
> RT provides a seperate migrate_disable/enable() mechanism which does not
> disable preemption to achieve the semantic requirements of a (almost) fully
> preemptible kernel.
>
> As it is unclear from looking at a given code path whether the intention is
> to disable preemption or migration, introduce migrate_disable/enable()
> inline functions which can be used to annotate code which merely needs to
> disable migration. Map them to preempt_disable/enable() for now. The RT
> substitution will be provided later.
>
> Code which is annotated that way documents that it has no requirement to
> protect against reentrancy of a preempting task. Either this is not
> required at all or the call sites are already serialized by other means.
>
> Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
> Cc: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
> Cc: Dietmar Eggemann <dietmar.eggemann@xxxxxxx>
> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
> Cc: Ben Segall <bsegall@xxxxxxxxxx>
> Cc: Mel Gorman <mgorman@xxxxxxx>
> ---
> include/linux/preempt.h | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> --- a/include/linux/preempt.h
> +++ b/include/linux/preempt.h
> @@ -322,4 +322,34 @@ static inline void preempt_notifier_init
>
> #endif
>
> +/**
> + * migrate_disable - Prevent migration of the current task
> + *
> + * Maps to preempt_disable() which also disables preemption. Use
> + * migrate_disable() to annotate that the intent is to prevent migration
> + * but not necessarily preemption.
> + *
> + * Can be invoked nested like preempt_disable() and needs the corresponding
> + * number of migrate_enable() invocations.
> + */
> +static __always_inline void migrate_disable(void)
> +{
> + preempt_disable();
> +}
> +
> +/**
> + * migrate_enable - Allow migration of the current task
> + *
> + * Counterpart to migrate_disable().
> + *
> + * As migrate_disable() can be invoked nested only the uttermost invocation
> + * reenables migration.
> + *
> + * Currently mapped to preempt_enable().
> + */
> +static __always_inline void migrate_enable(void)
> +{
> + preempt_enable();
> +}
I've applied this with s/uttermost/outermost, which I suspect was the
intention?
Thanks,
Ingo