Re: [PATCH v3 11/13] mm: add softleaf_is_valid_pmd_entry(), pmd_to_softleaf_folio()

From: Suren Baghdasaryan

Date: Sat Mar 28 2026 - 15:32:06 EST


On Fri, Mar 20, 2026 at 11:08 AM Lorenzo Stoakes (Oracle)
<ljs@xxxxxxxxxx> wrote:
>
> Separate pmd_is_valid_softleaf() into separate components, then use the
> pmd_is_valid_softleaf() predicate to implement pmd_to_softleaf_folio().

nit: I strongly suspect we'll find out why you need
pmd_to_softleaf_folio() in one of the later patches. Not a big deal
but it might be better to introduce it in the patch where you use it.
Anyway, this is minor and not worth refactoring.

>
> This returns the folio associated with a softleaf entry at PMD level. It
> expects this to be valid for a PMD entry.
>
> If CONFIG_DEBUG_VM is set, then assert on this being an invalid entry, and
> either way return NULL in this case.
>
> This lays the ground for further refactorings.
>
> Signed-off-by: Lorenzo Stoakes (Oracle) <ljs@xxxxxxxxxx>

Reviewed-by: Suren Baghdasaryan <surenb@xxxxxxxxxx>

> ---
> include/linux/leafops.h | 39 +++++++++++++++++++++++++++++++++++----
> 1 file changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/include/linux/leafops.h b/include/linux/leafops.h
> index dd4130b7cb7f..65957283fa9f 100644
> --- a/include/linux/leafops.h
> +++ b/include/linux/leafops.h
> @@ -603,7 +603,20 @@ static inline bool pmd_is_migration_entry(pmd_t pmd)
> }
>
> /**
> - * pmd_is_valid_softleaf() - Is this PMD entry a valid leaf entry?
> + * softleaf_is_valid_pmd_entry() - Is the specified softleaf entry obtained from
> + * a PMD one that we support at PMD level?
> + * @entry: Entry to check.
> + * Returns: true if the softleaf entry is valid at PMD, otherwise false.
> + */
> +static inline bool softleaf_is_valid_pmd_entry(softleaf_t entry)
> +{
> + /* Only device private, migration entries valid for PMD. */
> + return softleaf_is_device_private(entry) ||
> + softleaf_is_migration(entry);
> +}
> +
> +/**
> + * pmd_is_valid_softleaf() - Is this PMD entry a valid softleaf entry?
> * @pmd: PMD entry.
> *
> * PMD leaf entries are valid only if they are device private or migration
> @@ -616,9 +629,27 @@ static inline bool pmd_is_valid_softleaf(pmd_t pmd)
> {
> const softleaf_t entry = softleaf_from_pmd(pmd);
>
> - /* Only device private, migration entries valid for PMD. */
> - return softleaf_is_device_private(entry) ||
> - softleaf_is_migration(entry);
> + return softleaf_is_valid_pmd_entry(entry);
> +}
> +
> +/**
> + * pmd_to_softleaf_folio() - Convert the PMD entry to a folio.
> + * @pmd: PMD entry.
> + *
> + * The PMD entry is expected to be a valid PMD softleaf entry.
> + *
> + * Returns: the folio the softleaf entry references if this is a valid softleaf
> + * entry, otherwise NULL.
> + */
> +static inline struct folio *pmd_to_softleaf_folio(pmd_t pmd)
> +{
> + const softleaf_t entry = softleaf_from_pmd(pmd);
> +
> + if (!softleaf_is_valid_pmd_entry(entry)) {
> + VM_WARN_ON_ONCE(true);
> + return NULL;
> + }
> + return softleaf_to_folio(entry);
> }
>
> #endif /* CONFIG_MMU */
> --
> 2.53.0
>