mm: add softleaf_is_valid_pmd_entry(), pmd_to_softleaf_folio()

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.

Link: https://lkml.kernel.org/r/b677592596274fa3fd701890497948e4b0e07cec.1774029655.git.ljs@kernel.org
Signed-off-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Reviewed-by: Suren Baghdasaryan <surenb@google.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Nico Pache <npache@redhat.com>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
master
Lorenzo Stoakes (Oracle) 2026-03-20 18:07:28 +00:00 committed by Andrew Morton
parent f87854c909
commit 64b7d889d0
1 changed files with 35 additions and 4 deletions

View File

@ -607,7 +607,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
@ -620,9 +633,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 */