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

Lorenzo Stoakes (Oracle) posted 13 patches 2 weeks ago
[PATCH v3 11/13] mm: add softleaf_is_valid_pmd_entry(), pmd_to_softleaf_folio()
Posted by Lorenzo Stoakes (Oracle) 2 weeks ago
Separate pmd_is_valid_softleaf() into separate components, then use the
pmd_is_valid_softleaf() predicate to implement pmd_to_softleaf_folio().

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@kernel.org>
---
 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
Re: [PATCH v3 11/13] mm: add softleaf_is_valid_pmd_entry(), pmd_to_softleaf_folio()
Posted by Suren Baghdasaryan 6 days, 7 hours ago
On Fri, Mar 20, 2026 at 11:08 AM Lorenzo Stoakes (Oracle)
<ljs@kernel.org> 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@kernel.org>

Reviewed-by: Suren Baghdasaryan <surenb@google.com>

> ---
>  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
>