lkml.org 
[lkml]   [2019]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 72/83] selftests/bpf: retry tests that expect build-id
    Date
    From: Stanislav Fomichev <sdf@google.com>

    [ Upstream commit f67ad87ab3120e82845521b18a2b99273a340308 ]

    While running test_progs in a loop I found out that I'm sometimes hitting
    "Didn't find expected build ID from the map" error.

    Looking at stack_map_get_build_id_offset() it seems that it is racy (by
    design) and can sometimes return BPF_STACK_BUILD_ID_IP (i.e. can't trylock
    current->mm->mmap_sem).

    Let's retry this test a single time.

    Fixes: 13790d1cc72c ("bpf: add selftest for stackmap with build_id in NMI context")
    Acked-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Stanislav Fomichev <sdf@google.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/testing/selftests/bpf/test_progs.c | 30 ++++++++++++++++++++++++
    1 file changed, 30 insertions(+)

    diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
    index 0ef68204c84b..c94c7b6da53b 100644
    --- a/tools/testing/selftests/bpf/test_progs.c
    +++ b/tools/testing/selftests/bpf/test_progs.c
    @@ -1136,7 +1136,9 @@ static void test_stacktrace_build_id(void)
    int i, j;
    struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH];
    int build_id_matches = 0;
    + int retry = 1;

    +retry:
    err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
    if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
    goto out;
    @@ -1249,6 +1251,19 @@ static void test_stacktrace_build_id(void)
    previous_key = key;
    } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0);

    + /* stack_map_get_build_id_offset() is racy and sometimes can return
    + * BPF_STACK_BUILD_ID_IP instead of BPF_STACK_BUILD_ID_VALID;
    + * try it one more time.
    + */
    + if (build_id_matches < 1 && retry--) {
    + ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE);
    + close(pmu_fd);
    + bpf_object__close(obj);
    + printf("%s:WARN:Didn't find expected build ID from the map, retrying\n",
    + __func__);
    + goto retry;
    + }
    +
    if (CHECK(build_id_matches < 1, "build id match",
    "Didn't find expected build ID from the map\n"))
    goto disable_pmu;
    @@ -1289,7 +1304,9 @@ static void test_stacktrace_build_id_nmi(void)
    int i, j;
    struct bpf_stack_build_id id_offs[PERF_MAX_STACK_DEPTH];
    int build_id_matches = 0;
    + int retry = 1;

    +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))
    return;
    @@ -1384,6 +1401,19 @@ static void test_stacktrace_build_id_nmi(void)
    previous_key = key;
    } while (bpf_map_get_next_key(stackmap_fd, &previous_key, &key) == 0);

    + /* stack_map_get_build_id_offset() is racy and sometimes can return
    + * BPF_STACK_BUILD_ID_IP instead of BPF_STACK_BUILD_ID_VALID;
    + * try it one more time.
    + */
    + if (build_id_matches < 1 && retry--) {
    + ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE);
    + close(pmu_fd);
    + bpf_object__close(obj);
    + printf("%s:WARN:Didn't find expected build ID from the map, retrying\n",
    + __func__);
    + goto retry;
    + }
    +
    if (CHECK(build_id_matches < 1, "build id match",
    "Didn't find expected build ID from the map\n"))
    goto disable_pmu;
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-02-13 03:40    [W:4.823 / U:0.548 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site