selftests: bpf: don't depend on hardcoded perf sample_freq
authorStanislav Fomichev <sdf@google.com>
Tue, 19 Mar 2019 21:53:24 +0000 (14:53 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 26 Mar 2019 19:47:41 +0000 (12:47 -0700)
When running stacktrace_build_id_nmi, try to query
kernel.perf_event_max_sample_rate sysctl and use it as a sample_freq.
If there was an error reading sysctl, fallback to 5000.

kernel.perf_event_max_sample_rate sysctl can drift and/or can be
adjusted by the perf tool, so assuming a fixed number might be
problematic on a long running machine.

Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c

index 8a114bb..1c1a2f7 100644 (file)
@@ -1,13 +1,25 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <test_progs.h>
 
+static __u64 read_perf_max_sample_freq(void)
+{
+       __u64 sample_freq = 5000; /* fallback to 5000 on error */
+       FILE *f;
+
+       f = fopen("/proc/sys/kernel/perf_event_max_sample_rate", "r");
+       if (f == NULL)
+               return sample_freq;
+       fscanf(f, "%llu", &sample_freq);
+       fclose(f);
+       return sample_freq;
+}
+
 void test_stacktrace_build_id_nmi(void)
 {
        int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
        const char *file = "./test_stacktrace_build_id.o";
        int err, pmu_fd, prog_fd;
        struct perf_event_attr attr = {
-               .sample_freq = 5000,
                .freq = 1,
                .type = PERF_TYPE_HARDWARE,
                .config = PERF_COUNT_HW_CPU_CYCLES,
@@ -20,6 +32,8 @@ void test_stacktrace_build_id_nmi(void)
        int build_id_matches = 0;
        int retry = 1;
 
+       attr.sample_freq = read_perf_max_sample_freq();
+
 retry:
        err = bpf_prog_load(file, BPF_PROG_TYPE_PERF_EVENT, &obj, &prog_fd);
        if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))