mm/arch: provide pud_pfn() fallback
The comment in the code explains the reasons. We took a different approach comparing to pmd_pfn() by providing a fallback function. Another option is to provide some lower level config options (compare to HUGETLB_PAGE or THP) to identify which layer an arch can support for such huge mappings. However that can be an overkill. [peterx@redhat.com: fix loongson defconfig] Link: https://lkml.kernel.org/r/20240403013249.1418299-4-peterx@redhat.com Link: https://lkml.kernel.org/r/20240327152332.950956-6-peterx@redhat.com Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Ryan Roberts <ryan.roberts@arm.com> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Matthew Wilcox <willy@infradead.org> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Andrew Jones <andrew.jones@linux.dev> Cc: Aneesh Kumar K.V (IBM) <aneesh.kumar@kernel.org> Cc: Axel Rasmussen <axelrasmussen@google.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Christoph Hellwig <hch@infradead.org> Cc: David Hildenbrand <david@redhat.com> Cc: James Houghton <jthoughton@google.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Kirill A. Shutemov <kirill@shutemov.name> Cc: Lorenzo Stoakes <lstoakes@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Muchun Song <muchun.song@linux.dev> Cc: Rik van Riel <riel@surriel.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Yang Shi <shy828301@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
239e9a90c8
commit
35a76f5c08
|
@ -648,6 +648,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
|
|||
|
||||
#define __pud_to_phys(pud) (__page_val_to_pfn(pud_val(pud)) << PAGE_SHIFT)
|
||||
|
||||
#define pud_pfn pud_pfn
|
||||
static inline unsigned long pud_pfn(pud_t pud)
|
||||
{
|
||||
return ((__pud_to_phys(pud) & PUD_MASK) >> PAGE_SHIFT);
|
||||
|
|
|
@ -1405,6 +1405,7 @@ static inline unsigned long pud_deref(pud_t pud)
|
|||
return (unsigned long)__va(pud_val(pud) & origin_mask);
|
||||
}
|
||||
|
||||
#define pud_pfn pud_pfn
|
||||
static inline unsigned long pud_pfn(pud_t pud)
|
||||
{
|
||||
return __pa(pud_deref(pud)) >> PAGE_SHIFT;
|
||||
|
|
|
@ -875,6 +875,7 @@ static inline bool pud_leaf(pud_t pud)
|
|||
return pte_val(pte) & _PAGE_PMD_HUGE;
|
||||
}
|
||||
|
||||
#define pud_pfn pud_pfn
|
||||
static inline unsigned long pud_pfn(pud_t pud)
|
||||
{
|
||||
pte_t pte = __pte(pud_val(pud));
|
||||
|
|
|
@ -234,6 +234,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
|
|||
return (pfn & pmd_pfn_mask(pmd)) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
#define pud_pfn pud_pfn
|
||||
static inline unsigned long pud_pfn(pud_t pud)
|
||||
{
|
||||
phys_addr_t pfn = pud_val(pud);
|
||||
|
|
|
@ -1819,6 +1819,20 @@ typedef unsigned int pgtbl_mod_mask;
|
|||
#define pte_leaf_size(x) PAGE_SIZE
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We always define pmd_pfn for all archs as it's used in lots of generic
|
||||
* code. Now it happens too for pud_pfn (and can happen for larger
|
||||
* mappings too in the future; we're not there yet). Instead of defining
|
||||
* it for all archs (like pmd_pfn), provide a fallback.
|
||||
*
|
||||
* Note that returning 0 here means any arch that didn't define this can
|
||||
* get severely wrong when it hits a real pud leaf. It's arch's
|
||||
* responsibility to properly define it when a huge pud is possible.
|
||||
*/
|
||||
#ifndef pud_pfn
|
||||
#define pud_pfn(x) 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some architectures have MMUs that are configurable or selectable at boot
|
||||
* time. These lead to variable PTRS_PER_x. For statically allocated arrays it
|
||||
|
|
Loading…
Reference in New Issue