On Thu, Feb 17, 2022 at 04:12:20PM -0500, Felix Kuehling wrote: > I'm thinking of a more theoretical approach: Instead of auditing all users, > I'd ask, what are the invariants that a vm_normal_page should have. Then > check, whether our DEVICE_COHERENT pages satisfy them. But maybe the concept > of a vm_normal_page isn't defined clearly enough for that. I would say the expectation is that only 'page cache and anon' pages are returned - ie the first union in struct page This is because the first file in your list I looked at: static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { page = vm_normal_page(vma, addr, ptent); [..] if (pageout) { if (!isolate_lru_page(page)) { Uses the LRU field, so this is incompatible with all the other page types. One mitigation of this might be to formally make vm_normal_page() == 'pte to page cache and anon page' and add a new function that is 'pte to any struct page' Then go through and sort callers as appropriate. The 'pte to page cache and anon page' can detect ZONE_DEVICE by calling is_zone_device_page() insted of pte_devmap() and then continue to return NULL. This same trick will fix GUP_fast. Jason