On Wed, Oct 21, 2020 at 6:37 PM Jason Gunthorpe jgg@ziepe.ca wrote:
On Wed, Oct 21, 2020 at 05:54:54PM +0200, Daniel Vetter wrote:
The trouble is that io_remap_pfn adjust vma->pgoff, so we'd need to split that. So ideally ->mmap would never set up any ptes.
/dev/mem makes pgoff == pfn so it doesn't get changed by remap.
pgoff doesn't get touched for MAP_SHARED either, so there are other users that could work like this - eg anyone mmaping IO memory is probably OK.
I was more generally thinking for io_remap_pfn_users because of the mkwrite use-case we might have in fbdev emulation in drm.
I guess one option would be if remap_pfn_range would steal the vma->vm_ops pointer for itself, then it could set up the correct ->install_ptes hook. But there's tons of callers for that, so not sure that's a bright idea.
The caller has to check that the mapping is still live, and I think hold a lock across the remap? Auto-defering it doesn't seem feasible.
Right auto-defering reopens the race, so making this work automatically is a bit much. I guess just splitting this into a setup/install part and then doing the install of all the ptes at first fault should be good enough. We don't really need a new install_pages for that, just an io_remap_pfn_range that's split in two parts. -Daniel