diff options
-rw-r--r-- | tools/testing/selftests/bpf/test_progs.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 126fc624290d..25f0083a9b2e 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c | |||
@@ -1188,7 +1188,9 @@ static void test_stacktrace_build_id(void) | |||
1188 | int i, j; | 1188 | int i, j; |
1189 | struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; | 1189 | struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; |
1190 | int build_id_matches = 0; | 1190 | int build_id_matches = 0; |
1191 | int retry = 1; | ||
1191 | 1192 | ||
1193 | retry: | ||
1192 | err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd); | 1194 | err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd); |
1193 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) | 1195 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) |
1194 | goto out; | 1196 | goto out; |
@@ -1301,6 +1303,19 @@ static void test_stacktrace_build_id(void) | |||
1301 | previous_key = key; | 1303 | previous_key = key; |
1302 | } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0); | 1304 | } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0); |
1303 | 1305 | ||
1306 | /* stack_map_get_build_id_offset() is racy and sometimes can return | ||
1307 | * BPF_STACK_BUILD_ID_IP instead of BPF_STACK_BUILD_ID_VALID; | ||
1308 | * try it one more time. | ||
1309 | */ | ||
1310 | if (build_id_matches < 1 && retry--) { | ||
1311 | ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE); | ||
1312 | close(pmu_fd); | ||
1313 | bpf_object__close(obj); | ||
1314 | printf("%s:WARN:Didn't find expected build ID from the map, retrying\n", | ||
1315 | __func__); | ||
1316 | goto retry; | ||
1317 | } | ||
1318 | |||
1304 | if (CHECK(build_id_matches < 1, "build id match", | 1319 | if (CHECK(build_id_matches < 1, "build id match", |
1305 | "Didn't find expected build ID from the map\n")) | 1320 | "Didn't find expected build ID from the map\n")) |
1306 | goto disable_pmu; | 1321 | goto disable_pmu; |
@@ -1341,7 +1356,9 @@ static void test_stacktrace_build_id_nmi(void) | |||
1341 | int i, j; | 1356 | int i, j; |
1342 | struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; | 1357 | struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH]; |
1343 | int build_id_matches = 0; | 1358 | int build_id_matches = 0; |
1359 | int retry = 1; | ||
1344 | 1360 | ||
1361 | retry: | ||
1345 | err = bpf_prog_load(file, BPF_PROG_TYPE_PERF_EVENT, &obj, &prog_fd); | 1362 | err = bpf_prog_load(file, BPF_PROG_TYPE_PERF_EVENT, &obj, &prog_fd); |
1346 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) | 1363 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) |
1347 | return; | 1364 | return; |
@@ -1436,6 +1453,19 @@ static void test_stacktrace_build_id_nmi(void) | |||
1436 | previous_key = key; | 1453 | previous_key = key; |
1437 | } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0); | 1454 | } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0); |
1438 | 1455 | ||
1456 | /* stack_map_get_build_id_offset() is racy and sometimes can return | ||
1457 | * BPF_STACK_BUILD_ID_IP instead of BPF_STACK_BUILD_ID_VALID; | ||
1458 | * try it one more time. | ||
1459 | */ | ||
1460 | if (build_id_matches < 1 && retry--) { | ||
1461 | ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE); | ||
1462 | close(pmu_fd); | ||
1463 | bpf_object__close(obj); | ||
1464 | printf("%s:WARN:Didn't find expected build ID from the map, retrying\n", | ||
1465 | __func__); | ||
1466 | goto retry; | ||
1467 | } | ||
1468 | |||
1439 | if (CHECK(build_id_matches < 1, "build id match", | 1469 | if (CHECK(build_id_matches < 1, "build id match", |
1440 | "Didn't find expected build ID from the map\n")) | 1470 | "Didn't find expected build ID from the map\n")) |
1441 | goto disable_pmu; | 1471 | goto disable_pmu; |