8ebf6da9db
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:1ec2772e0c
("s390/diag: add a statistic for diagnose calls") Fixes:38f2c691a4
("s390: improve wait logic of stop_machine") Fixes:4ecf0a43e7
("processor: get rid of cpu_relax_yield") Signed-off-by: Philipp Rudo <prudo@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
34 lines
715 B
C
34 lines
715 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Tracepoint definitions for s390
|
|
*
|
|
* Copyright IBM Corp. 2015
|
|
* Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
|
|
*/
|
|
|
|
#include <linux/percpu.h>
|
|
#define CREATE_TRACE_POINTS
|
|
#include <asm/trace/diag.h>
|
|
|
|
EXPORT_TRACEPOINT_SYMBOL(s390_diagnose);
|
|
|
|
static DEFINE_PER_CPU(unsigned int, diagnose_trace_depth);
|
|
|
|
void notrace trace_s390_diagnose_norecursion(int diag_nr)
|
|
{
|
|
unsigned long flags;
|
|
unsigned int *depth;
|
|
|
|
/* Avoid lockdep recursion. */
|
|
if (IS_ENABLED(CONFIG_LOCKDEP))
|
|
return;
|
|
local_irq_save(flags);
|
|
depth = this_cpu_ptr(&diagnose_trace_depth);
|
|
if (*depth == 0) {
|
|
(*depth)++;
|
|
trace_s390_diagnose(diag_nr);
|
|
(*depth)--;
|
|
}
|
|
local_irq_restore(flags);
|
|
}
|