On Fri, Jun 10, 2022 at 01:37:20PM +0800, Baolu Lu wrote: > On 2022/6/9 20:49, Jason Gunthorpe wrote: > > > +void iommu_free_pgtbl_pages(struct iommu_domain *domain, > > > + struct list_head *pages) > > > +{ > > > + struct page *page, *next; > > > + > > > + if (!domain->concurrent_traversal) { > > > + put_pages_list(pages); > > > + return; > > > + } > > > + > > > + list_for_each_entry_safe(page, next, pages, lru) { > > > + list_del(&page->lru); > > > + call_rcu(&page->rcu_head, pgtble_page_free_rcu); > > > + } > > It seems OK, but I wonder if there is benifit to using > > put_pages_list() from the rcu callback > > The price is that we need to allocate a "struct list_head" and free it > in the rcu callback as well. Currently the list_head is sitting in the > stack.
You'd have to use a different struct page layout so that the list_head was in the struct page and didn't overlap with the rcu_head Jason _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu