Re: [PATCH] mm/page_alloc: make percpu_pagelist_high_fraction reads lock-free
From: David Hildenbrand (Red Hat)
Date: Wed Dec 03 2025 - 04:15:28 EST
On 12/3/25 09:59, Gregory Price wrote:
On Wed, Dec 03, 2025 at 09:42:59AM +0100, Michal Hocko wrote:
On Wed 03-12-25 03:35:51, Gregory Price wrote:
if (!ret) {
/*
* TODO: fatal migration failures should bail
* out
*/
do_migrate_range(pfn, end_pfn);
}
Maybe it's time to implement the bail out?
That would be great but can we tell transient from permanent migration
failures? Maybe long term pins could be treated as permanent failure.
I see deep in migration code `migrate_pages_batch()` we would return
"Some other failure" as fatal:
switch(rc) {
case -ENOMEM:
...
/* Note: some long-term pin handing is done here */
break;
case -EAGAIN:
...
break;
case 0:
...
list_move_tail(&folio->lru, &unmap_folios);
list_add_tail(&dst->lru, &dst_folios);
break;
default:
/*
* Permanent failure (-EBUSY, etc.):
* unlike -EAGAIN case, the failed folio is
* removed from migration folio list and not
* retried in the next outer loop.
*/
nr_failed++;
stats->nr_thp_failed += is_thp;
stats->nr_failed_pages += nr_pages;
break;
}
So at a minimum we could at least check for !(ENOMEM,EAGAIN) I suppose?
It's unclear to me based on this code here how longerm pinning would
return. Maybe David knows.
I would assume that additional references will always result in -EAGAIN. Remember that we cannot distinguish short-term pins from long-term pins.
We should never have longterm-pins on ZONE_MOVABLE, unless something broke that contract and needs to be fixed.
--
Cheers
David