1 // SPDX-License-Identifier: GPL-2.0 2 #include <stdio.h> 3 #include "api/fs/fs.h" 4 #include "util/pmu.h" 5 #include "util/topdown.h" 6 7 /* 8 * Check whether we can use a group for top down. 9 * Without a group may get bad results due to multiplexing. 10 */ 11 bool arch_topdown_check_group(bool *warn) 12 { 13 int n; 14 15 if (sysctl__read_int("kernel/nmi_watchdog", &n) < 0) 16 return false; 17 if (n > 0) { 18 *warn = true; 19 return false; 20 } 21 return true; 22 } 23 24 void arch_topdown_group_warn(void) 25 { 26 fprintf(stderr, 27 "nmi_watchdog enabled with topdown. May give wrong results.\n" 28 "Disable with echo 0 > /proc/sys/kernel/nmi_watchdog\n"); 29 } 30 31 #define TOPDOWN_SLOTS 0x0400 32 33 static bool is_topdown_slots_event(struct evsel *counter) 34 { 35 if (!counter->pmu_name) 36 return false; 37 38 if (strcmp(counter->pmu_name, "cpu")) 39 return false; 40 41 if (counter->core.attr.config == TOPDOWN_SLOTS) 42 return true; 43 44 return false; 45 } 46 47 /* 48 * Check whether a topdown group supports sample-read. 49 * 50 * Only Topdown metic supports sample-read. The slots 51 * event must be the leader of the topdown group. 52 */ 53 54 bool arch_topdown_sample_read(struct evsel *leader) 55 { 56 if (!pmu_have_event("cpu", "slots")) 57 return false; 58 59 if (is_topdown_slots_event(leader)) 60 return true; 61 62 return false; 63 } 64