diff options
Diffstat (limited to 'debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch')
-rw-r--r-- | debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch b/debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch index ebf2e4db0..580b25b95 100644 --- a/debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch +++ b/debian/patches-rt/kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch @@ -2,19 +2,21 @@ From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Date: Mon, 21 Nov 2016 19:31:08 +0100 Subject: [PATCH] kernel/sched: move stack + kprobe clean up to __put_task_struct() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.2/older/patches-5.2.17-rt9.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patches-5.4.3-rt1.tar.xz There is no need to free the stack before the task struct (except for reasons mentioned in commit 68f24b08ee89 ("sched/core: Free the stack early if CONFIG_THREAD_INFO_IN_TASK")). This also comes handy on -RT because we can't free memory in preempt disabled region. +vfree_atomic() delays the memory cleanup to a worker. Since we move everything +to the RCU callback, we can also free it immediately. Cc: stable-rt@vger.kernel.org #for kprobe_flush_task() Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- - kernel/fork.c | 10 ++++++++++ + kernel/fork.c | 12 +++++++++++- kernel/sched/core.c | 9 --------- - 2 files changed, 10 insertions(+), 9 deletions(-) + 2 files changed, 11 insertions(+), 10 deletions(-) --- a/kernel/fork.c +++ b/kernel/fork.c @@ -26,7 +28,16 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> #include <linux/vmacache.h> #include <linux/nsproxy.h> #include <linux/capability.h> -@@ -742,6 +743,15 @@ void __put_task_struct(struct task_struc +@@ -289,7 +290,7 @@ static inline void free_thread_stack(str + return; + } + +- vfree_atomic(tsk->stack); ++ vfree(tsk->stack); + return; + } + #endif +@@ -750,6 +751,15 @@ void __put_task_struct(struct task_struc WARN_ON(refcount_read(&tsk->usage)); WARN_ON(tsk == current); @@ -44,7 +55,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> security_task_free(tsk); --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -2721,15 +2721,6 @@ static struct rq *finish_task_switch(str +@@ -3253,15 +3253,6 @@ static struct rq *finish_task_switch(str if (prev->sched_class->task_dead) prev->sched_class->task_dead(prev); @@ -57,6 +68,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> - /* Task is done with its stack. */ - put_task_stack(prev); - - put_task_struct(prev); + put_task_struct_rcu_user(prev); } |