summaryrefslogtreecommitdiff
path: root/include/uapi/linux/mqueue.h
diff options
context:
space:
mode:
authorMatthew Wood <thepacketgeek@gmail.com>2026-10-09 10:37:59 -0700
committerAlexei Starovoitov <ast@kernel.org>2026-10-10 15:02:03 +0000
commit6335e6719fd323c345427b7cf2d5d17c28fdbc41 (patch)
tree509e1f3b33c7eaf49b3f64485da12d3c66fac2cb /include/uapi/linux/mqueue.h
parent03e13ba413974a167e643aeef138a8e63f4cbf7d (diff)
downloadlinux-next-6335e6719fd323c345427b7cf2d5d17c28fdbc41.tar.gz
linux-next-6335e6719fd323c345427b7cf2d5d17c28fdbc41.zip
bpf, arm64: Fix racy plt target update in bpf_arch_text_poke()
When a long-jump trampoline is attached to or detached from a bpf prog, bpf_arch_text_poke() updates the plt target at the end of the prog by temporarily making the page writable: set_memory_rw(page); WRITE_ONCE(plt->target, plt_target); set_memory_ro(page); Since commit 1dad391daef1 ("bpf, arm64: use bpf_prog_pack for memory management"), bpf progs are allocated from the bpf prog pack, so unrelated progs and their plts commonly share a page. The sequence above is not serialized against other pokers, it runs before text_mutex is taken and callers only hold the lock of the trampoline being updated. Two CPUs attaching to or detaching from different target progs in the same page can therefore race: CPU A CPU B set_memory_rw(page) set_memory_rw(page) WRITE_ONCE(plt_B->target, ...) set_memory_ro(page) WRITE_ONCE(plt_A->target, ...) <- permission fault This was hit on an arm64 server with 64K pages while attaching fentry programs to bpf progs: Unable to handle kernel write to read-only memory at virtual address ffff80008f46d5f8 ESR = 0x000000009600004f FSC = 0x0f: level 3 permission fault pte=00c00200ea5a0783 Internal error: Oops: 000000009600004f [#1] SMP pc : bpf_arch_text_poke+0x214/0x238 lr : bpf_arch_text_poke+0x200/0x238 Call trace: bpf_arch_text_poke+0x214/0x238 (P) __bpf_trampoline_link_prog+0x1c8/0x470 bpf_trampoline_link_prog+0x64/0x90 bpf_tracing_prog_attach+0x318/0x4a8 bpf_raw_tp_link_attach+0x104/0x258 bpf_raw_tracepoint_open+0x6c/0x90 __sys_bpf+0x134c/0x3e10 Rather than serializing the permission changes, stop changing page permissions altogether and write the plt target with aarch64_insn_write_literal_u64(). It writes through the text patching fixmap under patch_lock, the same way the rest of the prog pack is written, and performs a single-copy atomic 64-bit store. The plt target is naturally aligned (see build_plt()), so CPUs concurrently executing the plt still observe either the old or the new target. This is the same helper ftrace and static calls use to update 64-bit literals that are loaded concurrently. Fixes: 1dad391daef1 ("bpf, arm64: use bpf_prog_pack for memory management") Signed-off-by: Matthew Wood <thepacketgeek@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://patch.msgid.link/20261009173802.1248441-1-thepacketgeek@gmail.com
Diffstat (limited to 'include/uapi/linux/mqueue.h')
0 files changed, 0 insertions, 0 deletions