With DEVICE_COHERENT, we'll soon have vm_normal_pages() return device-managed anonymous pages that are not LRU pages. Although they behave like normal pages for purposes of mapping in CPU page, and for COW. They do not support LRU lists, NUMA migration or THP. The difference between new vm_normal_lru_pages vs vm_normal_pages() is, the former makes sure to return pages that are LRU handled only. We also introduced a FOLL_LRU flag that adds the same behaviour to follow_page and related APIs, to allow callers to specify that they expect to put pages on an LRU list. HMM tests were added to selftest to excercise these changes with device coherent pages. New test called hmm_cow_in_device, will test pages marked as COW, allocated in device zone. Also, more configurations were added into hmm_gup_test to test basic get user pages and get user pages fast paths in device zone pages. v2: - Changed the general description for this cover letter. - Changed commit message for patch 1/3. - Keep vm_normal_pages and add vm_normal_lru_pages, instead of rename both. - Add proper kernel-doc format to new function and minimize code churn. TODO: vm_normal_pages with pte_devmap entries still return NULL, instead of return the actual device page. The reason is page->_mapcount is never incremented for device pages that are mmap through DAX mechanism using pmem driver mounted into ext4 filesystem. When these pages are unmap, zap_pte_range is called and vm_normal_page return a valid page with page_mapcount() = 0, before page_remove_rmap is called. Alex Sierra (3): mm: add vm_normal_lru_pages for LRU handled pages only tools: add more gup configs to hmm_gup selftests tools: add selftests to hmm for COW in device memory fs/proc/task_mmu.c | 2 +- include/linux/mm.h | 9 +- mm/gup.c | 8 +- mm/huge_memory.c | 2 +- mm/khugepaged.c | 8 +- mm/ksm.c | 4 +- mm/madvise.c | 4 +- mm/memory.c | 40 ++++++- mm/mempolicy.c | 4 +- mm/migrate.c | 2 +- mm/mlock.c | 6 +- mm/mprotect.c | 2 +- tools/testing/selftests/vm/hmm-tests.c | 139 +++++++++++++++++++++---- 13 files changed, 187 insertions(+), 43 deletions(-) -- 2.32.0