From: Chengming Zhou <chengming.zhou@linux.dev>
To: Nhat Pham <nphamcs@gmail.com>, akpm@linux-foundation.org
Cc: hannes@cmpxchg.org, yosryahmed@google.com, yosry.ahmed@linux.dev,
linux-mm@kvack.org, kernel-team@meta.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] page_io: return proper error codes for swap_read_folio_zeromap()
Date: Fri, 7 Mar 2025 11:08:45 +0800 [thread overview]
Message-ID: <2de2e9d7-fed0-4b12-ad46-c1c929536841@linux.dev> (raw)
In-Reply-To: <20250306230015.1456794-1-nphamcs@gmail.com>
On 2025/3/7 07:00, Nhat Pham wrote:
> Similar to zswap_load(), also return proper error codes for
> swap_read_folio_zeromap():
>
> * 0 on success. The folio is unlocked and marked up-to-date.
> * -ENOENT, if the folio is entirely not zeromapped.
> * -EINVAL (with the follio unlocked but not marked to date), if the
> folio is partially zeromapped. This is not supported, and will SIGBUS
> the faulting process.
>
> This patch is purely a clean-up, and should not have any behavioral
> change. It is based on (and should be applied on top of) [1].
>
> [1]: https://lore.kernel.org/linux-mm/20250306205011.784787-1-nphamcs@gmail.com/
>
> Suggested-by: Yosry Ahmed <yosry.ahmed@linux.dev>
> Suggested-by: Johannes Weiner <hannes@cmpxchg.org>
> Signed-off-by: Nhat Pham <nphamcs@gmail.com>
Reviewed-by: Chengming Zhou <chengming.zhou@linux.dev>
Thanks!
> ---
> mm/page_io.c | 35 ++++++++++++++++++++++++++---------
> 1 file changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/mm/page_io.c b/mm/page_io.c
> index 4bce19df557b..48ed1e810392 100644
> --- a/mm/page_io.c
> +++ b/mm/page_io.c
> @@ -511,7 +511,23 @@ static void sio_read_complete(struct kiocb *iocb, long ret)
> mempool_free(sio, sio_pool);
> }
>
> -static bool swap_read_folio_zeromap(struct folio *folio)
> +/**
> + * swap_read_folio_zeromap - check if the folio was zeromapped, and if so,
> + * zero-fill it.
> + * @folio: the folio.
> + *
> + * Return: 0 on success, with the folio zero-filled, unlocked, and marked
> + * up-to-date, or one of the following error codes:
> + *
> + * -ENOENT: the folio is entirely not zeromapped. The folio remains locked.
> + *
> + * -EINVAL: some of the subpages in the folio are zeromaped, but not all of
> + * them. This is an error because we don't currently support a large folio
> + * that is partially in the zeromap. The folio is unlocked, but NOT marked
> + * up-to-date, so that an IO error is emitted (e.g. do_swap_page() will
> + * sigbus).
> + */
> +static int swap_read_folio_zeromap(struct folio *folio)
> {
> int nr_pages = folio_nr_pages(folio);
> struct obj_cgroup *objcg;
> @@ -519,15 +535,17 @@ static bool swap_read_folio_zeromap(struct folio *folio)
>
> /*
> * Swapping in a large folio that is partially in the zeromap is not
> - * currently handled. Return true without marking the folio uptodate so
> + * currently handled. Return -EINVAL without marking the folio uptodate so
> * that an IO error is emitted (e.g. do_swap_page() will sigbus).
> */
> if (WARN_ON_ONCE(swap_zeromap_batch(folio->swap, nr_pages,
> - &is_zeromap) != nr_pages))
> - return true;
> + &is_zeromap) != nr_pages)) {
> + folio_unlock(folio);
> + return -EINVAL;
> + }
>
> if (!is_zeromap)
> - return false;
> + return -ENOENT;
>
> objcg = get_obj_cgroup_from_folio(folio);
> count_vm_events(SWPIN_ZERO, nr_pages);
> @@ -538,7 +556,8 @@ static bool swap_read_folio_zeromap(struct folio *folio)
>
> folio_zero_range(folio, 0, folio_size(folio));
> folio_mark_uptodate(folio);
> - return true;
> + folio_unlock(folio);
> + return 0;
> }
>
> static void swap_read_folio_fs(struct folio *folio, struct swap_iocb **plug)
> @@ -635,10 +654,8 @@ void swap_read_folio(struct folio *folio, struct swap_iocb **plug)
> }
> delayacct_swapin_start();
>
> - if (swap_read_folio_zeromap(folio)) {
> - folio_unlock(folio);
> + if (swap_read_folio_zeromap(folio) != -ENOENT)
> goto finish;
> - }
>
> if (zswap_load(folio) != -ENOENT)
> goto finish;
next prev parent reply other threads:[~2025-03-07 3:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-06 23:00 [PATCH] page_io: return proper error codes for swap_read_folio_zeromap() Nhat Pham
2025-03-06 23:42 ` Yosry Ahmed
2025-03-07 17:03 ` Nhat Pham
2025-03-07 1:38 ` Johannes Weiner
2025-03-07 3:08 ` Chengming Zhou [this message]
2025-03-07 23:34 ` [PATCH] page_io: return proper error codes for swap_read_folio_zeromap() (fix) Nhat Pham
2025-04-01 18:55 ` [PATCH] page_io: return proper error codes for swap_read_folio_zeromap() Nhat Pham
2025-04-01 19:01 ` Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2de2e9d7-fed0-4b12-ad46-c1c929536841@linux.dev \
--to=chengming.zhou@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=yosry.ahmed@linux.dev \
--cc=yosryahmed@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.