mm/page_ext: Add page_ext_get_from_phys()

The IOMMU code operates on physical addresses which can be outside
of system RAM.

Add a new function page_ext_get_from_phys() to abstract the logic of
checking the address and returning the page_ext.

Signed-off-by: Mostafa Saleh <smostafa@google.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
Mostafa Saleh 2026-01-20 09:19:25 +00:00 committed by Joerg Roedel
parent 2e2f6b0ef8
commit d414b83dc5
2 changed files with 29 additions and 0 deletions

View file

@ -93,6 +93,7 @@ static inline bool page_ext_iter_next_fast_possible(unsigned long next_pfn)
#endif
extern struct page_ext *page_ext_get(const struct page *page);
extern struct page_ext *page_ext_from_phys(phys_addr_t phys);
extern void page_ext_put(struct page_ext *page_ext);
extern struct page_ext *page_ext_lookup(unsigned long pfn);
@ -215,6 +216,11 @@ static inline struct page_ext *page_ext_get(const struct page *page)
return NULL;
}
static inline struct page_ext *page_ext_from_phys(phys_addr_t phys)
{
return NULL;
}
static inline void page_ext_put(struct page_ext *page_ext)
{
}

View file

@ -538,6 +538,29 @@ struct page_ext *page_ext_get(const struct page *page)
return page_ext;
}
/**
* page_ext_from_phys() - Get the page_ext structure for a physical address.
* @phys: The physical address to query.
*
* This function safely gets the `struct page_ext` associated with a given
* physical address. It performs validation to ensure the address corresponds
* to a valid, online struct page before attempting to access it.
* It returns NULL for MMIO, ZONE_DEVICE, holes and offline memory.
*
* Return: NULL if no page_ext exists for this physical address.
* Context: Any context. Caller may not sleep until they have called
* page_ext_put().
*/
struct page_ext *page_ext_from_phys(phys_addr_t phys)
{
struct page *page = pfn_to_online_page(__phys_to_pfn(phys));
if (!page)
return NULL;
return page_ext_get(page);
}
/**
* page_ext_put() - Working with page extended information is done.
* @page_ext: Page extended information received from page_ext_get().