--- /dev/null
+From 8d9047f8b967ce6181fd824ae922978e1b055cc0 Mon Sep 17 00:00:00 2001
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+Date: Mon, 11 Sep 2017 11:24:22 +0200
+Subject: s390/runtime instrumentation: simplify task exit handling
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+commit 8d9047f8b967ce6181fd824ae922978e1b055cc0 upstream.
+
+Free data structures required for runtime instrumentation from
+arch_release_task_struct(). This allows to simplify the code a bit,
+and also makes the semantics a bit easier: arch_release_task_struct()
+is never called from the task that is being removed.
+
+In addition this allows to get rid of exit_thread() in a later patch.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ arch/s390/include/asm/runtime_instr.h | 4 +++-
+ arch/s390/kernel/process.c | 2 +-
+ arch/s390/kernel/runtime_instr.c | 30 +++++++++++++++---------------
+ 3 files changed, 19 insertions(+), 17 deletions(-)
+
+--- a/arch/s390/include/asm/runtime_instr.h
++++ b/arch/s390/include/asm/runtime_instr.h
+@@ -85,6 +85,8 @@ static inline void restore_ri_cb(struct
+ load_runtime_instr_cb(&runtime_instr_empty_cb);
+ }
+
+-void exit_thread_runtime_instr(void);
++struct task_struct;
++
++void runtime_instr_release(struct task_struct *tsk);
+
+ #endif /* _RUNTIME_INSTR_H */
+--- a/arch/s390/kernel/process.c
++++ b/arch/s390/kernel/process.c
+@@ -72,7 +72,6 @@ extern void kernel_thread_starter(void);
+ */
+ void exit_thread(void)
+ {
+- exit_thread_runtime_instr();
+ }
+
+ void flush_thread(void)
+@@ -87,6 +86,7 @@ void arch_release_task_struct(struct tas
+ {
+ /* Free either the floating-point or the vector register save area */
+ kfree(tsk->thread.fpu.regs);
++ runtime_instr_release(tsk);
+ }
+
+ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
+--- a/arch/s390/kernel/runtime_instr.c
++++ b/arch/s390/kernel/runtime_instr.c
+@@ -18,11 +18,24 @@
+ /* empty control block to disable RI by loading it */
+ struct runtime_instr_cb runtime_instr_empty_cb;
+
++void runtime_instr_release(struct task_struct *tsk)
++{
++ kfree(tsk->thread.ri_cb);
++}
++
+ static void disable_runtime_instr(void)
+ {
+- struct pt_regs *regs = task_pt_regs(current);
++ struct task_struct *task = current;
++ struct pt_regs *regs;
+
++ if (!task->thread.ri_cb)
++ return;
++ regs = task_pt_regs(task);
++ preempt_disable();
+ load_runtime_instr_cb(&runtime_instr_empty_cb);
++ kfree(task->thread.ri_cb);
++ task->thread.ri_cb = NULL;
++ preempt_enable();
+
+ /*
+ * Make sure the RI bit is deleted from the PSW. If the user did not
+@@ -43,19 +56,6 @@ static void init_runtime_instr_cb(struct
+ cb->valid = 1;
+ }
+
+-void exit_thread_runtime_instr(void)
+-{
+- struct task_struct *task = current;
+-
+- preempt_disable();
+- if (!task->thread.ri_cb)
+- return;
+- disable_runtime_instr();
+- kfree(task->thread.ri_cb);
+- task->thread.ri_cb = NULL;
+- preempt_enable();
+-}
+-
+ SYSCALL_DEFINE1(s390_runtime_instr, int, command)
+ {
+ struct runtime_instr_cb *cb;
+@@ -64,7 +64,7 @@ SYSCALL_DEFINE1(s390_runtime_instr, int,
+ return -EOPNOTSUPP;
+
+ if (command == S390_RUNTIME_INSTR_STOP) {
+- exit_thread_runtime_instr();
++ disable_runtime_instr();
+ return 0;
+ }
+