• Dave Marchevsky's avatar
    bpf: Disable migration when freeing stashed local kptr using obj drop · 9e36a204
    Dave Marchevsky authored
    When a local kptr is stashed in a map and freed when the map goes away,
    currently an error like the below appears:
    
    [   39.195695] BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u32:15/2875
    [   39.196549] caller is bpf_mem_free+0x56/0xc0
    [   39.196958] CPU: 15 PID: 2875 Comm: kworker/u32:15 Tainted: G           O       6.2.0-13016-g22df776a #4477
    [   39.197897] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [   39.198949] Workqueue: events_unbound bpf_map_free_deferred
    [   39.199470] Call Trace:
    [   39.199703]  <TASK>
    [   39.199911]  dump_stack_lvl+0x60/0x70
    [   39.200267]  check_preemption_disabled+0xbf/0xe0
    [   39.200704]  bpf_mem_free+0x56/0xc0
    [   39.201032]  ? bpf_obj_new_impl+0xa0/0xa0
    [   39.201430]  bpf_obj_free_fields+0x1cd/0x200
    [   39.201838]  array_map_free+0xad/0x220
    [   39.202193]  ? finish_task_switch+0xe5/0x3c0
    [   39.202614]  bpf_map_free_deferred+0xea/0x210
    [   39.203006]  ? lockdep_hardirqs_on_prepare+0xe/0x220
    [   39.203460]  process_one_work+0x64f/0xbe0
    [   39.203822]  ? pwq_dec_nr_in_flight+0x110/0x110
    [   39.204264]  ? do_raw_spin_lock+0x107/0x1c0
    [   39.204662]  ? lockdep_hardirqs_on_prepare+0xe/0x220
    [   39.205107]  worker_thread+0x74/0x7a0
    [   39.205451]  ? process_one_work+0xbe0/0xbe0
    [   39.205818]  kthread+0x171/0x1a0
    [   39.206111]  ? kthread_complete_and_exit+0x20/0x20
    [   39.206552]  ret_from_fork+0x1f/0x30
    [   39.206886]  </TASK>
    
    This happens because the call to __bpf_obj_drop_impl I added in the patch
    adding support for stashing local kptrs doesn't disable migration. Prior
    to that patch, __bpf_obj_drop_impl logic only ran when called by a BPF
    progarm, whereas now it can be called from map free path, so it's
    necessary to explicitly disable migration.
    
    Also, refactor a bit to just call __bpf_obj_drop_impl directly instead
    of bothering w/ dtor union and setting pointer-to-obj_drop.
    
    Fixes: c8e18754 ("bpf: Support __kptr to local kptrs")
    Reported-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
    Link: https://lore.kernel.org/r/20230313214641.3731908-1-davemarchevsky@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    9e36a204
btf.c 221 KB