lkml.org 
[lkml]   [2020]   [Feb]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: sched: Provide migrate_disable/enable() inlines

* Thomas Gleixner <tglx@linutronix.de> 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@linutronix.de>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Vincent Guittot <vincent.guittot@linaro.org>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Ben Segall <bsegall@google.com>
> Cc: Mel Gorman <mgorman@suse.de>
> ---
> 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

\
 
 \ /
  Last update: 2020-02-09 20:08    [W:0.068 / U:2.832 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site