On 2022-02-15 14:41, Jason Gunthorpe wrote:
On Tue, Feb 15, 2022 at 07:32:09PM +0100, Christoph Hellwig wrote:
On Tue, Feb 15, 2022 at 10:45:24AM -0400, Jason Gunthorpe wrote:
Do you know if DEVICE_GENERIC pages would end up as PageAnon()? My
assumption was that they would be part of a special mapping.
We need to stop using the special PTEs and VMAs for things that have a
struct page. This is a mistake DAX created that must be undone.
Yes, we'll get to it. Maybe we can do it for the non-DAX devmap
ptes first given that DAX is more complicated.
Probably, I think we can check the page->pgmap type to tell the
difference.
I'm not sure how the DEVICE_GENERIC can work without this, as DAX was
made safe by using the unmap_mapping_range(), which won't work
here. Is there some other trick being used to keep track of references
inside the AMD driver?
Not sure I'm following all the discussion about VMAs and DAX. So I may
be answering the wrong question: We treat each ZONE_DEVICE page as a
reference to the BO (buffer object) that backs the page. We increment
the BO refcount for each page we migrate into it. In the
dev_pagemap_ops.page_free callback we drop that reference. Once all
pages backed by a BO are freed, the BO refcount reaches 0 [*] and we can
free the BO allocation.
Regards,
Felix
[*] That's a somewhat simplified view. There may be other references to
the BO, which allows us to reuse the same BO for the same virtual
address range.
Jason