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

mm: Add folio_raw_mapping()

Convert __page_rmapping to folio_raw_mapping and move it to mm/internal.h.
It's only a couple of instructions (load and mask), so it's definitely
going to be cheaper to inline it than call it. Leave page_rmapping
out of line. Change page_anon_vma() to not call folio_raw_mapping() --
it's more efficient to do the subtraction than the mask.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>

+11 -16
+7
mm/internal.h
··· 34 34 35 35 void page_writeback_init(void); 36 36 37 + static inline void *folio_raw_mapping(struct folio *folio) 38 + { 39 + unsigned long mapping = (unsigned long)folio->mapping; 40 + 41 + return (void *)(mapping & ~PAGE_MAPPING_FLAGS); 42 + } 43 + 37 44 vm_fault_t do_swap_page(struct vm_fault *vmf); 38 45 void folio_rotate_reclaimable(struct folio *folio); 39 46
+4 -16
mm/util.c
··· 654 654 } 655 655 EXPORT_SYMBOL(kvrealloc); 656 656 657 - static inline void *__page_rmapping(struct page *page) 658 - { 659 - unsigned long mapping; 660 - 661 - mapping = (unsigned long)page->mapping; 662 - mapping &= ~PAGE_MAPPING_FLAGS; 663 - 664 - return (void *)mapping; 665 - } 666 - 667 657 /* Neutral page->mapping pointer to address_space or anon_vma or other */ 668 658 void *page_rmapping(struct page *page) 669 659 { 670 - page = compound_head(page); 671 - return __page_rmapping(page); 660 + return folio_raw_mapping(page_folio(page)); 672 661 } 673 662 674 663 /** ··· 688 699 689 700 struct anon_vma *page_anon_vma(struct page *page) 690 701 { 691 - unsigned long mapping; 702 + struct folio *folio = page_folio(page); 703 + unsigned long mapping = (unsigned long)folio->mapping; 692 704 693 - page = compound_head(page); 694 - mapping = (unsigned long)page->mapping; 695 705 if ((mapping & PAGE_MAPPING_FLAGS) != PAGE_MAPPING_ANON) 696 706 return NULL; 697 - return __page_rmapping(page); 707 + return (void *)(mapping - PAGE_MAPPING_ANON); 698 708 } 699 709 700 710 /**