• Song Liu's avatar
    bpf: Fix test_progs -j error with fentry/fexit tests · dc81f8d1
    Song Liu authored
    When multiple threads are attaching/detaching fentry/fexit programs to
    the same trampoline, we may call register_fentry on the same trampoline
    twice: register_fentry(), unregister_fentry(), then register_fentry again.
    This causes ftrace_set_filter_ip() for the same ip on tr->fops twice,
    which leaves duplicated ip in tr->fops. The extra ip is not cleaned up
    properly on unregister and thus causes failures with further register in
    register_ftrace_direct_multi():
    
    register_ftrace_direct_multi()
    {
            ...
            for (i = 0; i < size; i++) {
                    hlist_for_each_entry(entry, &hash->buckets[i], hlist) {
                            if (ftrace_find_rec_direct(entry->ip))
                                    goto out_unlock;
                    }
            }
            ...
    }
    
    This can be triggered with parallel fentry/fexit tests with test_progs:
    
      ./test_progs -t fentry,fexit -j
    
    Fix this by resetting tr->fops in ftrace_set_filter_ip(), so that there
    will never be duplicated entries in tr->fops.
    
    Fixes: 00963a2e ("bpf: Support bpf_trampoline on functions with IPMODIFY (e.g. livepatch)")
    Reported-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20220729194106.1207472-1-song@kernel.org
    dc81f8d1
trampoline.c 25.6 KB