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) ; } Chris Chris