On 2020-11-06 5:14 p.m., Jason Gunthorpe wrote: > On Fri, Nov 06, 2020 at 01:03:26PM -0700, Logan Gunthorpe wrote: >> I don't think a function like that will work for the p2pmem use case. In >> order to implement proper page freeing I expect I'll need a loop around >> the allocator and vm_insert_mixed()... Something roughly like: >> >> for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) { >> vaddr = pci_alloc_p2pmem(pdev, PAGE_SIZE); >> ret = vmf_insert_mixed(vma, addr, >> __pfn_to_pfn_t(virt_to_pfn(vaddr), PFN_DEV | PFN_MAP)); >> } >> >> That way we can call pci_free_p2pmem() when a page's ref count goes to >> zero. I suspect your use case will need to do something similar. > > Yes, but I would say the pci_alloc_p2pmem() layer should be able to > free pages on a page-by-page basis so you don't have to do stuff like > the above. > > There is often a lot of value in having physical contiguous addresses, > so allocating page by page as well seems poor. Agreed. But I'll have to dig to see if genalloc supports freeing blocks in different sizes than the allocations. Logan