On 2022-05-27 13:03, Jason Gunthorpe wrote: > On Fri, May 27, 2022 at 09:35:07AM -0600, Logan Gunthorpe wrote: >> >> >> On 2022-05-27 06:55, Jason Gunthorpe wrote: >>> On Thu, Apr 07, 2022 at 09:47:16AM -0600, Logan Gunthorpe wrote: >>>> +static void pci_p2pdma_unmap_mappings(void *data) >>>> +{ >>>> + struct pci_dev *pdev = data; >>>> + struct pci_p2pdma *p2pdma = rcu_dereference_protected(pdev->p2pdma, 1); >>>> + >>>> + /* Ensure no new pages can be allocated in mappings */ >>>> + p2pdma->active = false; >>>> + synchronize_rcu(); >>>> + >>>> + unmap_mapping_range(p2pdma->inode->i_mapping, 0, 0, 1); >>>> + >>>> + /* >>>> + * On some architectures, TLB flushes are done with call_rcu() >>>> + * so to ensure GUP fast is done with the pages, call synchronize_rcu() >>>> + * before freeing them. >>>> + */ >>>> + synchronize_rcu(); >>>> + pci_p2pdma_free_mappings(p2pdma->inode->i_mapping); >>> >>> With the series from Felix getting close this should get updated to >>> not set pte_devmap and use proper natural refcounting without any of >>> this stuff. >> >> Can you send a link? I'm not sure what you are referring to. > > IIRC this is the last part: > > https://lore.kernel.org/linux-mm/20220524190632.3304-1-alex.sierra@xxxxxxx/ > > And the earlier bit with Christoph's pieces looks like it might get > merged to v5.19.. > > The general idea is once pte_devmap is not set then all the > refcounting works the way it should. This is what all new ZONE_DEVICE > users should do.. Ok, I don't actually follow how those patches relate to this. Based on your description I guess I don't need to set PFN_DEV and perhaps not use vmf_insert_mixed()? And then just use vm_normal_page()? But the refcounting of the pages seemed like it was already sane to me, unless you mean that the code no longer has to synchronize_rcu() before returning the pages... that would be spectacular and clean things up a lot (plus fix an annoying issue where if you use then free all the memory you can't allocate new memory for an indeterminate amount of time). Logan