Re: [PATCH 2/4] mm, swap: Move setup_swap_clusters_info() after SWP_SOLIDSTATE initialization

From: Kemeng Shi

Date: Mon Jul 20 2026 - 22:20:50 EST


在 2026/7/20 23:54:07, Luiz Capitulino 写道:
> On 2026-07-20 03:13, Kemeng Shi wrote:
>> In setup_swap_clusters_info(), SWP_SOLIDSTATE is used to decide
>> global_cluster allocation. Move setup_swap_clusters_info() after
>> SWP_SOLIDSTATE initialization to avoid unneeded global_cluster
>> allocation.
>>
>> Fixes: 451c6326105b2 ("mm, swap: clean up swapon process and locking")
>> Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx>
>
> I was about to send the same fix :) (one nit below)
What a coincidence :)>
>> ---
>>   mm/swapfile.c | 13 ++++++++-----
>>   1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/mm/swapfile.c b/mm/swapfile.c
>> index d29062d9c3cd..81c4040912be 100644
>> --- a/mm/swapfile.c
>> +++ b/mm/swapfile.c
>> @@ -3607,11 +3607,6 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
>>         maxpages = si->max;
>>   -    /* Set up the swap cluster info */
>> -    error = setup_swap_clusters_info(si, swap_header, maxpages);
>> -    if (error)
>> -        goto bad_swap_unlock_inode;
>> -
>>       if (si->bdev && bdev_stable_writes(si->bdev))
>>           si->flags |= SWP_STABLE_WRITES;
>>   @@ -3625,6 +3620,14 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
>>           inced_nr_rotate_swap = true;
>>       }
>>   +    /*
>> +     * Set up the swap cluster info. SWP_SOLIDSTATE is used for
>> +     * global_cluster allocation
>> +     */
>
> Maybe something like:
>
> /*
>  * Set up the swap cluster info after SWP_ flags handling as
>  * setup_swap_clusters_info() checks SWP_SOLIDSTATE.
>  */
Thanks for feedback. I will do this in next version.>
> As it's minor:
>
> Reviewed-by: Luiz Capitulino <luizcap@xxxxxxxxxx>
>
>> +    error = setup_swap_clusters_info(si, swap_header, maxpages);
>> +    if (error)
>> +        goto bad_swap_unlock_inode;
>> +
>>       if ((swap_flags & SWAP_FLAG_DISCARD) &&
>>           si->bdev && bdev_max_discard_sectors(si->bdev)) {
>>           /*
>