70 lines
2.0 KiB
Diff
70 lines
2.0 KiB
Diff
|
From 2d943875e1fd29480d99b4007089fb1f27bd2efd Mon Sep 17 00:00:00 2001
|
||
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||
|
Date: Mon, 21 Nov 2016 19:31:08 +0100
|
||
|
Subject: [PATCH 131/365] kernel/sched: move stack + kprobe clean up to
|
||
|
__put_task_struct()
|
||
|
|
||
|
There is no need to free the stack before the task struct. This also
|
||
|
comes handy on -RT because we can't free memory in preempt disabled
|
||
|
region.
|
||
|
|
||
|
Change-Id: I4f88886185df9a5f689d0d1c8f3eb25e7d93925e
|
||
|
Cc: stable-rt@vger.kernel.org #for kprobe_flush_task()
|
||
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||
|
---
|
||
|
kernel/fork.c | 10 ++++++++++
|
||
|
kernel/sched/core.c | 9 ---------
|
||
|
2 files changed, 10 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/kernel/fork.c b/kernel/fork.c
|
||
|
index f1442b675bc4..beb07138c728 100644
|
||
|
--- a/kernel/fork.c
|
||
|
+++ b/kernel/fork.c
|
||
|
@@ -80,6 +80,7 @@
|
||
|
#include <linux/kcov.h>
|
||
|
#include <linux/tegra_profiler.h>
|
||
|
#include <linux/cpufreq_times.h>
|
||
|
+#include <linux/kprobes.h>
|
||
|
|
||
|
#include <asm/pgtable.h>
|
||
|
#include <asm/pgalloc.h>
|
||
|
@@ -395,6 +396,15 @@ void __put_task_struct(struct task_struct *tsk)
|
||
|
WARN_ON(atomic_read(&tsk->usage));
|
||
|
WARN_ON(tsk == current);
|
||
|
|
||
|
+ /*
|
||
|
+ * Remove function-return probe instances associated with this
|
||
|
+ * task and put them back on the free list.
|
||
|
+ */
|
||
|
+ kprobe_flush_task(tsk);
|
||
|
+
|
||
|
+ /* Task is done with its stack. */
|
||
|
+ put_task_stack(tsk);
|
||
|
+
|
||
|
cgroup_free(tsk);
|
||
|
task_numa_free(tsk, true);
|
||
|
security_task_free(tsk);
|
||
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||
|
index 67bcbb324833..c8a950356547 100644
|
||
|
--- a/kernel/sched/core.c
|
||
|
+++ b/kernel/sched/core.c
|
||
|
@@ -2873,15 +2873,6 @@ static struct rq *finish_task_switch(struct task_struct *prev)
|
||
|
if (prev->sched_class->task_dead)
|
||
|
prev->sched_class->task_dead(prev);
|
||
|
|
||
|
- /*
|
||
|
- * Remove function-return probe instances associated with this
|
||
|
- * task and put them back on the free list.
|
||
|
- */
|
||
|
- kprobe_flush_task(prev);
|
||
|
-
|
||
|
- /* Task is done with its stack. */
|
||
|
- put_task_stack(prev);
|
||
|
-
|
||
|
put_task_struct(prev);
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.28.0
|
||
|
|