]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
powerpc/8xx: Refactor calculation of number of entries per PTE in page tables
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 31 Aug 2020 08:30:43 +0000 (08:30 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 15 Sep 2020 12:13:31 +0000 (22:13 +1000)
On 8xx, the number of entries occupied by a PTE in the page tables
depends on the size of the page. At the time being, this calculation
is done in two places: in pte_update() and in set_huge_pte_at()

Refactor this calculation into a helper called
number_of_cells_per_pte(). For the time being, the val param is
unused. It will be used by following patch.

Instead of opencoding is_hugepd(), use hugepd_ok() with a forward
declaration.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/f6ea2483c2c389567b007945948f704d18cfaeea.1598862623.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/nohash/32/pgtable.h
arch/powerpc/mm/pgtable.c

index b9e134d0f03ad3bd582a3460a57c0a7e33d5fb78..80bbc21b87f0936919a5df9273814df215d21e94 100644 (file)
@@ -227,6 +227,17 @@ static inline void pmd_clear(pmd_t *pmdp)
  */
 #ifdef CONFIG_PPC_8xx
 static pmd_t *pmd_off(struct mm_struct *mm, unsigned long addr);
+static int hugepd_ok(hugepd_t hpd);
+
+static int number_of_cells_per_pte(pmd_t *pmd, pte_basic_t val, int huge)
+{
+       if (!huge)
+               return PAGE_SIZE / SZ_4K;
+       else if (hugepd_ok(*((hugepd_t *)pmd)))
+               return 1;
+       else
+               return SZ_512K / SZ_4K;
+}
 
 static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, pte_t *p,
                                     unsigned long clr, unsigned long set, int huge)
@@ -237,12 +248,7 @@ static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, p
        int num, i;
        pmd_t *pmd = pmd_off(mm, addr);
 
-       if (!huge)
-               num = PAGE_SIZE / SZ_4K;
-       else if ((pmd_val(*pmd) & _PMD_PAGE_MASK) != _PMD_PAGE_8M)
-               num = SZ_512K / SZ_4K;
-       else
-               num = 1;
+       num = number_of_cells_per_pte(pmd, new, huge);
 
        for (i = 0; i < num; i++, entry++, new += SZ_4K)
                *entry = new;
index 9c0547d77af3599847849625c565299b3562d561..2dcad640b8695f5baba3932188e0470960808e4e 100644 (file)
@@ -266,8 +266,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_
        pmd_t *pmd = pmd_off(mm, addr);
        pte_basic_t val;
        pte_basic_t *entry = &ptep->pte;
-       int num = is_hugepd(*((hugepd_t *)pmd)) ? 1 : SZ_512K / SZ_4K;
-       int i;
+       int num, i;
 
        /*
         * Make sure hardware valid bit is not set. We don't do
@@ -280,6 +279,9 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_
        pte = set_pte_filter(pte);
 
        val = pte_val(pte);
+
+       num = number_of_cells_per_pte(pmd, val, 1);
+
        for (i = 0; i < num; i++, entry++, val += SZ_4K)
                *entry = val;
 }