Home Home > GIT Browse > SLE15-SP1
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Tesarik <ptesarik@suse.cz>2019-07-19 17:10:24 +0200
committerPetr Tesarik <ptesarik@suse.cz>2019-07-19 22:44:47 +0200
commit0c4f10aff8671b543846edf13af9ea2e50fdf076 (patch)
tree42c5448983f60b952ce9995323bb0523a333dcc3
parent40f940a7bcb59fd35dc31db0f43451ae6cfb722e (diff)
s390/cpum_cf: introduce kernel_cpumcf_alert() to obtain
measurement alerts (jsc#SLE-6904 FATE#327581). suse-commit: 5e96096761f92189aa229a15adae0c8ebe24f58c
-rw-r--r--arch/s390/include/asm/cpu_mcf.h2
-rw-r--r--arch/s390/kernel/perf_cpum_cf.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/arch/s390/include/asm/cpu_mcf.h b/arch/s390/include/asm/cpu_mcf.h
index 82e0b80f2c81..2cd4f09ee268 100644
--- a/arch/s390/include/asm/cpu_mcf.h
+++ b/arch/s390/include/asm/cpu_mcf.h
@@ -52,6 +52,7 @@ static inline void ctr_set_stop(u64 *state, int ctr_set)
struct cpu_cf_events {
struct cpumf_ctr_info info;
atomic_t ctr_set[CPUMF_CTR_SET_MAX];
+ atomic64_t alert;
u64 state, tx_state;
unsigned int flags;
unsigned int txn_flags;
@@ -59,6 +60,7 @@ struct cpu_cf_events {
DECLARE_PER_CPU(struct cpu_cf_events, cpu_cf_events);
int __kernel_cpumcf_begin(void);
+unsigned long kernel_cpumcf_alert(int clear);
void __kernel_cpumcf_end(void);
#endif /* _ASM_S390_CPU_MCF_H */
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c
index 4fe18bf75a97..75571ce49bb1 100644
--- a/arch/s390/kernel/perf_cpum_cf.c
+++ b/arch/s390/kernel/perf_cpum_cf.c
@@ -30,6 +30,7 @@ DEFINE_PER_CPU(struct cpu_cf_events, cpu_cf_events) = {
[CPUMF_CTR_SET_EXT] = ATOMIC_INIT(0),
[CPUMF_CTR_SET_MT_DIAG] = ATOMIC_INIT(0),
},
+ .alert = ATOMIC64_INIT(0),
.state = 0,
.flags = 0,
.txn_flags = 0,
@@ -208,6 +209,9 @@ static void cpumf_measurement_alert(struct ext_code ext_code,
if (alert & CPU_MF_INT_CF_MTDA)
pr_warn("CPU[%i] MT counter data was lost\n",
smp_processor_id());
+
+ /* store alert for special handling by in-kernel users */
+ atomic64_or(alert, &cpuhw->alert);
}
#define PMC_INIT 0
@@ -258,6 +262,20 @@ int __kernel_cpumcf_begin(void)
}
EXPORT_SYMBOL(__kernel_cpumcf_begin);
+/* Obtain the CPU-measurement alerts for the counter facility */
+unsigned long kernel_cpumcf_alert(int clear)
+{
+ struct cpu_cf_events *cpuhw = this_cpu_ptr(&cpu_cf_events);
+ unsigned long alert;
+
+ alert = atomic64_read(&cpuhw->alert);
+ if (clear)
+ atomic64_set(&cpuhw->alert, 0);
+
+ return alert;
+}
+EXPORT_SYMBOL(kernel_cpumcf_alert);
+
/* Release the CPU-measurement counter facility */
void __kernel_cpumcf_end(void)
{