perf util: Factor out sysctl__nmi_watchdog_enabled()
authorKan Liang <kan.liang@linux.intel.com>
Mon, 24 Feb 2020 21:59:22 +0000 (13:59 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 10 Mar 2020 17:46:19 +0000 (14:46 -0300)
The NMI watchdog status is required for metric group constraint
examination.  Factor out sysctl__nmi_watchdog_enabled() to retrieve the
NMI watchdog status.

Users may count more than one metric group each time. If so, the NMI
watchdog status may be retrieved several times. To reduce the overhead,
cache the NMI watchdog status.

Replace the NMI watchdog status checking in print_footer() by
sysctl__nmi_watchdog_enabled().

Suggested-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Link: http://lore.kernel.org/lkml/1582581564-184429-4-git-send-email-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/stat-display.c
tools/perf/util/util.c
tools/perf/util/util.h

index d89cb0da90f879fd08856fcaabbae1417e60ddcc..76c6052b12e27e745498597a7b26af5e1d45d7b1 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/ctype.h>
 #include "cgroup.h"
 #include <api/fs/fs.h>
+#include "util.h"
 
 #define CNTR_NOT_SUPPORTED     "<not supported>"
 #define CNTR_NOT_COUNTED       "<not counted>"
@@ -1097,7 +1098,6 @@ static void print_footer(struct perf_stat_config *config)
 {
        double avg = avg_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC;
        FILE *output = config->output;
-       int n;
 
        if (!config->null_run)
                fprintf(output, "\n");
@@ -1131,9 +1131,7 @@ static void print_footer(struct perf_stat_config *config)
        }
        fprintf(output, "\n\n");
 
-       if (config->print_free_counters_hint &&
-           sysctl__read_int("kernel/nmi_watchdog", &n) >= 0 &&
-           n > 0)
+       if (config->print_free_counters_hint && sysctl__nmi_watchdog_enabled())
                fprintf(output,
 "Some events weren't counted. Try disabling the NMI watchdog:\n"
 "      echo 0 > /proc/sys/kernel/nmi_watchdog\n"
index 969ae560dad984f1b873caaef05eda351e758a71..d707c9624dd973534924ced6103f4cdcdaa6cc0f 100644 (file)
@@ -55,6 +55,24 @@ int sysctl__max_stack(void)
        return sysctl_perf_event_max_stack;
 }
 
+bool sysctl__nmi_watchdog_enabled(void)
+{
+       static bool cached;
+       static bool nmi_watchdog;
+       int value;
+
+       if (cached)
+               return nmi_watchdog;
+
+       if (sysctl__read_int("kernel/nmi_watchdog", &value) < 0)
+               return false;
+
+       nmi_watchdog = (value > 0) ? true : false;
+       cached = true;
+
+       return nmi_watchdog;
+}
+
 bool test_attr__enabled;
 
 bool perf_host  = true;
index 9969b8b46f7c37756219db848f182136a59265a7..f486fdd3a538fb76d0060e0928f62f3634e4dcde 100644 (file)
@@ -29,6 +29,8 @@ size_t hex_width(u64 v);
 
 int sysctl__max_stack(void);
 
+bool sysctl__nmi_watchdog_enabled(void);
+
 int fetch_kernel_version(unsigned int *puint,
                         char *str, size_t str_sz);
 #define KVER_VERSION(x)                (((x) >> 16) & 0xff)