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. > We don't want to fail early in case there is a short-term pin that > might go away any moment after we isolated ... that will make the > situation worse for these use cases, especially if MIGRATE_CMA or > ZONE_MOVABLE is involved. Best Regards, Huang, Ying