Commit 64b7d889 authored by Lorenzo Stoakes (Oracle)'s avatar Lorenzo Stoakes (Oracle) Committed by Andrew Morton
Browse files

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: default avatarLorenzo Stoakes (Oracle) <ljs@kernel.org>
Reviewed-by: default avatarSuren 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent f87854c9
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -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 */