Commit Graph

12 Commits

Author SHA1 Message Date
Viktor Malik 38d0ff9a49
bpf: Use arch_bpf_trampoline_size
JIRA: https://issues.redhat.com/browse/RHEL-23644

Conflicts: omitting bits from arch/riscv/net/bpf_jit_comp64.c as RISC-V
           is unsupported

commit 26ef208c209a0e6eed8942a5d191b39dccfa6e38
Author: Song Liu <song@kernel.org>
Date:   Wed Dec 6 14:40:53 2023 -0800

    bpf: Use arch_bpf_trampoline_size

    Instead of blindly allocating PAGE_SIZE for each trampoline, check the size
    of the trampoline with arch_bpf_trampoline_size(). This size is saved in
    bpf_tramp_image->size, and used for modmem charge/uncharge. The fallback
    arch_alloc_bpf_trampoline() still allocates a whole page because we need to
    use set_memory_* to protect the memory.

    struct_ops trampoline still uses a whole page for multiple trampolines.

    With this size check at caller (regular trampoline and struct_ops
    trampoline), remove arch_bpf_trampoline_size() from
    arch_prepare_bpf_trampoline() in archs.

    Also, update bpf_image_ksym_add() to handle symbol of different sizes.

    Signed-off-by: Song Liu <song@kernel.org>
    Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Tested-by: Ilya Leoshkevich <iii@linux.ibm.com>  # on s390x
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Acked-by: Björn Töpel <bjorn@rivosinc.com>
    Tested-by: Björn Töpel <bjorn@rivosinc.com> # on riscv
    Link: https://lore.kernel.org/r/20231206224054.492250-7-song@kernel.org
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Viktor Malik <vmalik@redhat.com>
2024-06-25 10:52:14 +02:00
Viktor Malik ef19b269c7
bpf: Let bpf_prog_pack_free handle any pointer
JIRA: https://issues.redhat.com/browse/RHEL-23644

commit f08a1c658257c73697a819c4ded3a84b6f0ead74
Author: Song Liu <song@kernel.org>
Date:   Wed Dec 6 14:40:48 2023 -0800

    bpf: Let bpf_prog_pack_free handle any pointer
    
    Currently, bpf_prog_pack_free only can only free pointer to struct
    bpf_binary_header, which is not flexible. Add a size argument to
    bpf_prog_pack_free so that it can handle any pointer.
    
    Signed-off-by: Song Liu <song@kernel.org>
    Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Tested-by: Ilya Leoshkevich <iii@linux.ibm.com>  # on s390x
    Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/r/20231206224054.492250-2-song@kernel.org
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Viktor Malik <vmalik@redhat.com>
2024-06-25 10:52:13 +02:00
Jerome Marchand aa355334d1 bpf: Synchronize dispatcher update with bpf_dispatcher_xdp_func
Bugzilla: https://bugzilla.redhat.com/2177177

commit 4121d4481b72501aa4d22680be4ea1096d69d133
Author: Jiri Olsa <jolsa@kernel.org>
Date:   Wed Dec 14 13:35:42 2022 +0100

    bpf: Synchronize dispatcher update with bpf_dispatcher_xdp_func
    
    Hao Sun reported crash in dispatcher image [1].
    
    Currently we don't have any sync between bpf_dispatcher_update and
    bpf_dispatcher_xdp_func, so following race is possible:
    
     cpu 0:                               cpu 1:
    
     bpf_prog_run_xdp
       ...
       bpf_dispatcher_xdp_func
         in image at offset 0x0
    
                                          bpf_dispatcher_update
                                            update image at offset 0x800
                                          bpf_dispatcher_update
                                            update image at offset 0x0
    
         in image at offset 0x0 -> crash
    
    Fixing this by synchronizing dispatcher image update (which is done
    in bpf_dispatcher_update function) with bpf_dispatcher_xdp_func that
    reads and execute the dispatcher image.
    
    Calling synchronize_rcu after updating and installing new image ensures
    that readers leave old image before it's changed in the next dispatcher
    update. The update itself is locked with dispatcher's mutex.
    
    The bpf_prog_run_xdp is called under local_bh_disable and synchronize_rcu
    will wait for it to leave [2].
    
    [1] https://lore.kernel.org/bpf/Y5SFho7ZYXr9ifRn@krava/T/#m00c29ece654bc9f332a17df493bbca33e702896c
    [2] https://lore.kernel.org/bpf/0B62D35A-E695-4B7A-A0D4-774767544C1A@gmail.com/T/#mff43e2c003ae99f4a38f353c7969be4c7162e877
    
    Reported-by: Hao Sun <sunhao.th@gmail.com>
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Acked-by: Yonghong Song <yhs@fb.com>
    Acked-by: Paul E. McKenney <paulmck@kernel.org>
    Link: https://lore.kernel.org/r/20221214123542.1389719-1-jolsa@kernel.org
    Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
