On 12/10/24 03:39, Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Introduce free_pages_nolock() that can free a page without taking locks. > It relies on trylock only and can be called from any context. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> <snip> > +/* Can be called while holding raw_spin_lock or from IRQ. RCU must be watching. */ > +void free_pages_nolock(struct page *page, unsigned int order) What does "RCU must be watching" mean and why? > +{ > + int head = PageHead(page); > + struct alloc_tag *tag = pgalloc_tag_get(page); > + > + if (put_page_testzero(page)) { > + __free_unref_page(page, order, FPI_TRYLOCK); > + } else if (!head) { > + pgalloc_tag_sub_pages(tag, (1 << order) - 1); > + while (order-- > 0) > + __free_unref_page(page + (1 << order), order, FPI_TRYLOCK); Not your fault for trying to support everything __free_pages did, specifically order > 0 pages that are not compound and thus needing this extra !head branch. We'd love to get rid of that eventually in __free_pages(), but at least I think we don't need to support it in a new API and instead any users switching to it should know it's not supported. I suppose BFP doesn't need that, right? Maybe if the function was taking a folio instead of page, it would be the best as that has to be order-0 or compound by definition. It also wouldn't need the order parameter. What do you think, Matthew? > + } > +} > + > void free_pages(unsigned long addr, unsigned int order) > { > if (addr != 0) {