Re: [PATCH] mm/mincore: handle non-swap entries before !CONFIG_SWAP guard

From: Usama Arif

Date: Wed Jun 03 2026 - 08:20:17 EST




On 03/06/2026 13:08, Lorenzo Stoakes wrote:
> On Tue, Jun 02, 2026 at 10:22:47AM -0700, Usama Arif wrote:
>> mincore_swap() also fields migration/hwpoison entries (and shmem
>> swapin-error entries), which can exist on !CONFIG_SWAP builds when
>> CONFIG_MIGRATION or CONFIG_MEMORY_FAILURE is enabled. The
>> !IS_ENABLED(CONFIG_SWAP) guard ran before the non-swap-entry early
>> return, so mincore_pte_range() can spuriously WARN and report these
>> pages nonresident on !CONFIG_SWAP kernels.
>>
>> Move the guard below the non-swap-entry check so only true swap
>> entries trip the WARN, and migration/hwpoison entries take the
>> existing "uptodate / non-shmem" path.
>>
>> Fixes: 1f2052755c15 ("mm/mincore: use a helper for checking the swap cache")
>> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
>
> Logic LGTM so:
>
> Reviewed-by: Lorenzo Stoakes <ljs@xxxxxxxxxx>
>
> Small note below but I think not a problem.
>
> Thanks, Lorenzo
>
>> ---
>> This was discovered when working on PMD swap entry series
>> (https://lore.kernel.org/all/20260602142537.198755-1-usama.arif@xxxxxxxxx/)
>> ---
>> mm/mincore.c | 10 +++++-----
>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/mm/mincore.c b/mm/mincore.c
>> index e5d13eea9234..296f2e3922b5 100644
>> --- a/mm/mincore.c
>> +++ b/mm/mincore.c
>> @@ -64,11 +64,6 @@ static unsigned char mincore_swap(swp_entry_t entry, bool shmem)
>> struct folio *folio = NULL;
>> unsigned char present = 0;
>>
>> - if (!IS_ENABLED(CONFIG_SWAP)) {
>> - WARN_ON(1);
>> - return 0;
>> - }
>> -
>> /*
>> * Shmem mapping may contain swapin error entries, which are
>> * absent. Page table may contain migration or hwpoison
>> @@ -77,6 +72,11 @@ static unsigned char mincore_swap(swp_entry_t entry, bool shmem)
>> if (!softleaf_is_swap(entry))
>> return !shmem;
>>
>
> I guess fine to do this after software_is_swap() because for !CONFIG_SWAP this
> will always evaluate false?

Yes, thats right. In softleaf_is_swap(), softleaf_type() returns SOFTLEAF_SWAP
iff type_num < MAX_SWAPFILES. MAX_SWAPFILES is a compile-time constant independent
of CONFIG_SWAP, so softleaf_is_swap() isn't structurally gated, but every producer
of real swap entries lives under CONFIG_SWAP.
With !CONFIG_SWAP none of those run, so softleaf_is_swap() is always false.

>
> Not a big deal therefore I think.
>
>> + if (!IS_ENABLED(CONFIG_SWAP)) {
>> + WARN_ON(1);
>> + return 0;
>> + }
>> +
>> /*
>> * Shmem mapping lookup is lockless, so we need to grab the swap
>> * device. mincore page table walk locks the PTL, and the swap
>> --
>> 2.52.0
>>