aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2018-04-20 04:21:21 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-04-23 01:57:17 -0400
commit2317b07d05d2b136eb4dc9609807c9111bda3b2a (patch)
treeb4290d962400d850031b1890568ef00a7f3fe9ab
parent5f3ba878e7a2ffef82fb0882c0dd2c3507d734bc (diff)
s390: update sampling tag after task pid change
In a multi-threaded program any thread can call execve(). If this is not done by the thread group leader, the de_thread() function replaces the pid of the task that calls execve() with the pid of thread group leader. If the task reaches user space again without going over __switch_to() the sampling tag is still set to the old pid. Define the arch_setup_new_exec function to verify the task pid and udpate the tag with LPP if it has changed. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/include/asm/thread_info.h3
-rw-r--r--arch/s390/kernel/process.c10
2 files changed, 13 insertions, 0 deletions
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h
index 83ba57533ce6..3c883c368eb0 100644
--- a/arch/s390/include/asm/thread_info.h
+++ b/arch/s390/include/asm/thread_info.h
@@ -45,6 +45,9 @@ struct thread_info {
45void arch_release_task_struct(struct task_struct *tsk); 45void arch_release_task_struct(struct task_struct *tsk);
46int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); 46int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
47 47
48void arch_setup_new_exec(void);
49#define arch_setup_new_exec arch_setup_new_exec
50
48#endif 51#endif
49 52
50/* 53/*
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index 70576a2f69cf..6e758bb6cd29 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -29,6 +29,7 @@
29#include <linux/random.h> 29#include <linux/random.h>
30#include <linux/export.h> 30#include <linux/export.h>
31#include <linux/init_task.h> 31#include <linux/init_task.h>
32#include <asm/cpu_mf.h>
32#include <asm/io.h> 33#include <asm/io.h>
33#include <asm/processor.h> 34#include <asm/processor.h>
34#include <asm/vtimer.h> 35#include <asm/vtimer.h>
@@ -48,6 +49,15 @@ void flush_thread(void)
48{ 49{
49} 50}
50 51
52void arch_setup_new_exec(void)
53{
54 if (S390_lowcore.current_pid != current->pid) {
55 S390_lowcore.current_pid = current->pid;
56 if (test_facility(40))
57 lpp(&S390_lowcore.lpp);
58 }
59}
60
51void arch_release_task_struct(struct task_struct *tsk) 61void arch_release_task_struct(struct task_struct *tsk)
52{ 62{
53 runtime_instr_release(tsk); 63 runtime_instr_release(tsk);