Skip to content

Commit aaa56c8

Browse files
SiFiveHollandpalmer-dabbelt
authored andcommitted
riscv: Factor out page table TLB synchronization
The logic is the same for all page table levels. See commit 69be3fb ("riscv: enable MMU_GATHER_RCU_TABLE_FREE for SMP && MMU"). Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Alexandre Ghiti <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 58661a3 commit aaa56c8

File tree

1 file changed

+13
-18
lines changed

1 file changed

+13
-18
lines changed

arch/riscv/include/asm/pgalloc.h

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
#define __HAVE_ARCH_PUD_FREE
1616
#include <asm-generic/pgalloc.h>
1717

18+
static inline void riscv_tlb_remove_ptdesc(struct mmu_gather *tlb, void *pt)
19+
{
20+
if (riscv_use_ipi_for_rfence())
21+
tlb_remove_page_ptdesc(tlb, pt);
22+
else
23+
tlb_remove_ptdesc(tlb, pt);
24+
}
25+
1826
static inline void pmd_populate_kernel(struct mm_struct *mm,
1927
pmd_t *pmd, pte_t *pte)
2028
{
@@ -102,10 +110,7 @@ static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
102110
struct ptdesc *ptdesc = virt_to_ptdesc(pud);
103111

104112
pagetable_pud_dtor(ptdesc);
105-
if (riscv_use_ipi_for_rfence())
106-
tlb_remove_page_ptdesc(tlb, ptdesc);
107-
else
108-
tlb_remove_ptdesc(tlb, ptdesc);
113+
riscv_tlb_remove_ptdesc(tlb, ptdesc);
109114
}
110115
}
111116

@@ -139,12 +144,8 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d)
139144
static inline void __p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
140145
unsigned long addr)
141146
{
142-
if (pgtable_l5_enabled) {
143-
if (riscv_use_ipi_for_rfence())
144-
tlb_remove_page_ptdesc(tlb, virt_to_ptdesc(p4d));
145-
else
146-
tlb_remove_ptdesc(tlb, virt_to_ptdesc(p4d));
147-
}
147+
if (pgtable_l5_enabled)
148+
riscv_tlb_remove_ptdesc(tlb, virt_to_ptdesc(p4d));
148149
}
149150
#endif /* __PAGETABLE_PMD_FOLDED */
150151

@@ -176,10 +177,7 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
176177
struct ptdesc *ptdesc = virt_to_ptdesc(pmd);
177178

178179
pagetable_pmd_dtor(ptdesc);
179-
if (riscv_use_ipi_for_rfence())
180-
tlb_remove_page_ptdesc(tlb, ptdesc);
181-
else
182-
tlb_remove_ptdesc(tlb, ptdesc);
180+
riscv_tlb_remove_ptdesc(tlb, ptdesc);
183181
}
184182

185183
#endif /* __PAGETABLE_PMD_FOLDED */
@@ -190,10 +188,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
190188
struct ptdesc *ptdesc = page_ptdesc(pte);
191189

192190
pagetable_pte_dtor(ptdesc);
193-
if (riscv_use_ipi_for_rfence())
194-
tlb_remove_page_ptdesc(tlb, ptdesc);
195-
else
196-
tlb_remove_ptdesc(tlb, ptdesc);
191+
riscv_tlb_remove_ptdesc(tlb, ptdesc);
197192
}
198193
#endif /* CONFIG_MMU */
199194

0 commit comments

Comments
 (0)