On Wed, Jun 19, 2019 at 08:56:32AM -0300, Jason Gunthorpe wrote: > This looks a lot like the ODP code (amdgpu_mn_node == ib_umem_odp) > > The interval tree is to quickly find the driver object(s) that have > the virtual pages during invalidation: > > static int amdgpu_mn_sync_pagetables_gfx(struct hmm_mirror *mirror, > const struct hmm_update *update) > { > it = interval_tree_iter_first(&amn->objects, start, end); > while (it) { > [..] > amdgpu_mn_invalidate_node(node, start, end); > > And following the ODP model there should be a single hmm_mirror per-mm > (user can fork and stuff, this is something I want to have core code > help with). That makes the hmm_mirror object pretty silly, though as the scope is then exactly the same as the mmu_notifier itself. > The hmm_mirror can either exist so long as objects exist, or it can > exist until the chardev is closed - but never longer than the > chardev's lifetime. > > Maybe we should be considering providing a mmu notifier & interval > tree & lock abstraction since ODP & AMD are very similar here.. It defintively sounds like a good idea to move this kind of object management into common code. Nouvea actually seems like the odd one out here by not having a list of objects below the mirror, but then again and interval tree with a single entry wouldn't really hurt it either.