Skip to content

Commit

Permalink
selftests/bpf: Use read_perf_max_sample_freq() in perf_event_stackmap
Browse files Browse the repository at this point in the history
[ Upstream commit de6d014 ]

Currently, perf_event sample period in perf_event_stackmap is set too low
that the test fails randomly. Fix this by using the max sample frequency,
from read_perf_max_sample_freq().

Move read_perf_max_sample_freq() to testing_helpers.c. Replace the CHECK()
with if-printf, as CHECK is not available in testing_helpers.c.

Fixes: 1da4864 ("selftests/bpf: Add callchain_stackid")
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20230412210423.900851-2-song@kernel.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
liu-song-6 authored and gregkh committed May 11, 2023
1 parent e870bcf commit c7bc957
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
3 changes: 2 additions & 1 deletion tools/testing/selftests/bpf/prog_tests/perf_event_stackmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ void test_perf_event_stackmap(void)
PERF_SAMPLE_BRANCH_NO_FLAGS |
PERF_SAMPLE_BRANCH_NO_CYCLES |
PERF_SAMPLE_BRANCH_CALL_STACK,
.sample_period = 5000,
.freq = 1,
.sample_freq = read_perf_max_sample_freq(),
.size = sizeof(struct perf_event_attr),
};
struct perf_event_stackmap *skel;
Expand Down
15 changes: 0 additions & 15 deletions tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,6 @@
#include <test_progs.h>
#include "test_stacktrace_build_id.skel.h"

static __u64 read_perf_max_sample_freq(void)
{
__u64 sample_freq = 5000; /* fallback to 5000 on error */
FILE *f;
__u32 duration = 0;

f = fopen("/proc/sys/kernel/perf_event_max_sample_rate", "r");
if (f == NULL)
return sample_freq;
CHECK(fscanf(f, "%llu", &sample_freq) != 1, "Get max sample rate",
"return default value: 5000,err %d\n", -errno);
fclose(f);
return sample_freq;
}

void test_stacktrace_build_id_nmi(void)
{
int control_map_fd, stackid_hmap_fd, stackmap_fd;
Expand Down
20 changes: 20 additions & 0 deletions tools/testing/selftests/bpf/testing_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,3 +229,23 @@ int bpf_test_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,

return bpf_prog_load(type, NULL, license, insns, insns_cnt, &opts);
}

__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) {
printf("Failed to open /proc/sys/kernel/perf_event_max_sample_rate: err %d\n"
"return default value: 5000\n", -errno);
return sample_freq;
}
if (fscanf(f, "%llu", &sample_freq) != 1) {
printf("Failed to parse /proc/sys/kernel/perf_event_max_sample_rate: err %d\n"
"return default value: 5000\n", -errno);
}

fclose(f);
return sample_freq;
}
2 changes: 2 additions & 0 deletions tools/testing/selftests/bpf/testing_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ struct test_filter_set;
int parse_test_list(const char *s,
struct test_filter_set *test_set,
bool is_glob_pattern);

__u64 read_perf_max_sample_freq(void);

0 comments on commit c7bc957

Please sign in to comment.