| 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; |
| } |
| |