riscv: mm: Remove the copy operation of pmd
authorChuanhua Han <hanchuanhua@oppo.com>
Fri, 1 Apr 2022 02:43:20 +0000 (19:43 -0700)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 21 Apr 2022 00:36:58 +0000 (17:36 -0700)
Since all processes share the kernel address space,
we only need to copy pgd in case of a vmalloc page
fault exception, the other levels of page tables are
shared, so the operation of copying pmd is unnecessary.

Signed-off-by: Chuanhua Han <hanchuanhua@oppo.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/mm/fault.c

index 4e9efbe..40694f0 100644 (file)
@@ -102,9 +102,9 @@ static inline void bad_area(struct pt_regs *regs, struct mm_struct *mm, int code
 static inline void vmalloc_fault(struct pt_regs *regs, int code, unsigned long addr)
 {
        pgd_t *pgd, *pgd_k;
-       pud_t *pud, *pud_k;
-       p4d_t *p4d, *p4d_k;
-       pmd_t *pmd, *pmd_k;
+       pud_t *pud_k;
+       p4d_t *p4d_k;
+       pmd_t *pmd_k;
        pte_t *pte_k;
        int index;
        unsigned long pfn;
@@ -132,14 +132,12 @@ static inline void vmalloc_fault(struct pt_regs *regs, int code, unsigned long a
        }
        set_pgd(pgd, *pgd_k);
 
-       p4d = p4d_offset(pgd, addr);
        p4d_k = p4d_offset(pgd_k, addr);
        if (!p4d_present(*p4d_k)) {
                no_context(regs, addr);
                return;
        }
 
-       pud = pud_offset(p4d, addr);
        pud_k = pud_offset(p4d_k, addr);
        if (!pud_present(*pud_k)) {
                no_context(regs, addr);
@@ -150,13 +148,11 @@ static inline void vmalloc_fault(struct pt_regs *regs, int code, unsigned long a
         * Since the vmalloc area is global, it is unnecessary
         * to copy individual PTEs
         */
-       pmd = pmd_offset(pud, addr);
        pmd_k = pmd_offset(pud_k, addr);
        if (!pmd_present(*pmd_k)) {
                no_context(regs, addr);
                return;
        }
-       set_pmd(pmd, *pmd_k);
 
        /*
         * Make sure the actual PTE exists as well to