| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Sat, 8 Feb 2020 20:48:29 +0100 |
| Subject: [PATCH] sched/rt: Provide migrate_disable/enable() inlines |
| |
| 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> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| 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> |
| Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Link: https://lore.kernel.org/r/878slclv1u.fsf@nanos.tec.linutronix.de |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.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 outermost invocation |
| + * reenables migration. |
| + * |
| + * Currently mapped to preempt_enable(). |
| + */ |
| +static __always_inline void migrate_enable(void) |
| +{ |
| + preempt_enable(); |
| +} |
| + |
| #endif /* __LINUX_PREEMPT_H */ |