Jason Gunthorpe <jgg@xxxxxxxxxx> writes: > On Wed, Feb 22, 2023 at 10:38:25PM +1100, Alistair Popple wrote: >> When a driver unpins a page we scan the pinners list and assign >> ownership to the next driver pinning the page by updating memcg_data and >> removing the vm_account from the list. > > I don't see how this works with just the data structure you outlined?? > Every unique page needs its own list_head in the vm_account, it is > doable just incredibly costly. The idea was every driver already needs to allocate a pages array to pass to pin_user_pages(), and by necessity drivers have to keep a reference to the contents of that in one form or another. So conceptually the equivalent of: struct vm_account { struct list_head possible_pinners; struct mem_cgroup *memcg; struct pages **pages; [...] }; Unpinnig involves finding a new owner by traversing the list of page->memcg_data->possible_pinners and iterating over *pages[] to figure out if that vm_account actually has this page pinned or not and could own it. Agree this is costly though. And I don't think all drivers keep the array around so "iterating over *pages[]" may need to be a callback. > Jason