arch: Add pmd_pfn() where it is missing
authorMike Rapoport <rppt@linux.ibm.com>
Fri, 4 Feb 2022 18:49:20 +0000 (13:49 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 16:59:02 +0000 (12:59 -0400)
We need to use this function in common code, so define it for
architectures and/or configrations that miss it.  The result of
pmd_pfn() will only be used if TRANSPARENT_HUGEPAGE is enabled,
but a function or macro called pmd_pfn() must be defined, even
on machines with two level page tables.

Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
18 files changed:
arch/alpha/include/asm/pgtable.h
arch/arc/include/asm/hugepage.h
arch/arc/include/asm/pgtable-levels.h
arch/arm/include/asm/pgtable-2level.h
arch/csky/include/asm/pgtable.h
arch/hexagon/include/asm/pgtable.h
arch/ia64/include/asm/pgtable.h
arch/m68k/include/asm/mcf_pgtable.h
arch/m68k/include/asm/motorola_pgtable.h
arch/m68k/include/asm/sun3_pgtable.h
arch/microblaze/include/asm/pgtable.h
arch/nds32/include/asm/pgtable.h
arch/nios2/include/asm/pgtable.h
arch/openrisc/include/asm/pgtable.h
arch/parisc/include/asm/pgtable.h
arch/sh/include/asm/pgtable_32.h
arch/um/include/asm/pgtable.h
arch/xtensa/include/asm/pgtable.h

index 02f0429..170451f 100644 (file)
@@ -233,6 +233,7 @@ pmd_page_vaddr(pmd_t pmd)
        return ((pmd_val(pmd) & _PFN_MASK) >> (32-PAGE_SHIFT)) + PAGE_OFFSET;
 }
 
+#define pmd_pfn(pmd)   (pmd_val(pmd) >> 32)
 #define pmd_page(pmd)  (pfn_to_page(pmd_val(pmd) >> 32))
 #define pud_page(pud)  (pfn_to_page(pud_val(pud) >> 32))
 
index 11b0ff2..5001b79 100644 (file)
@@ -31,7 +31,6 @@ static inline pmd_t pte_pmd(pte_t pte)
 
 #define pmd_write(pmd)         pte_write(pmd_pte(pmd))
 #define pmd_young(pmd)         pte_young(pmd_pte(pmd))
-#define pmd_pfn(pmd)           pte_pfn(pmd_pte(pmd))
 #define pmd_dirty(pmd)         pte_dirty(pmd_pte(pmd))
 
 #define mk_pmd(page, prot)     pte_pmd(mk_pte(page, prot))
index 8084ef2..7848348 100644 (file)
 #define pmd_present(x)         (pmd_val(x))
 #define pmd_clear(xp)          do { pmd_val(*(xp)) = 0; } while (0)
 #define pmd_page_vaddr(pmd)    (pmd_val(pmd) & PAGE_MASK)
+#define pmd_pfn(pmd)           ((pmd_val(pmd) & PAGE_MASK) >> PAGE_SHIFT)
 #define pmd_page(pmd)          virt_to_page(pmd_page_vaddr(pmd))
 #define set_pmd(pmdp, pmd)     (*(pmdp) = pmd)
 #define pmd_pgtable(pmd)       ((pgtable_t) pmd_page_vaddr(pmd))
index 70fe69b..92abd4c 100644 (file)
@@ -208,6 +208,8 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
 }
 #define pmd_offset pmd_offset
 
+#define pmd_pfn(pmd)           (__phys_to_pfn(pmd_val(pmd) & PHYS_MASK))
+
 #define pmd_large(pmd)         (pmd_val(pmd) & 2)
 #define pmd_leaf(pmd)          (pmd_val(pmd) & 2)
 #define pmd_bad(pmd)           (pmd_val(pmd) & 2)
index 151607e..bbe2451 100644 (file)
@@ -30,6 +30,7 @@
 #define pgd_ERROR(e) \
        pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
 
+#define pmd_pfn(pmd)   (pmd_phys(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)  (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
 #define pte_clear(mm, addr, ptep)      set_pte((ptep), \
        (((unsigned int) addr >= PAGE_OFFSET) ? __pte(_PAGE_GLOBAL) : __pte(0)))
index 18cd6ea..0610724 100644 (file)
@@ -235,6 +235,11 @@ static inline int pmd_bad(pmd_t pmd)
        return 0;
 }
 
+/*
+ * pmd_pfn - converts a PMD entry to a page frame number
+ */
+#define pmd_pfn(pmd)  (pmd_val(pmd) >> PAGE_SHIFT)
+
 /*
  * pmd_page - converts a PMD entry to a page pointer
  */
index 9584b2c..7aa8f23 100644 (file)
@@ -267,6 +267,7 @@ ia64_phys_addr_valid (unsigned long addr)
 #define pmd_present(pmd)               (pmd_val(pmd) != 0UL)
 #define pmd_clear(pmdp)                        (pmd_val(*(pmdp)) = 0UL)
 #define pmd_page_vaddr(pmd)            ((unsigned long) __va(pmd_val(pmd) & _PFN_MASK))
