]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpf: Use bpf_is_subprog to check for subprogs
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Tue, 12 Sep 2023 23:31:58 +0000 (01:31 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 16 Sep 2023 16:34:20 +0000 (09:34 -0700)
We would like to know whether a bpf_prog corresponds to the main prog or
one of the subprogs. The current JIT implementations simply check this
using the func_idx in bpf_prog->aux->func_idx. When the index is 0, it
belongs to the main program, otherwise it corresponds to some
subprogram.

This will also be necessary to halt exception propagation while walking
the stack when an exception is thrown, so we add a simple helper
function to check this, named bpf_is_subprog, and convert existing JIT
implementations to also make use of it.

Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20230912233214.1518551-2-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/arm64/net/bpf_jit_comp.c
arch/s390/net/bpf_jit_comp.c
arch/x86/net/bpf_jit_comp.c
include/linux/bpf.h

index 150d1c6543f7f1f1395787254d910aad51f42ccd..7d4af64e398286d2036c4cdbfbbab0f6611e12de 100644 (file)
@@ -288,7 +288,7 @@ static bool is_lsi_offset(int offset, int scale)
 static int build_prologue(struct jit_ctx *ctx, bool ebpf_from_cbpf)
 {
        const struct bpf_prog *prog = ctx->prog;
-       const bool is_main_prog = prog->aux->func_idx == 0;
+       const bool is_main_prog = !bpf_is_subprog(prog);
        const u8 r6 = bpf2a64[BPF_REG_6];
        const u8 r7 = bpf2a64[BPF_REG_7];
        const u8 r8 = bpf2a64[BPF_REG_8];
index de2fb12120d2ed85c330c19bf8d8f3c735e5ecec..eeb42e5cd7d6d0ee0f71c480a0db600251518d13 100644 (file)
@@ -556,7 +556,7 @@ static void bpf_jit_prologue(struct bpf_jit *jit, struct bpf_prog *fp,
        EMIT6_PCREL_RILC(0xc0040000, 0, jit->prologue_plt);
        jit->prologue_plt_ret = jit->prg;
 
-       if (fp->aux->func_idx == 0) {
+       if (!bpf_is_subprog(fp)) {
                /* Initialize the tail call counter in the main program. */
                /* xc STK_OFF_TCCNT(4,%r15),STK_OFF_TCCNT(%r15) */
                _EMIT6(0xd703f000 | STK_OFF_TCCNT, 0xf000 | STK_OFF_TCCNT);
index 2846c21d75bfa43d7a5e8f30b53a353214b1525c..a0d03503b3cb36c50faf7696652cd591ac9ac7d6 100644 (file)
@@ -1049,7 +1049,7 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 *rw_image
 
        emit_prologue(&prog, bpf_prog->aux->stack_depth,
                      bpf_prog_was_classic(bpf_prog), tail_call_reachable,
-                     bpf_prog->aux->func_idx != 0);
+                     bpf_is_subprog(bpf_prog));
        push_callee_regs(&prog, callee_regs_used);
 
        ilen = prog - temp;
index b9e5731594324eacaaa2ffad140bfead50f6e6a6..9171b0b6a5905bd584e9f02e195bce61ddacc8f6 100644 (file)
@@ -3194,4 +3194,9 @@ static inline gfp_t bpf_memcg_flags(gfp_t flags)
        return flags;
 }
 
+static inline bool bpf_is_subprog(const struct bpf_prog *prog)
+{
+       return prog->aux->func_idx != 0;
+}
+
 #endif /* _LINUX_BPF_H */