Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Mostafa Saleh and committed by
Joerg Roedel
d414b83d 2e2f6b0e

+29
+6
include/linux/page_ext.h
··· 93 93 #endif 94 94 95 95 extern struct page_ext *page_ext_get(const struct page *page); 96 + extern struct page_ext *page_ext_from_phys(phys_addr_t phys); 96 97 extern void page_ext_put(struct page_ext *page_ext); 97 98 extern struct page_ext *page_ext_lookup(unsigned long pfn); 98 99 ··· 212 211 } 213 212 214 213 static inline struct page_ext *page_ext_get(const struct page *page) 214 + { 215 + return NULL; 216 + } 217 + 218 + static inline struct page_ext *page_ext_from_phys(phys_addr_t phys) 215 219 { 216 220 return NULL; 217 221 }
+23
mm/page_ext.c
··· 539 539 } 540 540 541 541 /** 542 + * page_ext_from_phys() - Get the page_ext structure for a physical address. 543 + * @phys: The physical address to query. 544 + * 545 + * This function safely gets the `struct page_ext` associated with a given 546 + * physical address. It performs validation to ensure the address corresponds 547 + * to a valid, online struct page before attempting to access it. 548 + * It returns NULL for MMIO, ZONE_DEVICE, holes and offline memory. 549 + * 550 + * Return: NULL if no page_ext exists for this physical address. 551 + * Context: Any context. Caller may not sleep until they have called 552 + * page_ext_put(). 553 + */ 554 + struct page_ext *page_ext_from_phys(phys_addr_t phys) 555 + { 556 + struct page *page = pfn_to_online_page(__phys_to_pfn(phys)); 557 + 558 + if (!page) 559 + return NULL; 560 + 561 + return page_ext_get(page); 562 + } 563 + 564 + /** 542 565 * page_ext_put() - Working with page extended information is done. 543 566 * @page_ext: Page extended information received from page_ext_get(). 544 567 *