File turbostat-Dont-exist-if-perf-is-unavailable.patch of Package cpupower.27834
From 3dcf39af8e10eb70565f7b6f6b155e271a22df10 Mon Sep 17 00:00:00 2001
From: Ali Abdallah <ali.abdallah@suse.com>
Date: Tue, 30 Aug 2022 13:24:42 +0200
Subject: [PATCH] Don't exist if perf is not available
---
turbostat.c | 85 ++++++++++++++++++++++++++++-------------------------
1 file changed, 45 insertions(+), 40 deletions(-)
diff --git a/turbostat.c b/turbostat.c
index 47d3ba8..ec59d2b 100644
--- a/turbostat.c
+++ b/turbostat.c
@@ -510,46 +510,6 @@ static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu
return syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
}
-static int perf_instr_count_open(int cpu_num)
-{
- struct perf_event_attr pea;
- int fd;
-
- memset(&pea, 0, sizeof(struct perf_event_attr));
- pea.type = PERF_TYPE_HARDWARE;
- pea.size = sizeof(struct perf_event_attr);
- pea.config = PERF_COUNT_HW_INSTRUCTIONS;
-
- /* counter for cpu_num, including user + kernel and all processes */
- fd = perf_event_open(&pea, -1, cpu_num, -1, 0);
- if (fd == -1)
- err(-1, "cpu%d: perf instruction counter\n", cpu_num);
-
- return fd;
-}
-
-int get_instr_count_fd(int cpu)
-{
- if (fd_instr_count_percpu[cpu])
- return fd_instr_count_percpu[cpu];
-
- fd_instr_count_percpu[cpu] = perf_instr_count_open(cpu);
-
- return fd_instr_count_percpu[cpu];
-}
-
-int get_msr(int cpu, off_t offset, unsigned long long *msr)
-{
- ssize_t retval;
-
- retval = pread(get_msr_fd(cpu), msr, sizeof(*msr), offset);
-
- if (retval != sizeof *msr)
- err(-1, "cpu%d: msr offset 0x%llx read failed", cpu, (unsigned long long)offset);
-
- return 0;
-}
-
/*
* This list matches the column headers, except
* 1. built-in only, the sysfs counters are not here -- we learn of those at run-time
@@ -689,6 +649,48 @@ unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_sysfs | BIC_APIC | BIC
char *deferred_skip_names[MAX_DEFERRED];
int deferred_skip_index;
+static int perf_instr_count_open(int cpu_num)
+{
+ struct perf_event_attr pea;
+ int fd;
+
+ memset(&pea, 0, sizeof(struct perf_event_attr));
+ pea.type = PERF_TYPE_HARDWARE;
+ pea.size = sizeof(struct perf_event_attr);
+ pea.config = PERF_COUNT_HW_INSTRUCTIONS;
+
+ /* counter for cpu_num, including user + kernel and all processes */
+ fd = perf_event_open(&pea, -1, cpu_num, -1, 0);
+ if (fd == -1) {
+ warn("cpu%d: perf instruction counter", cpu_num);
+ BIC_NOT_PRESENT(BIC_IPC);
+ }
+
+ return fd;
+}
+
+int get_instr_count_fd(int cpu)
+{
+ if (fd_instr_count_percpu[cpu])
+ return fd_instr_count_percpu[cpu];
+
+ fd_instr_count_percpu[cpu] = perf_instr_count_open(cpu);
+
+ return fd_instr_count_percpu[cpu];
+}
+
+int get_msr(int cpu, off_t offset, unsigned long long *msr)
+{
+ ssize_t retval;
+
+ retval = pread(get_msr_fd(cpu), msr, sizeof(*msr), offset);
+
+ if (retval != sizeof *msr)
+ err(-1, "cpu%d: msr offset 0x%llx read failed", cpu, (unsigned long long)offset);
+
+ return 0;
+}
+
/*
* HIDE_LIST - hide this list of counters, show the rest [default]
* SHOW_LIST - show this list of counters, hide the rest
@@ -5896,6 +5898,9 @@ void turbostat_init()
if (!quiet && do_irtl_snb)
print_irtl();
+
+ if (DO_BIC(BIC_IPC))
+ (void)get_instr_count_fd(base_cpu);
}
int fork_it(char **argv)
--
2.35.3