Re: [RFC PATCH v3 4/4] mm/shmem: split large folios only on -E2BIG

Barry Song <[email protected]>
Newsgroups org.kernel.vger.cgroups,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <CAGsJ_4z+uw0YdWMwJzxHA6kbV1wPaqSXhFzwT65ffj1drSmnbw@mail.gmail.com>
On Fri, Jul 17, 2026 at 8:26 PM Xueyuan Chen <[email protected]> wrote:
>
> shmem_writeout() currently splits a large folio on every
> folio_alloc_swap() failure. With the refined return-value contract, only
> -E2BIG indicates that splitting might allow smaller folios to be swapped
> out.
>
> Enter the split fallback only for -E2BIG. For -ENOSPC and -ENOMEM,
> redirty and reactivate the folio as before.
>
> Suggested-by: Baolin Wang <[email protected]>
> Signed-off-by: Xueyuan Chen <[email protected]>
> ---
>  mm/shmem.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 3b5dc21b323c..d76812dd3cef 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -1599,6 +1599,7 @@ int shmem_writeout(struct folio *folio, struct swap_iocb **plug,
>         struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
>         pgoff_t index;
>         int nr_pages;
> +       int ret;
>         bool split = false;
>
>         if ((info->flags & SHMEM_F_LOCKED) || sbinfo->noswap)
> @@ -1679,7 +1680,8 @@ int shmem_writeout(struct folio *folio, struct swap_iocb **plug,
>                 folio_mark_uptodate(folio);
>         }
>
> -       if (!folio_alloc_swap(folio)) {
> +       ret = folio_alloc_swap(folio);
> +       if (!ret) {
>                 bool first_swapped = shmem_recalc_inode(inode, 0, nr_pages);
>                 int error;
>
> @@ -1732,7 +1734,7 @@ int shmem_writeout(struct folio *folio, struct swap_iocb **plug,
>                 swap_cache_del_folio(folio);
>                 goto redirty;
>         }
> -       if (nr_pages > 1)
> +       if (ret == -E2BIG)

I'd rather keep if (nr_pages > 1 && ret == -E2BIG), as it makes the large
folio case more explicit and easier to understand.

>                 goto try_split;
>  redirty:
>         folio_mark_dirty(folio);


Best Regards
Barry
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.