+#define pmd_pfn(pmd)                   ((pmd_val(pmd) & _PFN_MASK) >> PAGE_SHIFT)
 #define pmd_page(pmd)                  virt_to_page((pmd_val(pmd) + PAGE_OFFSET))
 
 #define pud_none(pud)                  (!pud_val(pud))
index 6f2b87d..94f38d7 100644 (file)
@@ -322,6 +322,7 @@ extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
 #define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)  (__pte((x).val))
 
+#define pmd_pfn(pmd)           (pmd_val(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)          (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
 
 #define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
index 022c3ab..7c9b56e 100644 (file)
@@ -147,6 +147,7 @@ static inline void pud_set(pud_t *pudp, pmd_t *pmdp)
 #define pmd_present(pmd)       (pmd_val(pmd) & _PAGE_TABLE)
 #define pmd_clear(pmdp)                ({ pmd_val(*pmdp) = 0; })
 
+#define pmd_pfn(pmd)           ((pmd_val(pmd) & _TABLE_MASK) >> PAGE_SHIFT)
 /*
  * m68k does not have huge pages (020/030 actually could), but generic code
  * expects pmd_page() to exists, only to then DCE it all. Provide a dummy to
index 5b24283..5e4e753 100644 (file)
@@ -130,6 +130,7 @@ static inline void pte_clear (struct mm_struct *mm, unsigned long addr, pte_t *p
 ({ pte_t __pte; pte_val(__pte) = pfn | pgprot_val(pgprot); __pte; })
 
 #define pte_page(pte)          virt_to_page(__pte_page(pte))
+#define pmd_pfn(pmd)           (pmd_val(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)          virt_to_page(pmd_page_vaddr(pmd))
 
 
index c136a01..0c72646 100644 (file)
@@ -399,6 +399,9 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
        return ((unsigned long) (pmd_val(pmd) & PAGE_MASK));
 }
 
+/* returns pfn of the pmd entry*/
+#define pmd_pfn(pmd)   (__pa(pmd_val(pmd)) >> PAGE_SHIFT)
+
 /* returns struct *page of the pmd entry*/
 #define pmd_page(pmd)  (pfn_to_page(__pa(pmd_val(pmd)) >> PAGE_SHIFT))
 
index 419f984..7ff1444 100644 (file)
@@ -308,6 +308,7 @@ static inline pmd_t __mk_pmd(pte_t * ptep, unsigned long prot)
        return pmd;
 }
 
+#define pmd_pfn(pmd)        (pmd_val(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)        virt_to_page(__va(pmd_val(pmd)))
 
 /*
index 4a995fa..262d060 100644 (file)
@@ -235,6 +235,7 @@ static inline void pte_clear(struct mm_struct *mm,
  * and a page entry and page directory to the page they refer to.
  */
 #define pmd_phys(pmd)          virt_to_phys((void *)pmd_val(pmd))
+#define pmd_pfn(pmd)           (pmd_phys(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)          (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
 
 static inline unsigned long pmd_page_vaddr(pmd_t pmd)
index cdd657f..c3abbf7 100644 (file)
@@ -361,6 +361,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
        pmd_val(*pmdp) = _KERNPG_TABLE | (unsigned long) ptep;
 }
 
+#define pmd_pfn(pmd)           (pmd_val(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd)          (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
 
 static inline unsigned long pmd_page_vaddr(pmd_t pmd)
index 3e7cf88..48d49f2 100644 (file)
@@ -405,6 +405,7 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
        return ((unsigned long) __va(pmd_address(pmd)));
 }
 
+#define pmd_pfn(pmd)   (pmd_address(pmd) >> PAGE_SHIFT)
 #define __pmd_page(pmd) ((unsigned long) __va(pmd_address(pmd)))
 #define pmd_page(pmd)  virt_to_page((void *)__pmd_page(pmd))
 
index 41be43e..d0240de 100644 (file)
@@ -406,6 +406,7 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
        return (unsigned long)pmd_val(pmd);
 }
 
+#define pmd_pfn(pmd)           (__pa(pmd_val(pmd)) >> PAGE_SHIFT)
 #define pmd_page(pmd)          (virt_to_page(pmd_val(pmd)))
 
 #ifdef CONFIG_X2TLB
index b9e20bb..167e236 100644 (file)
@@ -109,6 +109,7 @@ extern unsigned long end_iomem;
 #define p4d_newpage(x)  (p4d_val(x) & _PAGE_NEWPAGE)
 #define p4d_mkuptodate(x) (p4d_val(x) &= ~_PAGE_NEWPAGE)
 
+#define pmd_pfn(pmd) (pmd_val(pmd) >> PAGE_SHIFT)
 #define pmd_page(pmd) phys_to_page(pmd_val(pmd) & PAGE_MASK)
 
 #define pte_page(x) pfn_to_page(pte_pfn(x))
index bd5aeb7..8da562f 100644 (file)
@@ -241,6 +241,7 @@ static inline void paging_init(void) { }
  * The pmd contains the kernel virtual address of the pte page.
  */
 #define pmd_page_vaddr(pmd) ((unsigned long)(pmd_val(pmd) & PAGE_MASK))
+#define pmd_pfn(pmd) (__pa(pmd_val(pmd)) >> PAGE_SHIFT)
 #define pmd_page(pmd) virt_to_page(pmd_val(pmd))
 
 /*