| // SPDX-License-Identifier: GPL-2.0 | |
| #include <stdio.h> | |
| #include "api/fs/fs.h" | |
| #include "util/pmu.h" | |
| #include "util/topdown.h" | |
| /* | |
| * Check whether we can use a group for top down. | |
| * Without a group may get bad results due to multiplexing. | |
| */ | |
| bool arch_topdown_check_group(bool *warn) | |
| { | |
| int n; | |
| if (sysctl__read_int("kernel/nmi_watchdog", &n) < 0) | |
| return false; | |
| if (n > 0) { | |
| *warn = true; | |
| return false; | |
| } | |
| return true; | |
| } | |
| void arch_topdown_group_warn(void) | |
| { | |
| fprintf(stderr, | |
| "nmi_watchdog enabled with topdown. May give wrong results.\n" | |
| "Disable with echo 0 > /proc/sys/kernel/nmi_watchdog\n"); | |
| } | |
| #define TOPDOWN_SLOTS 0x0400 | |
| static bool is_topdown_slots_event(struct evsel *counter) | |
| { | |
| if (!counter->pmu_name) | |
| return false; | |
| if (strcmp(counter->pmu_name, "cpu")) | |
| return false; | |
| if (counter->core.attr.config == TOPDOWN_SLOTS) | |
| return true; | |
| return false; | |
| } | |
| /* | |
| * Check whether a topdown group supports sample-read. | |
| * | |
| * Only Topdown metic supports sample-read. The slots | |
| * event must be the leader of the topdown group. | |
| */ | |
| bool arch_topdown_sample_read(struct evsel *leader) | |
| { | |
| if (!pmu_have_event("cpu", "slots")) | |
| return false; | |
| if (is_topdown_slots_event(leader)) | |
| return true; | |
| return false; | |
| } |