summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch')
-rw-r--r--debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch46
1 files changed, 46 insertions, 0 deletions
diff --git a/debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch b/debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch
new file mode 100644
index 000000000..f59c122c0
--- /dev/null
+++ b/debian/patches-rt/0299-sched-Fix-get_push_task-vs-migrate_disable.patch
@@ -0,0 +1,46 @@
+From 93c4258bc009109bee258c30fa2a53680c8b1f9a Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Thu, 26 Aug 2021 15:37:38 +0200
+Subject: [PATCH 299/323] sched: Fix get_push_task() vs migrate_disable()
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz
+
+push_rt_task() attempts to move the currently running task away if the
+next runnable task has migration disabled and therefore is pinned on the
+current CPU.
+
+The current task is retrieved via get_push_task() which only checks for
+nr_cpus_allowed == 1, but does not check whether the task has migration
+disabled and therefore cannot be moved either. The consequence is a
+pointless invocation of the migration thread which correctly observes
+that the task cannot be moved.
+
+Return NULL if the task has migration disabled and cannot be moved to
+another CPU.
+
+Cc: stable-rt@vger.kernel.org
+Fixes: a7c81556ec4d3 ("sched: Fix migrate_disable() vs rt/dl balancing")
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lkml.kernel.org/r/20210826133738.yiotqbtdaxzjsnfj@linutronix.de
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+---
+ kernel/sched/sched.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
+index ad854a670701..bda12827832e 100644
+--- a/kernel/sched/sched.h
++++ b/kernel/sched/sched.h
+@@ -1949,6 +1949,9 @@ static inline struct task_struct *get_push_task(struct rq *rq)
+ if (p->nr_cpus_allowed == 1)
+ return NULL;
+
++ if (p->migration_disabled)
++ return NULL;
++
+ rq->push_busy = true;
+ return get_task_struct(p);
+ }
+--
+2.43.0
+