lkml.org 
[lkml]   [2022]   [Feb]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 38/43] bpf: Fix possible race in inc_misses_counter
    Date
    From: He Fengqing <hefengqing@huawei.com>

    commit 0e3135d3bfa5dfb658145238d2bc723a8e30c3a3 upstream.

    It seems inc_misses_counter() suffers from same issue fixed in
    the commit d979617aa84d ("bpf: Fixes possible race in update_prog_stats()
    for 32bit arches"):
    As it can run while interrupts are enabled, it could
    be re-entered and the u64_stats syncp could be mangled.

    Fixes: 9ed9e9ba2337 ("bpf: Count the number of times recursion was prevented")
    Signed-off-by: He Fengqing <hefengqing@huawei.com>
    Acked-by: John Fastabend <john.fastabend@gmail.com>
    Link: https://lore.kernel.org/r/20220122102936.1219518-1-hefengqing@huawei.com
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/bpf/trampoline.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    --- a/kernel/bpf/trampoline.c
    +++ b/kernel/bpf/trampoline.c
    @@ -542,11 +542,12 @@ static __always_inline u64 notrace bpf_p
    static void notrace inc_misses_counter(struct bpf_prog *prog)
    {
    struct bpf_prog_stats *stats;
    + unsigned int flags;

    stats = this_cpu_ptr(prog->stats);
    - u64_stats_update_begin(&stats->syncp);
    + flags = u64_stats_update_begin_irqsave(&stats->syncp);
    u64_stats_inc(&stats->misses);
    - u64_stats_update_end(&stats->syncp);
    + u64_stats_update_end_irqrestore(&stats->syncp, flags);
    }

    /* The logic is similar to bpf_prog_run(), but with an explicit

    \
     
     \ /
      Last update: 2022-02-04 10:29    [W:7.687 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site