• Hou Tao's avatar
    bpf: Use bpf_global_percpu_ma for per-cpu kptr in __bpf_obj_drop_impl() · e383a459
    Hou Tao authored
    The following warning was reported when running "./test_progs -t
    test_bpf_ma/percpu_free_through_map_free":
    
      ------------[ cut here ]------------
      WARNING: CPU: 1 PID: 68 at kernel/bpf/memalloc.c:342
      CPU: 1 PID: 68 Comm: kworker/u16:2 Not tainted 6.6.0-rc2+ #222
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)
      Workqueue: events_unbound bpf_map_free_deferred
      RIP: 0010:bpf_mem_refill+0x21c/0x2a0
      ......
      Call Trace:
       <IRQ>
       ? bpf_mem_refill+0x21c/0x2a0
       irq_work_single+0x27/0x70
       irq_work_run_list+0x2a/0x40
       irq_work_run+0x18/0x40
       __sysvec_irq_work+0x1c/0xc0
       sysvec_irq_work+0x73/0x90
       </IRQ>
       <TASK>
       asm_sysvec_irq_work+0x1b/0x20
      RIP: 0010:unit_free+0x50/0x80
       ......
       bpf_mem_free+0x46/0x60
       __bpf_obj_drop_impl+0x40/0x90
       bpf_obj_free_fields+0x17d/0x1a0
       array_map_free+0x6b/0x170
       bpf_map_free_deferred+0x54/0xa0
       process_scheduled_works+0xba/0x370
       worker_thread+0x16d/0x2e0
       kthread+0x105/0x140
       ret_from_fork+0x39/0x60
       ret_from_fork_asm+0x1b/0x30
       </TASK>
      ---[ end trace 0000000000000000 ]---
    
    The reason is simple: __bpf_obj_drop_impl() does not know the freeing
    field is a per-cpu pointer and it uses bpf_global_ma to free the
    pointer. Because bpf_global_ma is not a per-cpu allocator, so ksize() is
    used to select the corresponding cache. The bpf_mem_cache with 16-bytes
    unit_size will always be selected to do the unmatched free and it will
    trigger the warning in free_bulk() eventually.
    
    Because per-cpu kptr doesn't support list or rb-tree now, so fix the
    problem by only checking whether or not the type of kptr is per-cpu in
    bpf_obj_free_fields(), and using bpf_global_percpu_ma to these kptrs.
    Signed-off-by: default avatarHou Tao <houtao1@huawei.com>
    Link: https://lore.kernel.org/r/20231020133202.4043247-7-houtao@huaweicloud.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    e383a459
helpers.c 68.9 KB