2023-04-28 11:43:19 +02:00
Artem Savkov bf37d7ccdc bpf: Add explicit cast to 'void *' for __BPF_DISPATCHER_UPDATE()
Bugzilla: https://bugzilla.redhat.com/2166911

commit a679120edfcf3d63f066f53afd425d51b480e533
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Mon Nov 7 10:07:11 2022 -0700

    bpf: Add explicit cast to 'void *' for __BPF_DISPATCHER_UPDATE()
    
    When building with clang:
    
      kernel/bpf/dispatcher.c:126:33: error: pointer type mismatch ('void *' and 'unsigned int (*)(const void *, const struct bpf_insn *, bpf_func_t)' (aka 'unsigned int (*)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *))')) [-Werror,-Wpointer-type-mismatch]
              __BPF_DISPATCHER_UPDATE(d, new ?: &bpf_dispatcher_nop_func);
                                         ~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~
      ./include/linux/bpf.h:1045:54: note: expanded from macro '__BPF_DISPATCHER_UPDATE'
              __static_call_update((_d)->sc_key, (_d)->sc_tramp, (_new))
                                                                  ^~~~
      1 error generated.
    
    The warning is pointing out that the type of new ('void *') and
    &bpf_dispatcher_nop_func are not compatible, which could have side
    effects coming out of a conditional operator due to promotion rules.
    
    Add the explicit cast to 'void *' to make it clear that this is
    expected, as __BPF_DISPATCHER_UPDATE() expands to a call to
    __static_call_update(), which expects a 'void *' as its final argument.
    
    Fixes: c86df29d11df ("bpf: Convert BPF_DISPATCHER to use static_call() (not ftrace)")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1755
    Reported-by: kernel test robot <lkp@intel.com>
    Reported-by: "kernelci.org bot" <bot@kernelci.org>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Acked-by: Björn Töpel <bjorn@kernel.org>
    Acked-by: Yonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/r/20221107170711.42409-1-nathan@kernel.org
    Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-03-06 14:54:22 +01:00
Artem Savkov e53d011d4b bpf: Convert BPF_DISPATCHER to use static_call() (not ftrace)
Bugzilla: https://bugzilla.redhat.com/2166911

commit c86df29d11dfba27c0a1f5039cd6fe387fbf4239
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Nov 3 13:00:14 2022 +0100

    bpf: Convert BPF_DISPATCHER to use static_call() (not ftrace)
    
    The dispatcher function is currently abusing the ftrace __fentry__
    call location for its own purposes -- this obviously gives trouble
    when the dispatcher and ftrace are both in use.
    
    A previous solution tried using __attribute__((patchable_function_entry()))
    which works, except it is GCC-8+ only, breaking the build on the
    earlier still supported compilers. Instead use static_call() -- which
    has its own annotations and does not conflict with ftrace -- to
    rewrite the dispatch function.
    
    By using: return static_call()(ctx, insni, bpf_func) you get a perfect
    forwarding tail call as function body (iow a single jmp instruction).
    By having the default static_call() target be bpf_dispatcher_nop_func()
    it retains the default behaviour (an indirect call to the argument
    function). Only once a dispatcher program is attached is the target
    rewritten to directly call the JIT'ed image.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Björn Töpel <bjorn@kernel.org>
    Tested-by: Jiri Olsa <jolsa@kernel.org>
    Acked-by: Björn Töpel <bjorn@kernel.org>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Link: https://lkml.kernel.org/r/Y1/oBlK0yFk5c/Im@hirez.programming.kicks-ass.net
    Link: https://lore.kernel.org/bpf/20221103120647.796772565@infradead.org

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-03-06 14:54:22 +01:00
Artem Savkov 17a22df2d5 bpf: Revert ("Fix dispatcher patchable function entry to 5 bytes nop")
Bugzilla: https://bugzilla.redhat.com/2166911

commit 18acb7fac22ff7b36c7ea5a76b12996e7b7dbaba
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Nov 3 13:00:13 2022 +0100

    bpf: Revert ("Fix dispatcher patchable function entry to 5 bytes nop")
    
    Because __attribute__((patchable_function_entry)) is only available
    since GCC-8 this solution fails to build on the minimum required GCC
    version.
    
    Undo these changes so we might try again -- without cluttering up the
    patches with too many changes.
    
    This is an almost complete revert of:
    
      dbe69b299884 ("bpf: Fix dispatcher patchable function entry to 5 bytes nop")
      ceea991a019c ("bpf: Move bpf_dispatcher function out of ftrace locations")
    
    (notably the arch/x86/Kconfig hunk is kept).
    
    Reported-by: David Laight <David.Laight@aculab.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Björn Töpel <bjorn@kernel.org>
    Tested-by: Jiri Olsa <jolsa@kernel.org>
    Acked-by: Björn Töpel <bjorn@kernel.org>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Link: https://lkml.kernel.org/r/439d8dc735bb4858875377df67f1b29a@AcuMS.aculab.com
    Link: https://lore.kernel.org/bpf/20221103120647.728830733@infradead.org

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-03-06 14:54:22 +01:00
Artem Savkov 95d146644b bpf: Fix dispatcher patchable function entry to 5 bytes nop
Bugzilla: https://bugzilla.redhat.com/2166911

