Erhard Furtner <erhar...@mailbox.org> writes: > On Fri, 06 Oct 2023 11:04:15 +0530 > "Aneesh Kumar K.V" <aneesh.ku...@linux.ibm.com> wrote: > >> Can you check this change? >> >> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c >> index 3ba9fe411604..6d144fedd557 100644 >
... >> void unmap_kernel_page(unsigned long va) > > Thanks for having a look into the issue! Your patch applies but I got a build > failure: > > # make > CALL scripts/checksyscalls.sh > CC arch/powerpc/mm/pgtable.o > In file included from ./include/linux/mm.h:29, > from arch/powerpc/mm/pgtable.c:22: > ./include/linux/pgtable.h:247:71: error: expected declaration specifiers or > '...' before numeric constant > 247 | #define set_pte_at(mm, addr, ptep, pte) set_ptes(mm, addr, ptep, pte, > 1) > | > ^ > arch/powerpc/mm/pgtable.c:190:13: note: in expansion of macro 'set_pte_at' > 190 | static void set_pte_at(struct mm_struct *mm, unsigned long addr, > pte_t *ptep, > | ^~~~~~~~~~ Sorry that I shared a change without build testing. Here is the updated change diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 3ba9fe411604..e563e13ffd88 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -190,29 +190,28 @@ static pte_t set_access_flags_filter(pte_t pte, struct vm_area_struct *vma, void set_ptes(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte, unsigned int nr) { - /* - * Make sure hardware valid bit is not set. We don't do - * tlb flush for this update. - */ - VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep)); - - /* Note: mm->context.id might not yet have been assigned as - * this context might not have been activated yet when this - * is called. - */ - pte = set_pte_filter(pte); - /* Perform the setting of the PTE */ - arch_enter_lazy_mmu_mode(); for (;;) { + + /* + * Make sure hardware valid bit is not set. We don't do + * tlb flush for this update. + */ + VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep)); + + /* Note: mm->context.id might not yet have been assigned as + * this context might not have been activated yet when this + * is called. + */ + pte = set_pte_filter(pte); + + /* Perform the setting of the PTE */ __set_pte_at(mm, addr, ptep, pte, 0); if (--nr == 0) break; ptep++; - pte = __pte(pte_val(pte) + (1UL << PTE_RPN_SHIFT)); addr += PAGE_SIZE; } - arch_leave_lazy_mmu_mode(); } void unmap_kernel_page(unsigned long va)