Commit 8ebf6da9 authored by Philipp Rudo's avatar Philipp Rudo Committed by Vasily Gorbik

s390/ftrace: fix potential crashes when switching tracers

Switching tracers include instruction patching. To prevent that a
instruction is patched while it's read the instruction patching is done
in stop_machine 'context'. This also means that any function called
during stop_machine must not be traced. Thus add 'notrace' to all
functions called within stop_machine.

Fixes: 1ec2772e ("s390/diag: add a statistic for diagnose calls")
Fixes: 38f2c691 ("s390: improve wait logic of stop_machine")
Fixes: 4ecf0a43 ("processor: get rid of cpu_relax_yield")
Signed-off-by: default avatarPhilipp Rudo <prudo@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent ae83d0b4
...@@ -133,7 +133,7 @@ void diag_stat_inc(enum diag_stat_enum nr) ...@@ -133,7 +133,7 @@ void diag_stat_inc(enum diag_stat_enum nr)
} }
EXPORT_SYMBOL(diag_stat_inc); EXPORT_SYMBOL(diag_stat_inc);
void diag_stat_inc_norecursion(enum diag_stat_enum nr) void notrace diag_stat_inc_norecursion(enum diag_stat_enum nr)
{ {
this_cpu_inc(diag_stat.counter[nr]); this_cpu_inc(diag_stat.counter[nr]);
trace_s390_diagnose_norecursion(diag_map[nr].code); trace_s390_diagnose_norecursion(diag_map[nr].code);
......
...@@ -403,7 +403,7 @@ int smp_find_processor_id(u16 address) ...@@ -403,7 +403,7 @@ int smp_find_processor_id(u16 address)
return -1; return -1;
} }
bool arch_vcpu_is_preempted(int cpu) bool notrace arch_vcpu_is_preempted(int cpu)
{ {
if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu)) if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu))
return false; return false;
...@@ -413,7 +413,7 @@ bool arch_vcpu_is_preempted(int cpu) ...@@ -413,7 +413,7 @@ bool arch_vcpu_is_preempted(int cpu)
} }
EXPORT_SYMBOL(arch_vcpu_is_preempted); EXPORT_SYMBOL(arch_vcpu_is_preempted);
void smp_yield_cpu(int cpu) void notrace smp_yield_cpu(int cpu)
{ {
if (!MACHINE_HAS_DIAG9C) if (!MACHINE_HAS_DIAG9C)
return; return;
......
...@@ -14,7 +14,7 @@ EXPORT_TRACEPOINT_SYMBOL(s390_diagnose); ...@@ -14,7 +14,7 @@ EXPORT_TRACEPOINT_SYMBOL(s390_diagnose);
static DEFINE_PER_CPU(unsigned int, diagnose_trace_depth); static DEFINE_PER_CPU(unsigned int, diagnose_trace_depth);
void trace_s390_diagnose_norecursion(int diag_nr) void notrace trace_s390_diagnose_norecursion(int diag_nr)
{ {
unsigned long flags; unsigned long flags;
unsigned int *depth; unsigned int *depth;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment