Re: [PATCH v2 2/4] mm: gup: allow long-term pins of CMA-allocated HugeTLB folios

From: Muchun Song

Date: Thu Nov 05 2026 - 21:54:52 EST




> On Nov 6, 2026, at 10:48, Qi Zheng <qi.zheng@xxxxxxxxx> wrote:
>
>
>
> On 11/5/26 1:13 PM, Muchun Song wrote:
>>> On Nov 5, 2026, at 12:07, Qi Zheng <qi.zheng@xxxxxxxxx> wrote:
>>>
>>> From: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
>>>
>>> Long-term pinning treats explicitly CMA-allocated HugeTLB folios as
>>> unpinnable, causing unnecessary migration or pinning failures.
>>>
>>> These folios already own their CMA bitmap ranges, and memory blocks
>>> overlapping CMA areas cannot be offlined. Allow HugeTLB folios with
>>> HPG_cma to be pinned directly, including in ZONE_MOVABLE.
>>>
>>> Fixes: cf11e85fc08c ("mm: hugetlb: optionally allocate gigantic hugepages using cma")
>>> Cc: stable@xxxxxxxxxxxxxxx
>>> Suggested-by: Muchun Song <muchun.song@xxxxxxxxx>
>>> Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
>> Acked-by: Muchun Song <muchun.song@xxxxxxxxx>
>
> Thanks.
>
>> But a nit bellow.
>>> ---
>>> include/linux/mm.h | 29 +----------------------------
>>> mm/gup.c | 31 +++++++++++++++++++++++++++++++
>>> 2 files changed, 32 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/include/linux/mm.h b/include/linux/mm.h
>>> index 2d0b8a4c9974f..75dd40265d3f4 100644
>>> --- a/include/linux/mm.h
>>> +++ b/include/linux/mm.h
>>> @@ -2975,35 +2975,8 @@ static inline bool is_zero_folio(const struct folio *folio)
>>> return is_zero_page(&folio->page);
>>> }
>>>
>>> -/* MIGRATE_CMA and ZONE_MOVABLE do not allow pin folios */
>>> #ifdef CONFIG_MIGRATION
>>> -static inline bool folio_is_longterm_pinnable(struct folio *folio)
>>> -{
>>> -#ifdef CONFIG_CMA
>>> - int mt = folio_migratetype(folio);
>>> -
>>> - if (mt == MIGRATE_CMA || mt == MIGRATE_ISOLATE)
>>> - return false;
>>> -#endif
>>> - /* The zero page can be "pinned" but gets special handling. */
>>> - if (is_zero_folio(folio))
>>> - return true;
>>> -
>>> - /* Coherent device memory must always allow eviction. */
>>> - if (folio_is_device_coherent(folio))
>>> - return false;
>>> -
>>> - /*
>>> - * Filesystems can only tolerate transient delays to truncate and
>>> - * hole-punch operations
>>> - */
>>> - if (folio_is_fsdax(folio))
>>> - return false;
>>> -
>>> - /* Otherwise, non-movable zone folios can be pinned. */
>>> - return !folio_is_zone_movable(folio);
>>> -
>>> -}
>>> +bool folio_is_longterm_pinnable(struct folio *folio);
>>> #else
>>> static inline bool folio_is_longterm_pinnable(struct folio *folio)
>>> {
>>> diff --git a/mm/gup.c b/mm/gup.c
>>> index 2b405cce2ca5c..e8503141bb275 100644
>>> --- a/mm/gup.c
>>> +++ b/mm/gup.c
>>> @@ -2216,6 +2216,37 @@ struct page *get_dump_page(unsigned long addr, int *locked)
>>>
>>> #ifdef CONFIG_MIGRATION
>>>
>>> +bool folio_is_longterm_pinnable(struct folio *folio)
>>> +{
>>> +#ifdef CONFIG_CMA
>>> + int mt = folio_migratetype(folio);
>>> +
>>> + /* Explicit HugeTLB CMA allocations own their bitmap ranges. */
>> The description of "bitmap ranges" is weird, making me think what's the meaning of
>> bitmap. Please use more generic description here.
>
> How about this:
>
> /* These HugeTLB folios own the CMA memory, so they can be long-term pinned. */
>

At least better than original.

Thanks,
Muchun

> Thanks,
> Qi