]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Prefer dirty packs for eBPF allocations
authorPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Tue, 30 Jun 2026 05:39:29 +0000 (22:39 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 1 Jul 2026 08:34:41 +0000 (10:34 +0200)
The pack allocator only flushes predictors when reusing a dirty pack for
cBPF, eBPF allocations never trigger a flush. Currently, eBPF picks the
first free pack, which could be a clean pack. As an optimization, leaving
a clean pack for cBPF can avoid flushes.

Prefer dirty packs for eBPF and keep clean packs free for cBPF. This
mirrors the existing cBPF preference for clean packs: each program kind
prefers the pack that avoids an extra flush, and falls back to the other
kind only when no preferred pack has room. eBPF reuse of a dirty pack is
harmless since eBPF being privileged does not flush.

Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
kernel/bpf/core.c

index 1b32b9f2491f40cb18f0a1b2c877c0178958fb0b..6e19a030da6f1375959146f57da91a133e493102 100644 (file)
@@ -988,10 +988,10 @@ void *bpf_prog_pack_alloc(u32 size, bpf_jit_fill_hole_t bpf_fill_ill_insns, bool
                        goto found_free_area;
                /*
                 * cBPF reuse of a dirty pack triggers a flush, so prefer a
-                * clean pack for cBPF. eBPF never flushes, so pick the first
-                * free pack, dirty or clean.
+                * clean pack for cBPF. eBPF never flushes, so steer it to a
+                * dirty pack and keep clean packs free for cBPF.
                 */
-               if (!was_classic || !pack->arch_flush_needed)
+               if (was_classic ^ pack->arch_flush_needed)
                        goto found_free_area;
                if (!fallback_pack) {
                        fallback_pack = pack;