• Will Deacon's avatar
    arm64: patching: fix handling of execmem addresses · b1480ed2
    Will Deacon authored
    Klara Modin reported warnings for a kernel configured with BPF_JIT but
    without MODULES:
    
    [   44.131296] Trying to vfree() bad address (000000004a17c299)
    [   44.138024] WARNING: CPU: 1 PID: 193 at mm/vmalloc.c:3189 remove_vm_area (mm/vmalloc.c:3189 (discriminator 1))
    [   44.146675] CPU: 1 PID: 193 Comm: kworker/1:2 Tainted: G      D W          6.9.0-01786-g2c9e5d4a #25
    [   44.158229] Hardware name: Raspberry Pi 3 Model B (DT)
    [   44.164433] Workqueue: events bpf_prog_free_deferred
    [   44.170492] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [   44.178601] pc : remove_vm_area (mm/vmalloc.c:3189 (discriminator 1))
    [   44.183705] lr : remove_vm_area (mm/vmalloc.c:3189 (discriminator 1))
    [   44.188772] sp : ffff800082a13c70
    [   44.193112] x29: ffff800082a13c70 x28: 0000000000000000 x27: 0000000000000000
    [   44.201384] x26: 0000000000000000 x25: ffff00003a44efa0 x24: 00000000d4202000
    [   44.209658] x23: ffff800081223dd0 x22: ffff00003a198a40 x21: ffff8000814dd880
    [   44.217924] x20: 00000000d4202000 x19: ffff8000814dd880 x18: 0000000000000006
    [   44.226206] x17: 0000000000000000 x16: 0000000000000020 x15: 0000000000000002
    [   44.234460] x14: ffff8000811a6370 x13: 0000000020000000 x12: 0000000000000000
    [   44.242710] x11: ffff8000811a6370 x10: 0000000000000144 x9 : ffff8000811fe370
    [   44.250959] x8 : 0000000000017fe8 x7 : 00000000fffff000 x6 : ffff8000811fe370
    [   44.259206] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
    [   44.267457] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000002203240
    [   44.275703] Call trace:
    [   44.279158] remove_vm_area (mm/vmalloc.c:3189 (discriminator 1))
    [   44.283858] vfree (mm/vmalloc.c:3322)
    [   44.287835] execmem_free (mm/execmem.c:70)
    [   44.292347] bpf_jit_free_exec+0x10/0x1c
    [   44.297283] bpf_prog_pack_free (kernel/bpf/core.c:1006)
    [   44.302457] bpf_jit_binary_pack_free (kernel/bpf/core.c:1195)
    [   44.307951] bpf_jit_free (include/linux/filter.h:1083 arch/arm64/net/bpf_jit_comp.c:2474)
    [   44.312342] bpf_prog_free_deferred (kernel/bpf/core.c:2785)
    [   44.317785] process_one_work (kernel/workqueue.c:3273)
    [   44.322684] worker_thread (kernel/workqueue.c:3342 (discriminator 2) kernel/workqueue.c:3429 (discriminator 2))
    [   44.327292] kthread (kernel/kthread.c:388)
    [   44.331342] ret_from_fork (arch/arm64/kernel/entry.S:861)
    
    The problem is because bpf_arch_text_copy() silently fails to write to the
    read-only area as a result of patch_map() faulting and the resulting
    -EFAULT being chucked away.
    
    Update patch_map() to use CONFIG_EXECMEM instead of
    CONFIG_STRICT_MODULE_RWX to check for vmalloc addresses.
    
    Link: https://lkml.kernel.org/r/20240521213813.703309-1-rppt@kernel.org
    Fixes: 2c9e5d4a ("bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of")
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Signed-off-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
    Reported-by: default avatarKlara Modin <klarasmodin@gmail.com>
    Closes: https://lore.kernel.org/all/7983fbbf-0127-457c-9394-8d6e4299c685@gmail.comTested-by: default avatarKlara Modin <klarasmodin@gmail.com>
    Cc: Björn Töpel <bjorn@kernel.org>
    Cc: Luis Chamberlain <mcgrof@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    b1480ed2
patching.c 5.37 KB