[PATCH 4/5] mm: shmem: keep inode in swaplist when failed to allocate swap entry in shmem_writepage()

Kemeng Shi posted 5 patches 9 months ago
There is a newer version of this series
[PATCH 4/5] mm: shmem: keep inode in swaplist when failed to allocate swap entry in shmem_writepage()
Posted by Kemeng Shi 9 months ago
Even if we fail to allocate a swap entry, the inode might have previously
allocated entry and we might take inode containing swap entry off swaplist.
As a result, try_to_unuse() may enter a potential dead loop to repeatedly
look for inode and clean it's swap entry.
Address this by keeping inode in swaplist even if we fail to allocate
swap entry as it does not pose significant problem to keep inode without
swap entry in swaplist.

Fixes: b487a2da3575b ("mm, swap: simplify folio swap allocation")
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
---
 mm/shmem.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index 0fed94c2bc09..dfd2f730833c 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1651,8 +1651,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
 		BUG_ON(folio_mapped(folio));
 		return swap_writepage(&folio->page, wbc);
 	}
-
-	list_del_init(&info->swaplist);
 	mutex_unlock(&shmem_swaplist_mutex);
 	if (nr_pages > 1)
 		goto try_split;
-- 
2.30.0
Re: [PATCH 4/5] mm: shmem: keep inode in swaplist when failed to allocate swap entry in shmem_writepage()
Posted by Baolin Wang 9 months ago

On 2025/5/15 00:50, Kemeng Shi wrote:
> Even if we fail to allocate a swap entry, the inode might have previously
> allocated entry and we might take inode containing swap entry off swaplist.
> As a result, try_to_unuse() may enter a potential dead loop to repeatedly
> look for inode and clean it's swap entry.
> Address this by keeping inode in swaplist even if we fail to allocate
> swap entry as it does not pose significant problem to keep inode without
> swap entry in swaplist.
> 
> Fixes: b487a2da3575b ("mm, swap: simplify folio swap allocation")
> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
> ---
>   mm/shmem.c | 2 --
>   1 file changed, 2 deletions(-)
> 
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 0fed94c2bc09..dfd2f730833c 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -1651,8 +1651,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
>   		BUG_ON(folio_mapped(folio));
>   		return swap_writepage(&folio->page, wbc);
>   	}
> -
> -	list_del_init(&info->swaplist);

If 'info->swapped' is 0, we can still remove it?
Re: [PATCH 4/5] mm: shmem: keep inode in swaplist when failed to allocate swap entry in shmem_writepage()
Posted by Kemeng Shi 9 months ago

on 5/14/2025 5:31 PM, Baolin Wang wrote:
> 
> 
> On 2025/5/15 00:50, Kemeng Shi wrote:
>> Even if we fail to allocate a swap entry, the inode might have previously
>> allocated entry and we might take inode containing swap entry off swaplist.
>> As a result, try_to_unuse() may enter a potential dead loop to repeatedly
>> look for inode and clean it's swap entry.
>> Address this by keeping inode in swaplist even if we fail to allocate
>> swap entry as it does not pose significant problem to keep inode without
>> swap entry in swaplist.
>>
>> Fixes: b487a2da3575b ("mm, swap: simplify folio swap allocation")
>> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
>> ---
>>   mm/shmem.c | 2 --
>>   1 file changed, 2 deletions(-)
>>
>> diff --git a/mm/shmem.c b/mm/shmem.c
>> index 0fed94c2bc09..dfd2f730833c 100644
>> --- a/mm/shmem.c
>> +++ b/mm/shmem.c
>> @@ -1651,8 +1651,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
>>           BUG_ON(folio_mapped(folio));
>>           return swap_writepage(&folio->page, wbc);
>>       }
>> -
>> -    list_del_init(&info->swaplist);
> 
> If 'info->swapped' is 0, we can still remove it?
> 
Sure, both approaches are acceptable to me: either keep it in list unconditionlly as it was done in old
behavior, or remove it if it's info->swapped is 0.