commit dbe69b29988465b011f198f2797b1c2b6980b50e
Author: Jiri Olsa <jolsa@kernel.org>
Date:   Tue Oct 18 09:59:34 2022 +0200

    bpf: Fix dispatcher patchable function entry to 5 bytes nop
    
    The patchable_function_entry(5) might output 5 single nop
    instructions (depends on toolchain), which will clash with
    bpf_arch_text_poke check for 5 bytes nop instruction.
    
    Adding early init call for dispatcher that checks and change
    the patchable entry into expected 5 nop instruction if needed.
    
    There's no need to take text_mutex, because we are using it
    in early init call which is called at pre-smp time.
    
    Fixes: ceea991a019c ("bpf: Move bpf_dispatcher function out of ftrace locations")
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20221018075934.574415-1-jolsa@kernel.org
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-03-06 14:54:21 +01:00
Artem Savkov e7b770ccac bpf: use bpf_prog_pack for bpf_dispatcher
Bugzilla: https://bugzilla.redhat.com/2166911

commit 19c02415da2345d0dda2b5c4495bc17cc14b18b5
Author: Song Liu <song@kernel.org>
Date:   Mon Sep 26 11:47:38 2022 -0700

    bpf: use bpf_prog_pack for bpf_dispatcher
    
    Allocate bpf_dispatcher with bpf_prog_pack_alloc so that bpf_dispatcher
    can share pages with bpf programs.
    
    arch_prepare_bpf_dispatcher() is updated to provide a RW buffer as working
    area for arch code to write to.
    
    This also fixes CPA W^X warnning like:
    
    CPA refuse W^X violation: 8000000000000163 -> 0000000000000163 range: ...
    
    Signed-off-by: Song Liu <song@kernel.org>
    Link: https://lore.kernel.org/r/20220926184739.3512547-2-song@kernel.org
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-03-06 14:54:19 +01:00
Jiri Olsa 7ac88eba18 bpf: Remove bpf_image tree
Now that we have all the objects (bpf_prog, bpf_trampoline,
bpf_dispatcher) linked in bpf_tree, there's no need to have
separate bpf_image tree for images.

Reverting the bpf_image tree together with struct bpf_image,
because it's no longer needed.

Also removing bpf_image_alloc function and adding the original
bpf_jit_alloc_exec_page interface instead.

The kernel_text_address function can now rely only on is_bpf_text_address,
because it checks the bpf_tree that contains all the objects.

Keeping bpf_image_ksym_add and bpf_image_ksym_del because they are
useful wrappers with perf's ksymbol interface calls.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200312195610.346362-13-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2020-03-13 12:49:52 -07:00
Jiri Olsa 517b75e44c bpf: Add dispatchers to kallsyms
Adding dispatchers to kallsyms. It's displayed as
  bpf_dispatcher_<NAME>

where NAME is the name of dispatcher.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200312195610.346362-12-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2020-03-13 12:49:52 -07:00
Jiri Olsa e9b4e606c2 bpf: Allow to resolve bpf trampoline and dispatcher in unwind
When unwinding the stack we need to identify each address
to successfully continue. Adding latch tree to keep trampolines
for quick lookup during the unwind.

The patch uses first 48 bytes for latch tree node, leaving 4048
bytes from the rest of the page for trampoline or dispatcher
generated code.

It's still enough not to affect trampoline and dispatcher progs
maximum counts.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200123161508.915203-3-jolsa@kernel.org
2020-01-25 07:12:40 -08:00
Björn Töpel 75ccbef636 bpf: Introduce BPF dispatcher
The BPF dispatcher is a multi-way branch code generator, mainly
targeted for XDP programs. When an XDP program is executed via the
bpf_prog_run_xdp(), it is invoked via an indirect call. The indirect
call has a substantial performance impact, when retpolines are
enabled. The dispatcher transform indirect calls to direct calls, and
therefore avoids the retpoline. The dispatcher is generated using the
BPF JIT, and relies on text poking provided by bpf_arch_text_poke().

The dispatcher hijacks a trampoline function it via the __fentry__ nop
of the trampoline. One dispatcher instance currently supports up to 64
dispatch points. A user creates a dispatcher with its corresponding
trampoline with the DEFINE_BPF_DISPATCHER macro.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20191213175112.30208-3-bjorn.topel@gmail.com
2019-12-13 13:09:32 -08:00