Commit 96ab4273 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jialin Zhang
Browse files

bpf: Fixes possible race in update_prog_stats() for 32bit arches

mainline inclusion
from mainline-v5.16-rc1
commit d979617a
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6O293

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d979617aa84d96acca44c2f5778892b4565e322f



---------------------------

It seems update_prog_stats() suffers from same issue fixed
in the prior patch:

As it can run while interrupts are enabled, it could
be re-entered and the u64_stats syncp could be mangled.

Fixes: fec56f58 ("bpf: Introduce BPF trampoline")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211026214133.3114279-3-eric.dumazet@gmail.com


Conflicts:
	kernel/bpf/trampoline.c
Signed-off-by: default avatarPu Lehui <pulehui@huawei.com>
Reviewed-by: default avatarXu Kuohai <xukuohai@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parent 38e4d458
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -527,11 +527,13 @@ void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start)
	     * Hence check that 'start' is not zero.
	     */
	    start) {
		unsigned long flags;

		stats = this_cpu_ptr(prog->aux->stats);
		u64_stats_update_begin(&stats->syncp);
		flags = u64_stats_update_begin_irqsave(&stats->syncp);
		stats->cnt++;
		stats->nsecs += sched_clock() - start;
		u64_stats_update_end(&stats->syncp);
		u64_stats_update_end_irqrestore(&stats->syncp, flags);
	}
	migrate_enable();
	rcu_read_unlock();