On Tue, Aug 22, 2023 at 2:15 PM Chris Li <chrisl@xxxxxxxxxx> wrote: > > Hi Kemeng, > > On Mon, Aug 21, 2023 at 6:27 PM Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> wrote: > > > > > Agreed. We assume pcp->count is protected by pcp->lock. Instead of make code > > work in case pcp->count could be changed without lock held, it's more reasonble > > to modify pcp->count with pcp->lock held in BPF program. > > The lock is holded when pcp->count is modified. It is going through > the kernel page > allocation API. The issue is nest memory allocation inside spin_lock() > introduced by BPF. > > The execution sequence is like this: > > count = min(pcp->count, count); > > /* Ensure requested pindex is drained first. */ > pindex = pindex - 1; > bpf_injected_spin_lock_irqsave { > alloc_page(); > original spin_lock_irqsave(&zone->lock, flags) ; > } bpf doesn't call into alloc_page() or slab alloc or pcpu alloc from tracing progs. All memory is preallocated. Can you reproduce the issue on the latest upstream kernel?