On 8/26/22 4:44 AM, Alexei Starovoitov wrote: [...]
+ +/* Called from BPF program or from sys_bpf syscall. + * In both cases migration is disabled. + */ +void notrace *bpf_mem_alloc(struct bpf_mem_alloc *ma, size_t size) +{ + int idx; + void *ret; + + if (!size) + return ZERO_SIZE_PTR; + + idx = bpf_mem_cache_idx(size + LLIST_NODE_SZ); + if (idx < 0) + return NULL; + + ret = unit_alloc(this_cpu_ptr(ma->caches)->cache + idx); + return !ret ? NULL : ret + LLIST_NODE_SZ; +} + +void notrace bpf_mem_free(struct bpf_mem_alloc *ma, void *ptr) +{ + int idx; + + if (!ptr) + return; + + idx = bpf_mem_cache_idx(__ksize(ptr - LLIST_NODE_SZ)); + if (idx < 0) + return; + + unit_free(this_cpu_ptr(ma->caches)->cache + idx, ptr); +} + +void notrace *bpf_mem_cache_alloc(struct bpf_mem_alloc *ma) +{ + void *ret; + + ret = unit_alloc(this_cpu_ptr(ma->cache)); + return !ret ? NULL : ret + LLIST_NODE_SZ; +} + +void notrace bpf_mem_cache_free(struct bpf_mem_alloc *ma, void *ptr) +{ + if (!ptr) + return; + + unit_free(this_cpu_ptr(ma->cache), ptr); +}
Looks like smp_processor_id() needs to be made aware that preemption might be ok just not migration to a different CPU? [...] [ 593.639025] BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u16:246/1946 [ 593.639026] BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u16:83/1642 [ 593.639138] caller is bpf_mem_cache_free+0x14/0x40 [ 593.640971] caller is bpf_mem_cache_free+0x14/0x40 [ 593.641060] CPU: 6 PID: 1642 Comm: kworker/u16:83 Not tainted 5.19.0-gf0d7b67fb6f8 #1 [ 593.641874] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 [ 593.641874] Workqueue: events_unbound bpf_map_free_deferred [ 593.641874] Call Trace: [ 593.641874] <TASK> [ 593.641874] dump_stack_lvl+0x69/0x9b [ 593.641874] check_preemption_disabled+0x10b/0x120 [ 593.641874] bpf_mem_cache_free+0x14/0x40 [ 593.641874] htab_map_free+0x13f/0x2a0 [ 593.641874] process_one_work+0x28e/0x580 [ 593.641874] worker_thread+0x1fb/0x420 [ 593.641874] ? rcu_lock_release+0x20/0x20 [ 593.641874] kthread+0xf1/0x110 [ 593.641874] ? kthread_blkcg+0x40/0x40 [ 593.641874] ret_from_fork+0x22/0x30 [ 593.641874] </TASK> [ 593.654117] CPU: 5 PID: 1946 Comm: kworker/u16:246 Not tainted 5.19.0-gf0d7b67fb6f8 #1 [ 593.654317] BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u16:83/1642 [ 593.654560] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 [ 593.654560] Workqueue: events_unbound bpf_map_free_deferred [ 593.654560] Call Trace: [ 593.654560] <TASK> [ 593.654560] dump_stack_lvl+0x69/0x9b [ 593.658872] caller is bpf_mem_cache_free+0x14/0x40 [ 593.654560] check_preemption_disabled+0x10b/0x120 [ 593.654560] bpf_mem_cache_free+0x14/0x40 [ 593.654560] htab_map_free+0x13f/0x2a0 [ 593.654560] process_one_work+0x28e/0x580 [ 593.654560] worker_thread+0x1fb/0x420 [ 593.654560] ? rcu_lock_release+0x20/0x20 [ 593.654560] kthread+0xf1/0x110 [ 593.654560] ? kthread_blkcg+0x40/0x40 [ 593.654560] ret_from_fork+0x22/0x30 [ 593.654560] </TASK> [...] [ 1158.399989] test_maps invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=0 [ 1158.401948] CPU: 1 PID: 4147 Comm: test_maps Not tainted 5.19.0-gf0d7b67fb6f8 #1 [ 1158.402612] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 [ 1158.402666] Call Trace: [ 1158.402666] <TASK> [ 1158.402666] dump_stack_lvl+0x69/0x9b [ 1158.402666] dump_header+0x4d/0x370 [ 1158.402666] out_of_memory+0x5a2/0x5e0 [ 1158.402666] __alloc_pages_slowpath+0xbf4/0x1140 [ 1158.402666] __alloc_pages+0x222/0x2c0 [ 1158.402666] folio_alloc+0x14/0x40 [ 1158.402666] filemap_alloc_folio+0x43/0x150 [ 1158.402666] __filemap_get_folio+0x263/0x3a0 [ 1158.402666] filemap_fault+0x20f/0x540 [ 1158.410527] __do_fault+0x4a/0x100 [ 1158.410527] do_fault+0x13a/0x630 [ 1158.410527] handle_mm_fault+0x83d/0x13d0 [ 1158.410527] do_user_addr_fault+0x33c/0x4e0 [ 1158.410527] exc_page_fault+0x72/0x280 [ 1158.410527] asm_exc_page_fault+0x22/0x30 [ 1158.410527] RIP: 0033:0x7fa4d11a6ffc [ 1158.410527] Code: Unable to access opcode bytes at RIP 0x7fa4d11a6fd2. [ 1158.410527] RSP: 002b:00007ffd4fa8ac00 EFLAGS: 00000206 [ 1158.410527] RAX: 0000000000000240 RBX: 0000000000000075 RCX: 00007fa4d11d4610 [ 1158.410527] RDX: 0000000000000065 RSI: 00007fa4d11d42a0 RDI: 000055d328f91ac8 [ 1158.410527] RBP: 00007ffd4fa8ace0 R08: 00007fa4d1198aa0 R09: 0000000000000001 [ 1158.419624] R10: 00007ffd4fa8ace0 R11: 0000000000000246 R12: 000055d328f91ac8 [ 1158.420234] R13: 000055d328f9e4e0 R14: 0000000000000000 R15: 00007fa4d11d3000 [ 1158.420234] </TASK> [...]