From 2acc85c857c1422f2f33791512e0ebcfd8ccb5a7 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 205/518] 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.

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 c735c10ecb055..5233898c840a9 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -40,6 +40,7 @@
 #include <linux/hmm.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
+#include <linux/kprobes.h>
 #include <linux/vmacache.h>
 #include <linux/nsproxy.h>
 #include <linux/capability.h>
@@ -411,6 +412,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 37e207ff3a7cb..bb09191f337fb 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2730,15 +2730,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.41.0

