Re: [PATCH v3] mm, compaction: Skip all non-migratable pages during scan

From: David Hildenbrand
Date: Fri May 19 2023 - 05:51:55 EST


On 18.05.23 03:09, Huang, Ying wrote:
David Hildenbrand <david@xxxxxxxxxx> writes:

On 17.05.23 18:15, Khalid Aziz wrote:
Pages pinned in memory through extra refcounts can not be migrated.
Currently as isolate_migratepages_block() scans pages for
compaction, it skips any pinned anonymous pages. All non-migratable
pages should be skipped and not just the anonymous pinned pages.
This patch adds a check for extra refcounts on a page to determine
if the page can be migrated. This was seen as a real issue on a
customer workload where a large number of pages were pinned by vfio
on the host and any attempts to allocate hugepages resulted in
significant amount of cpu time spent in either direct compaction or
in kcompactd scanning vfio pinned pages over and over again that can
not be migrated.

How will this change affect alloc_contig_range(), such as used for CMA
allocations or virtio-mem? alloc_contig_range() ends up calling
isolate_migratepages_range() -> isolate_migratepages_block().

IIUC, cc->alloc_contig can be used to distinguish contiguous allocation
and compaction. And, from the original commit which introduced
anonymous pages skipping (commit 119d6d59dcc0 ("mm, compaction: avoid
isolating pinned pages ")) and this patch, large number of migration
failure during compaction causes real issue too. So, I suggest to use
cc->alloc_contig here.

Agreed. I further wonder if we want to special-case the !alloc_contig case also for MIGRATE_CMA and ZONE_MOVABLE, where we cannot have longterm page pinnings (e.g., vfio pinned pages).

--
Thanks,

David / dhildenb