On Wednesday, 12 January 2022 10:06:03 PM AEDT Alistair Popple wrote: > I have been looking at this in relation to the migration code and noticed we > have the following in try_to_migrate(): > > if (is_zone_device_page(page) && !is_device_private_page(page)) > return; > > Which if I'm understanding correctly means that migration of device coherent > pages will always fail. Given that I do wonder how hmm-tests are passing, but > I assume you must always be hitting this fast path in > migrate_vma_collect_pmd(): > > /* > * Optimize for the common case where page is only mapped once > * in one process. If we can lock the page, then we can safely > * set up a special migration page table entry now. > */ > > Meaning that try_to_migrate() never gets called from migrate_vma_unmap(). So > you will also need some changes to try_to_migrate() and possibly > try_to_migrate_one() to make this reliable. I have been running the hmm tests with the changes below. I'm pretty sure these are correct because the only zone device pages try_to_migrate_one() should be called on are device coherent/private, and coherent pages can be treated just the same as a normal pages for migration. However it would be worth checking I haven't missed anything. - Alistair --- diff --git a/mm/rmap.c b/mm/rmap.c index 163ac4e6bcee..15f56c27daab 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1806,7 +1806,7 @@ static bool try_to_migrate_one(struct page *page, struct vm_area_struct *vma, /* Update high watermark before we lower rss */ update_hiwater_rss(mm); - if (is_zone_device_page(page)) { + if (is_device_private_page(page)) { unsigned long pfn = page_to_pfn(page); swp_entry_t entry; pte_t swp_pte; @@ -1947,7 +1947,7 @@ void try_to_migrate(struct page *page, enum ttu_flags flags) TTU_SYNC))) return; - if (is_zone_device_page(page) && !is_device_private_page(page)) + if (is_zone_device_page(page) && !is_device_page(page)) return; /*