Message ID | 20230921162007.1630149-3-ryan.roberts@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Fix set_huge_pte_at() panic on arm64 | expand |
Le 21/09/2023 à 18:20, Ryan Roberts a écrit : > In order to fix a bug, arm64 needs access to the vma inside it's > implementation of set_huge_pte_at(). Provide for this by converting the > mm parameter to be a vma. Any implementations that require the mm can > access it via vma->vm_mm. > > This commit makes the required powerpc modifications. Separate commits > update the other arches and core code, before the actual bug is fixed in > arm64. > > No behavioral changes intended. This patch doesn't build, allthough I have also applied patch 1. Is something missing ? CALL scripts/checksyscalls.sh CC arch/powerpc/kernel/setup-common.o In file included from arch/powerpc/kernel/setup-common.c:37: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/kernel/setup-common.o] Error 1 make[4]: Target 'arch/powerpc/kernel/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: arch/powerpc/kernel] Error 2 CC arch/powerpc/mm/fault.o In file included from arch/powerpc/mm/fault.c:33: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/mm/fault.o] Error 1 CC arch/powerpc/mm/pgtable.o In file included from arch/powerpc/mm/pgtable.c:25: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/mm/pgtable.o] Error 1 CC arch/powerpc/mm/init_32.o In file included from arch/powerpc/mm/init_32.c:30: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/mm/init_32.o] Error 1 CC arch/powerpc/mm/pgtable-frag.o In file included from arch/powerpc/mm/pgtable-frag.c:13: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/mm/pgtable-frag.o] Error 1 CC arch/powerpc/mm/nohash/tlb.o In file included from arch/powerpc/mm/nohash/tlb.c:35: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[5]: *** [scripts/Makefile.build:243: arch/powerpc/mm/nohash/tlb.o] Error 1 CC arch/powerpc/mm/nohash/8xx.o In file included from arch/powerpc/mm/nohash/8xx.c:11: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[5]: *** [scripts/Makefile.build:243: arch/powerpc/mm/nohash/8xx.o] Error 1 make[5]: Target 'arch/powerpc/mm/nohash/' not remade because of errors. make[4]: *** [scripts/Makefile.build:480: arch/powerpc/mm/nohash] Error 2 CC arch/powerpc/mm/hugetlbpage.o In file included from arch/powerpc/mm/hugetlbpage.c:14: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: all warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: arch/powerpc/mm/hugetlbpage.o] Error 1 make[4]: Target 'arch/powerpc/mm/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: arch/powerpc/mm] Error 2 make[3]: Target 'arch/powerpc/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: arch/powerpc] Error 2 CC kernel/fork.o In file included from kernel/fork.c:52: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: kernel/fork.o] Error 1 CC kernel/sysctl.o In file included from kernel/sysctl.c:45: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: kernel/sysctl.o] Error 1 CC kernel/events/core.o In file included from kernel/events/core.c:31: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: kernel/events/core.o] Error 1 make[4]: Target 'kernel/events/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: kernel/events] Error 2 make[3]: Target 'kernel/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: kernel] Error 2 CC mm/filemap.o In file included from mm/filemap.c:37: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/filemap.o] Error 1 CC mm/folio-compat.o In file included from ./include/linux/migrate.h:8, from mm/folio-compat.c:7: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/folio-compat.o] Error 1 CC mm/swap.o In file included from mm/swap.c:36: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/swap.o] Error 1 CC mm/vmscan.o In file included from ./include/linux/migrate.h:8, from mm/vmscan.c:43: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/vmscan.o] Error 1 CC mm/shmem.o In file included from mm/shmem.c:39: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/shmem.o] Error 1 CC mm/util.o In file included from mm/util.c:16: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/util.o] Error 1 CC mm/compaction.o In file included from ./include/linux/migrate.h:8, from mm/compaction.c:13: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/compaction.o] Error 1 CC mm/show_mem.o In file included from mm/show_mem.c:12: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/show_mem.o] Error 1 CC mm/debug.o In file included from ./include/linux/migrate.h:8, from mm/debug.c:14: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/debug.o] Error 1 CC mm/gup.o In file included from mm/gup.c:17: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/gup.o] Error 1 CC mm/memory.o In file included from mm/memory.c:49: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/memory.o] Error 1 CC mm/mincore.o In file included from mm/mincore.c:19: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/mincore.o] Error 1 CC mm/mlock.o In file included from mm/mlock.c:24: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/mlock.o] Error 1 CC mm/mmap.o In file included from mm/mmap.c:28: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/mmap.o] Error 1 CC mm/mprotect.o In file included from mm/mprotect.c:13: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/mprotect.o] Error 1 CC mm/mremap.o In file included from mm/mremap.c:13: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/mremap.o] Error 1 CC mm/page_vma_mapped.o In file included from mm/page_vma_mapped.c:4: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/page_vma_mapped.o] Error 1 CC mm/pagewalk.o In file included from mm/pagewalk.c:5: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/pagewalk.o] Error 1 CC mm/pgtable-generic.o In file included from mm/pgtable-generic.c:11: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/pgtable-generic.o] Error 1 CC mm/rmap.o In file included from ./include/linux/migrate.h:8, from mm/rmap.c:70: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/rmap.c: In function 'try_to_unmap_one': mm/rmap.c:1631:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 1631 | set_huge_pte_at(mm, address, pvmw.pte, pteval); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/rmap.c: In function 'try_to_migrate_one': mm/rmap.c:2023:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 2023 | set_huge_pte_at(mm, address, pvmw.pte, pteval); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/rmap.c:2047:57: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 2047 | set_huge_pte_at(mm, address, pvmw.pte, pteval); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/rmap.c:2061:57: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 2061 | set_huge_pte_at(mm, address, pvmw.pte, pteval); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/rmap.c:2093:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 2093 | set_huge_pte_at(mm, address, pvmw.pte, swp_pte); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/rmap.o] Error 1 CC mm/vmalloc.o In file included from mm/vmalloc.c:41: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/vmalloc.c: In function 'vmap_pte_range': mm/vmalloc.c:114:41: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 114 | set_huge_pte_at(&init_mm, addr, pte, entry); | ^~~~~~~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/vmalloc.o] Error 1 CC mm/page_alloc.o In file included from ./include/linux/migrate.h:8, from mm/page_alloc.c:45: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/page_alloc.o] Error 1 CC mm/madvise.o In file included from mm/madvise.c:16: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/madvise.o] Error 1 CC mm/hugetlb.o In file included from ./include/linux/migrate.h:8, from mm/hugetlb.c:33: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'hugetlb_install_folio': mm/hugetlb.c:4991:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 4991 | set_huge_pte_at(vma->vm_mm, addr, ptep, newpte); | ~~~^~~~~~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'copy_hugetlb_page_range': mm/hugetlb.c:5068:41: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5068 | set_huge_pte_at(dst, addr, dst_pte, entry); | ^~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:5083:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5083 | set_huge_pte_at(src, addr, src_pte, entry); | ^~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:5087:41: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5087 | set_huge_pte_at(dst, addr, dst_pte, entry); | ^~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:5093:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5093 | set_huge_pte_at(dst, addr, dst_pte, | ^~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:5169:41: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5169 | set_huge_pte_at(dst, addr, dst_pte, entry); | ^~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'move_huge_pte': mm/hugetlb.c:5205:25: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5205 | set_huge_pte_at(mm, new_addr, dst_pte, pte); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function '__unmap_hugepage_range': mm/hugetlb.c:5339:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5339 | set_huge_pte_at(mm, address, ptep, | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:5373:41: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5373 | set_huge_pte_at(mm, address, ptep, | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'hugetlb_wp': mm/hugetlb.c:5679:33: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5679 | set_huge_pte_at(mm, haddr, ptep, newpte); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'hugetlb_no_page': mm/hugetlb.c:5975:25: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 5975 | set_huge_pte_at(mm, haddr, ptep, new_pte); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c: In function 'hugetlb_change_protection': mm/hugetlb.c:6601:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 6601 | set_huge_pte_at(mm, address, ptep, newpte); | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/hugetlb.c:6625:49: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 6625 | set_huge_pte_at(mm, address, ptep, | ^~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/hugetlb.o] Error 1 CC mm/migrate.o In file included from ./include/linux/migrate.h:8, from mm/migrate.c:16: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ mm/migrate.c: In function 'remove_migration_pte': mm/migrate.c:254:44: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 254 | set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte); | ~~~^~~~~~~ | | | struct mm_struct * ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/migrate.o] Error 1 CC mm/debug_vm_pgtable.o In file included from mm/debug_vm_pgtable.c:15: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/debug_vm_pgtable.o] Error 1 CC mm/memfd.o In file included from mm/memfd.c:18: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: mm/memfd.o] Error 1 make[3]: Target 'mm/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: mm] Error 2 CC fs/aio.o In file included from ./include/linux/migrate.h:8, from fs/aio.c:40: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: fs/aio.o] Error 1 CC fs/binfmt_elf.o In file included from fs/binfmt_elf.c:31: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: fs/binfmt_elf.o] Error 1 CC fs/iomap/buffered-io.o In file included from ./include/linux/migrate.h:8, from fs/iomap/buffered-io.c:19: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/iomap/buffered-io.o] Error 1 make[4]: Target 'fs/iomap/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: fs/iomap] Error 2 CC fs/proc/task_mmu.o In file included from fs/proc/task_mmu.c:4: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/proc/task_mmu.o] Error 1 CC fs/proc/array.o In file included from fs/proc/array.c:74: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/proc/array.o] Error 1 CC fs/proc/meminfo.o In file included from fs/proc/meminfo.c:6: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/proc/meminfo.o] Error 1 CC fs/proc/page.o In file included from fs/proc/page.c:12: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/proc/page.o] Error 1 make[4]: Target 'fs/proc/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: fs/proc] Error 2 CC fs/hugetlbfs/inode.o In file included from fs/hugetlbfs/inode.c:27: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/hugetlbfs/inode.o] Error 1 make[4]: Target 'fs/hugetlbfs/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: fs/hugetlbfs] Error 2 CC fs/nfs/write.o In file included from ./include/linux/migrate.h:8, from fs/nfs/write.c:17: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[4]: *** [scripts/Makefile.build:243: fs/nfs/write.o] Error 1 make[4]: Target 'fs/nfs/' not remade because of errors. make[3]: *** [scripts/Makefile.build:480: fs/nfs] Error 2 make[3]: Target 'fs/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: fs] Error 2 CC ipc/shm.o In file included from ipc/shm.c:30: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: ipc/shm.o] Error 1 make[3]: Target 'ipc/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: ipc] Error 2 CC security/commoncap.o In file included from security/commoncap.c:19: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: security/commoncap.o] Error 1 make[3]: Target 'security/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: security] Error 2 CC io_uring/rsrc.o In file included from io_uring/rsrc.c:9: ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': ./include/linux/hugetlb.h:987:28: error: passing argument 1 of 'set_huge_pte_at' from incompatible pointer type [-Werror=incompatible-pointer-types] 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); | ~~~^~~~~~~ | | | struct mm_struct * In file included from ./arch/powerpc/include/asm/hugetlb.h:13, from ./include/linux/hugetlb.h:815: ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); | ~~~~~~~~~~~~~~~~~~~~~~~^~~ cc1: some warnings being treated as errors make[3]: *** [scripts/Makefile.build:243: io_uring/rsrc.o] Error 1 make[3]: Target 'io_uring/' not remade because of errors. make[2]: *** [scripts/Makefile.build:480: io_uring] Error 2 make[2]: Target './' not remade because of errors. make[1]: *** [/home/chleroy/linux-powerpc/Makefile:1913: .] Error 2 make[1]: Target 'vmlinux' not remade because of errors. make: *** [Makefile:234: __sub-make] Error 2 make: Target 'vmlinux' not remade because of errors. Christophe
Le 21/09/2023 à 20:43, Christophe Leroy a écrit : > > > Le 21/09/2023 à 18:20, Ryan Roberts a écrit : >> In order to fix a bug, arm64 needs access to the vma inside it's >> implementation of set_huge_pte_at(). Provide for this by converting the >> mm parameter to be a vma. Any implementations that require the mm can >> access it via vma->vm_mm. >> >> This commit makes the required powerpc modifications. Separate commits >> update the other arches and core code, before the actual bug is fixed in >> arm64. >> >> No behavioral changes intended. > > This patch doesn't build, allthough I have also applied patch 1. Is > something missing ? > > CALL scripts/checksyscalls.sh > CC arch/powerpc/kernel/setup-common.o > In file included from arch/powerpc/kernel/setup-common.c:37: > ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': > ./include/linux/hugetlb.h:987:28: error: passing argument 1 of > 'set_huge_pte_at' from incompatible pointer type > [-Werror=incompatible-pointer-types] > 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); > | ~~~^~~~~~~ > | | > | struct mm_struct * > In file included from ./arch/powerpc/include/asm/hugetlb.h:13, > from ./include/linux/hugetlb.h:815: > ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected > 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' > 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long > addr, pte_t *ptep, pte_t pte); > | ~~~~~~~~~~~~~~~~~~~~~~~^~~ > cc1: all warnings being treated as errors > make[4]: *** [scripts/Makefile.build:243: Oh, I realised that it requires patch 6 to build properly. This is not good. Your series should be bisectable, that means it must build and run successfully after each patch. Therefore you have to squash patches 1 to 7 all togethers. I'll send you comments on the powerpc part in another mail. Christophe
Le 21/09/2023 à 18:20, Ryan Roberts a écrit : > In order to fix a bug, arm64 needs access to the vma inside it's > implementation of set_huge_pte_at(). Provide for this by converting the > mm parameter to be a vma. Any implementations that require the mm can > access it via vma->vm_mm. > > This commit makes the required powerpc modifications. Separate commits > update the other arches and core code, before the actual bug is fixed in > arm64. > > No behavioral changes intended. > > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > --- > arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 3 ++- > arch/powerpc/mm/book3s64/hugetlbpage.c | 2 +- > arch/powerpc/mm/book3s64/radix_hugetlbpage.c | 2 +- > arch/powerpc/mm/nohash/8xx.c | 2 +- > arch/powerpc/mm/pgtable.c | 7 ++++++- > 5 files changed, 11 insertions(+), 5 deletions(-) > > diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h > index de092b04ee1a..fff8cd726bc7 100644 > --- a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h > +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h > @@ -46,7 +46,8 @@ static inline int check_and_get_huge_psize(int shift) > } > > #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT > -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); > +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); > +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); Don't add the burden of an additional function, see below > > #define __HAVE_ARCH_HUGE_PTE_CLEAR > static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, > diff --git a/arch/powerpc/mm/book3s64/hugetlbpage.c b/arch/powerpc/mm/book3s64/hugetlbpage.c > index 3bc0eb21b2a0..ae7fd7c90eb8 100644 > --- a/arch/powerpc/mm/book3s64/hugetlbpage.c > +++ b/arch/powerpc/mm/book3s64/hugetlbpage.c > @@ -147,7 +147,7 @@ void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr > if (radix_enabled()) > return radix__huge_ptep_modify_prot_commit(vma, addr, ptep, > old_pte, pte); > - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); > + set_huge_pte_at(vma, addr, ptep, pte); > } > > void __init hugetlbpage_init_defaultsize(void) > diff --git a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c > index 17075c78d4bc..7cd40a334c3a 100644 > --- a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c > +++ b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c > @@ -58,5 +58,5 @@ void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma, > atomic_read(&mm->context.copros) > 0) > radix__flush_hugetlb_page(vma, addr); > > - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); > + set_huge_pte_at(vma, addr, ptep, pte); > } > diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c > index dbbfe897455d..650a7a8496b6 100644 > --- a/arch/powerpc/mm/nohash/8xx.c > +++ b/arch/powerpc/mm/nohash/8xx.c > @@ -91,7 +91,7 @@ static int __ref __early_map_kernel_hugepage(unsigned long va, phys_addr_t pa, > if (new && WARN_ON(pte_present(*ptep) && pgprot_val(prot))) > return -EINVAL; > > - set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); > + __set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); Call set_huge_pte_at() with a NULL vma instead. > > return 0; > } > diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c > index 3f86fd217690..9cbcb561a4d8 100644 > --- a/arch/powerpc/mm/pgtable.c > +++ b/arch/powerpc/mm/pgtable.c > @@ -288,7 +288,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, > } > > #if defined(CONFIG_PPC_8xx) > -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) > +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) Keep it as set_huge_pte_at() with vma argument. > { > pmd_t *pmd = pmd_off(mm, addr); Change to: pmd_t *pmd = vma ? pmd_off(vma->vm_mm, addr) : pmd_off_k(addr); > pte_basic_t val; > @@ -310,6 +310,11 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ > for (i = 0; i < num; i++, entry++, val += SZ_4K) > *entry = val; > } > + > +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte) > +{ > + __set_huge_pte_at(vma->vm_mm, addr, ptep, pte); > +} Remove this burden. > #endif > #endif /* CONFIG_HUGETLB_PAGE */ > Christophe
On 22/09/2023 07:44, Christophe Leroy wrote: > > > Le 21/09/2023 à 20:43, Christophe Leroy a écrit : >> >> >> Le 21/09/2023 à 18:20, Ryan Roberts a écrit : >>> In order to fix a bug, arm64 needs access to the vma inside it's >>> implementation of set_huge_pte_at(). Provide for this by converting the >>> mm parameter to be a vma. Any implementations that require the mm can >>> access it via vma->vm_mm. >>> >>> This commit makes the required powerpc modifications. Separate commits >>> update the other arches and core code, before the actual bug is fixed in >>> arm64. >>> >>> No behavioral changes intended. >> >> This patch doesn't build, allthough I have also applied patch 1. Is >> something missing ? >> >> CALL scripts/checksyscalls.sh >> CC arch/powerpc/kernel/setup-common.o >> In file included from arch/powerpc/kernel/setup-common.c:37: >> ./include/linux/hugetlb.h: In function 'huge_ptep_modify_prot_commit': >> ./include/linux/hugetlb.h:987:28: error: passing argument 1 of >> 'set_huge_pte_at' from incompatible pointer type >> [-Werror=incompatible-pointer-types] >> 987 | set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >> | ~~~^~~~~~~ >> | | >> | struct mm_struct * >> In file included from ./arch/powerpc/include/asm/hugetlb.h:13, >> from ./include/linux/hugetlb.h:815: >> ./arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h:49:45: note: expected >> 'struct vm_area_struct *' but argument is of type 'struct mm_struct *' >> 49 | void set_huge_pte_at(struct vm_area_struct *vma, unsigned long >> addr, pte_t *ptep, pte_t pte); >> | ~~~~~~~~~~~~~~~~~~~~~~~^~~ >> cc1: all warnings being treated as errors >> make[4]: *** [scripts/Makefile.build:243: > > Oh, I realised that it requires patch 6 to build properly. This is not > good. Your series should be bisectable, that means it must build and run > successfully after each patch. Therefore you have to squash patches 1 to > 7 all togethers. Yeah my bad - sorry about that. I thought it would be better to separate the changes for each arch. But as already suggested by Andrew and Catalin, I'll squash the first 7 patches into 1 for v2. > > I'll send you comments on the powerpc part in another mail. > > Christophe
On 22/09/2023 07:56, Christophe Leroy wrote: > > > Le 21/09/2023 à 18:20, Ryan Roberts a écrit : >> In order to fix a bug, arm64 needs access to the vma inside it's >> implementation of set_huge_pte_at(). Provide for this by converting the >> mm parameter to be a vma. Any implementations that require the mm can >> access it via vma->vm_mm. >> >> This commit makes the required powerpc modifications. Separate commits >> update the other arches and core code, before the actual bug is fixed in >> arm64. >> >> No behavioral changes intended. >> >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >> --- >> arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 3 ++- >> arch/powerpc/mm/book3s64/hugetlbpage.c | 2 +- >> arch/powerpc/mm/book3s64/radix_hugetlbpage.c | 2 +- >> arch/powerpc/mm/nohash/8xx.c | 2 +- >> arch/powerpc/mm/pgtable.c | 7 ++++++- >> 5 files changed, 11 insertions(+), 5 deletions(-) >> >> diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >> index de092b04ee1a..fff8cd726bc7 100644 >> --- a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >> +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >> @@ -46,7 +46,8 @@ static inline int check_and_get_huge_psize(int shift) >> } >> >> #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT >> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); >> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); >> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); > > Don't add the burden of an additional function, see below > >> >> #define __HAVE_ARCH_HUGE_PTE_CLEAR >> static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, >> diff --git a/arch/powerpc/mm/book3s64/hugetlbpage.c b/arch/powerpc/mm/book3s64/hugetlbpage.c >> index 3bc0eb21b2a0..ae7fd7c90eb8 100644 >> --- a/arch/powerpc/mm/book3s64/hugetlbpage.c >> +++ b/arch/powerpc/mm/book3s64/hugetlbpage.c >> @@ -147,7 +147,7 @@ void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr >> if (radix_enabled()) >> return radix__huge_ptep_modify_prot_commit(vma, addr, ptep, >> old_pte, pte); >> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >> + set_huge_pte_at(vma, addr, ptep, pte); >> } >> >> void __init hugetlbpage_init_defaultsize(void) >> diff --git a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >> index 17075c78d4bc..7cd40a334c3a 100644 >> --- a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >> +++ b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >> @@ -58,5 +58,5 @@ void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma, >> atomic_read(&mm->context.copros) > 0) >> radix__flush_hugetlb_page(vma, addr); >> >> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >> + set_huge_pte_at(vma, addr, ptep, pte); >> } >> diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c >> index dbbfe897455d..650a7a8496b6 100644 >> --- a/arch/powerpc/mm/nohash/8xx.c >> +++ b/arch/powerpc/mm/nohash/8xx.c >> @@ -91,7 +91,7 @@ static int __ref __early_map_kernel_hugepage(unsigned long va, phys_addr_t pa, >> if (new && WARN_ON(pte_present(*ptep) && pgprot_val(prot))) >> return -EINVAL; >> >> - set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); >> + __set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); > > Call set_huge_pte_at() with a NULL vma instead. I'm happy to take your proposed approach if that's your preference. Another option is to use a dummy VMA, as I have done in the core code, for the one call site that calls set_huge_pte_at() with init_mm: struct vm_area_struct vma = TLB_FLUSH_VMA(&init_mm, 0); This is an existing macro that creates a dummy vma with vma->vm_mm filled in. Then I pass &vma to the function. Or yet another option would be to keep the mm param as is in set_huge_pte_at(), and add a size param to the function. But then all call sites have the burden of figuring out the size of the huge pte (although I think most know already). Thanks, Ryan > >> >> return 0; >> } >> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c >> index 3f86fd217690..9cbcb561a4d8 100644 >> --- a/arch/powerpc/mm/pgtable.c >> +++ b/arch/powerpc/mm/pgtable.c >> @@ -288,7 +288,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, >> } >> >> #if defined(CONFIG_PPC_8xx) >> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) >> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) > > Keep it as set_huge_pte_at() with vma argument. > >> { >> pmd_t *pmd = pmd_off(mm, addr); > > Change to: > > pmd_t *pmd = vma ? pmd_off(vma->vm_mm, addr) : pmd_off_k(addr); > >> pte_basic_t val; >> @@ -310,6 +310,11 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ >> for (i = 0; i < num; i++, entry++, val += SZ_4K) >> *entry = val; >> } >> + >> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte) >> +{ >> + __set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >> +} > > Remove this burden. > >> #endif >> #endif /* CONFIG_HUGETLB_PAGE */ >> > > > Christophe
Le 22/09/2023 à 09:33, Ryan Roberts a écrit : > On 22/09/2023 07:56, Christophe Leroy wrote: >> >> >> Le 21/09/2023 à 18:20, Ryan Roberts a écrit : >>> In order to fix a bug, arm64 needs access to the vma inside it's >>> implementation of set_huge_pte_at(). Provide for this by converting the >>> mm parameter to be a vma. Any implementations that require the mm can >>> access it via vma->vm_mm. >>> >>> This commit makes the required powerpc modifications. Separate commits >>> update the other arches and core code, before the actual bug is fixed in >>> arm64. >>> >>> No behavioral changes intended. >>> >>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >>> --- >>> arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 3 ++- >>> arch/powerpc/mm/book3s64/hugetlbpage.c | 2 +- >>> arch/powerpc/mm/book3s64/radix_hugetlbpage.c | 2 +- >>> arch/powerpc/mm/nohash/8xx.c | 2 +- >>> arch/powerpc/mm/pgtable.c | 7 ++++++- >>> 5 files changed, 11 insertions(+), 5 deletions(-) >>> >>> diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>> index de092b04ee1a..fff8cd726bc7 100644 >>> --- a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>> +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>> @@ -46,7 +46,8 @@ static inline int check_and_get_huge_psize(int shift) >>> } >>> >>> #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT >>> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); >>> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); >>> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); >> >> Don't add the burden of an additional function, see below >> >>> >>> #define __HAVE_ARCH_HUGE_PTE_CLEAR >>> static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, >>> diff --git a/arch/powerpc/mm/book3s64/hugetlbpage.c b/arch/powerpc/mm/book3s64/hugetlbpage.c >>> index 3bc0eb21b2a0..ae7fd7c90eb8 100644 >>> --- a/arch/powerpc/mm/book3s64/hugetlbpage.c >>> +++ b/arch/powerpc/mm/book3s64/hugetlbpage.c >>> @@ -147,7 +147,7 @@ void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr >>> if (radix_enabled()) >>> return radix__huge_ptep_modify_prot_commit(vma, addr, ptep, >>> old_pte, pte); >>> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>> + set_huge_pte_at(vma, addr, ptep, pte); >>> } >>> >>> void __init hugetlbpage_init_defaultsize(void) >>> diff --git a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>> index 17075c78d4bc..7cd40a334c3a 100644 >>> --- a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>> +++ b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>> @@ -58,5 +58,5 @@ void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma, >>> atomic_read(&mm->context.copros) > 0) >>> radix__flush_hugetlb_page(vma, addr); >>> >>> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>> + set_huge_pte_at(vma, addr, ptep, pte); >>> } >>> diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c >>> index dbbfe897455d..650a7a8496b6 100644 >>> --- a/arch/powerpc/mm/nohash/8xx.c >>> +++ b/arch/powerpc/mm/nohash/8xx.c >>> @@ -91,7 +91,7 @@ static int __ref __early_map_kernel_hugepage(unsigned long va, phys_addr_t pa, >>> if (new && WARN_ON(pte_present(*ptep) && pgprot_val(prot))) >>> return -EINVAL; >>> >>> - set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); >>> + __set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); >> >> Call set_huge_pte_at() with a NULL vma instead. > > I'm happy to take your proposed approach if that's your preference. Another > option is to use a dummy VMA, as I have done in the core code, for the one call > site that calls set_huge_pte_at() with init_mm: > > struct vm_area_struct vma = TLB_FLUSH_VMA(&init_mm, 0); > > This is an existing macro that creates a dummy vma with vma->vm_mm filled in. > Then I pass &vma to the function. I don't like that, I prefer the solution I proposed. We already have a couple places where powerpc do things based on whether vma is NULL or not. > > Or yet another option would be to keep the mm param as is in set_huge_pte_at(), > and add a size param to the function. But then all call sites have the burden of > figuring out the size of the huge pte (although I think most know already). Indeed. arch_make_huge_pte() used to take a vma until commit 79c1c594f49a ("mm/hugetlb: change parameters of arch_make_huge_pte()"). Should we try and have the same approach ? Or is it irrelevant ? Christophe > > Thanks, > Ryan > >> >>> >>> return 0; >>> } >>> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c >>> index 3f86fd217690..9cbcb561a4d8 100644 >>> --- a/arch/powerpc/mm/pgtable.c >>> +++ b/arch/powerpc/mm/pgtable.c >>> @@ -288,7 +288,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, >>> } >>> >>> #if defined(CONFIG_PPC_8xx) >>> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) >>> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) >> >> Keep it as set_huge_pte_at() with vma argument. >> >>> { >>> pmd_t *pmd = pmd_off(mm, addr); >> >> Change to: >> >> pmd_t *pmd = vma ? pmd_off(vma->vm_mm, addr) : pmd_off_k(addr); >> >>> pte_basic_t val; >>> @@ -310,6 +310,11 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ >>> for (i = 0; i < num; i++, entry++, val += SZ_4K) >>> *entry = val; >>> } >>> + >>> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte) >>> +{ >>> + __set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>> +} >> >> Remove this burden. >> >>> #endif >>> #endif /* CONFIG_HUGETLB_PAGE */ >>> >> >> >> Christophe >
On 22/09/2023 09:10, Christophe Leroy wrote: > > > Le 22/09/2023 à 09:33, Ryan Roberts a écrit : >> On 22/09/2023 07:56, Christophe Leroy wrote: >>> >>> >>> Le 21/09/2023 à 18:20, Ryan Roberts a écrit : >>>> In order to fix a bug, arm64 needs access to the vma inside it's >>>> implementation of set_huge_pte_at(). Provide for this by converting the >>>> mm parameter to be a vma. Any implementations that require the mm can >>>> access it via vma->vm_mm. >>>> >>>> This commit makes the required powerpc modifications. Separate commits >>>> update the other arches and core code, before the actual bug is fixed in >>>> arm64. >>>> >>>> No behavioral changes intended. >>>> >>>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >>>> --- >>>> arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 3 ++- >>>> arch/powerpc/mm/book3s64/hugetlbpage.c | 2 +- >>>> arch/powerpc/mm/book3s64/radix_hugetlbpage.c | 2 +- >>>> arch/powerpc/mm/nohash/8xx.c | 2 +- >>>> arch/powerpc/mm/pgtable.c | 7 ++++++- >>>> 5 files changed, 11 insertions(+), 5 deletions(-) >>>> >>>> diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>>> index de092b04ee1a..fff8cd726bc7 100644 >>>> --- a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>>> +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h >>>> @@ -46,7 +46,8 @@ static inline int check_and_get_huge_psize(int shift) >>>> } >>>> >>>> #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT >>>> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); >>>> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); >>>> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); >>> >>> Don't add the burden of an additional function, see below >>> >>>> >>>> #define __HAVE_ARCH_HUGE_PTE_CLEAR >>>> static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, >>>> diff --git a/arch/powerpc/mm/book3s64/hugetlbpage.c b/arch/powerpc/mm/book3s64/hugetlbpage.c >>>> index 3bc0eb21b2a0..ae7fd7c90eb8 100644 >>>> --- a/arch/powerpc/mm/book3s64/hugetlbpage.c >>>> +++ b/arch/powerpc/mm/book3s64/hugetlbpage.c >>>> @@ -147,7 +147,7 @@ void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr >>>> if (radix_enabled()) >>>> return radix__huge_ptep_modify_prot_commit(vma, addr, ptep, >>>> old_pte, pte); >>>> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>>> + set_huge_pte_at(vma, addr, ptep, pte); >>>> } >>>> >>>> void __init hugetlbpage_init_defaultsize(void) >>>> diff --git a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>>> index 17075c78d4bc..7cd40a334c3a 100644 >>>> --- a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>>> +++ b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c >>>> @@ -58,5 +58,5 @@ void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma, >>>> atomic_read(&mm->context.copros) > 0) >>>> radix__flush_hugetlb_page(vma, addr); >>>> >>>> - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>>> + set_huge_pte_at(vma, addr, ptep, pte); >>>> } >>>> diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c >>>> index dbbfe897455d..650a7a8496b6 100644 >>>> --- a/arch/powerpc/mm/nohash/8xx.c >>>> +++ b/arch/powerpc/mm/nohash/8xx.c >>>> @@ -91,7 +91,7 @@ static int __ref __early_map_kernel_hugepage(unsigned long va, phys_addr_t pa, >>>> if (new && WARN_ON(pte_present(*ptep) && pgprot_val(prot))) >>>> return -EINVAL; >>>> >>>> - set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); >>>> + __set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); >>> >>> Call set_huge_pte_at() with a NULL vma instead. >> >> I'm happy to take your proposed approach if that's your preference. Another >> option is to use a dummy VMA, as I have done in the core code, for the one call >> site that calls set_huge_pte_at() with init_mm: >> >> struct vm_area_struct vma = TLB_FLUSH_VMA(&init_mm, 0); >> >> This is an existing macro that creates a dummy vma with vma->vm_mm filled in. >> Then I pass &vma to the function. > > I don't like that, I prefer the solution I proposed. We already have a > couple places where powerpc do things based on whether vma is NULL or not. > >> >> Or yet another option would be to keep the mm param as is in set_huge_pte_at(), >> and add a size param to the function. But then all call sites have the burden of >> figuring out the size of the huge pte (although I think most know already). > > Indeed. > > arch_make_huge_pte() used to take a vma until commit 79c1c594f49a > ("mm/hugetlb: change parameters of arch_make_huge_pte()"). > > Should we try and have the same approach ? Or is it irrelevant ? See [1]; I'm going to rework to pass mm + size parameter since the current approach will break riscv. [1] https://lore.kernel.org/linux-arm-kernel/fc85f58e-e8ed-4b24-a3e5-d6288156595e@arm.com/ > > Christophe > >> >> Thanks, >> Ryan >> >>> >>>> >>>> return 0; >>>> } >>>> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c >>>> index 3f86fd217690..9cbcb561a4d8 100644 >>>> --- a/arch/powerpc/mm/pgtable.c >>>> +++ b/arch/powerpc/mm/pgtable.c >>>> @@ -288,7 +288,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, >>>> } >>>> >>>> #if defined(CONFIG_PPC_8xx) >>>> -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) >>>> +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) >>> >>> Keep it as set_huge_pte_at() with vma argument. >>> >>>> { >>>> pmd_t *pmd = pmd_off(mm, addr); >>> >>> Change to: >>> >>> pmd_t *pmd = vma ? pmd_off(vma->vm_mm, addr) : pmd_off_k(addr); >>> >>>> pte_basic_t val; >>>> @@ -310,6 +310,11 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ >>>> for (i = 0; i < num; i++, entry++, val += SZ_4K) >>>> *entry = val; >>>> } >>>> + >>>> +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte) >>>> +{ >>>> + __set_huge_pte_at(vma->vm_mm, addr, ptep, pte); >>>> +} >>> >>> Remove this burden. >>> >>>> #endif >>>> #endif /* CONFIG_HUGETLB_PAGE */ >>>> >>> >>> >>> Christophe >>
Le 22/09/2023 à 10:41, Ryan Roberts a écrit : > On 22/09/2023 09:10, Christophe Leroy wrote: >> >> >>> I'm happy to take your proposed approach if that's your preference. Another >>> option is to use a dummy VMA, as I have done in the core code, for the one call >>> site that calls set_huge_pte_at() with init_mm: >>> >>> struct vm_area_struct vma = TLB_FLUSH_VMA(&init_mm, 0); >>> >>> This is an existing macro that creates a dummy vma with vma->vm_mm filled in. >>> Then I pass &vma to the function. >> >> I don't like that, I prefer the solution I proposed. We already have a >> couple places where powerpc do things based on whether vma is NULL or not. >> >>> >>> Or yet another option would be to keep the mm param as is in set_huge_pte_at(), >>> and add a size param to the function. But then all call sites have the burden of >>> figuring out the size of the huge pte (although I think most know already). >> >> Indeed. >> >> arch_make_huge_pte() used to take a vma until commit 79c1c594f49a >> ("mm/hugetlb: change parameters of arch_make_huge_pte()"). >> >> Should we try and have the same approach ? Or is it irrelevant ? > > See [1]; I'm going to rework to pass mm + size parameter since the current > approach will break riscv. Can you pass a shift parameter instead of a size, like arch_make_huge_pte() ? As far as I remember it is easier to handle a shift than a size. Christophe
On 22/09/2023 10:14, Christophe Leroy wrote: > > > Le 22/09/2023 à 10:41, Ryan Roberts a écrit : >> On 22/09/2023 09:10, Christophe Leroy wrote: >>> >>> >>>> I'm happy to take your proposed approach if that's your preference. Another >>>> option is to use a dummy VMA, as I have done in the core code, for the one call >>>> site that calls set_huge_pte_at() with init_mm: >>>> >>>> struct vm_area_struct vma = TLB_FLUSH_VMA(&init_mm, 0); >>>> >>>> This is an existing macro that creates a dummy vma with vma->vm_mm filled in. >>>> Then I pass &vma to the function. >>> >>> I don't like that, I prefer the solution I proposed. We already have a >>> couple places where powerpc do things based on whether vma is NULL or not. >>> >>>> >>>> Or yet another option would be to keep the mm param as is in set_huge_pte_at(), >>>> and add a size param to the function. But then all call sites have the burden of >>>> figuring out the size of the huge pte (although I think most know already). >>> >>> Indeed. >>> >>> arch_make_huge_pte() used to take a vma until commit 79c1c594f49a >>> ("mm/hugetlb: change parameters of arch_make_huge_pte()"). >>> >>> Should we try and have the same approach ? Or is it irrelevant ? >> >> See [1]; I'm going to rework to pass mm + size parameter since the current >> approach will break riscv. > > Can you pass a shift parameter instead of a size, like > arch_make_huge_pte() ? As far as I remember it is easier to handle a > shift than a size. Most of the call sites already have the size, not the shift. And arm64 needs the size, so it would have do (1UL << shift). So on that basis, I prefer to pass size. huge_pte_clear() already passes long unsigned sz, so I'd rather follow that pattern. > > Christophe
diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h index de092b04ee1a..fff8cd726bc7 100644 --- a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h @@ -46,7 +46,8 @@ static inline int check_and_get_huge_psize(int shift) } #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte); +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); #define __HAVE_ARCH_HUGE_PTE_CLEAR static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, diff --git a/arch/powerpc/mm/book3s64/hugetlbpage.c b/arch/powerpc/mm/book3s64/hugetlbpage.c index 3bc0eb21b2a0..ae7fd7c90eb8 100644 --- a/arch/powerpc/mm/book3s64/hugetlbpage.c +++ b/arch/powerpc/mm/book3s64/hugetlbpage.c @@ -147,7 +147,7 @@ void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr if (radix_enabled()) return radix__huge_ptep_modify_prot_commit(vma, addr, ptep, old_pte, pte); - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); + set_huge_pte_at(vma, addr, ptep, pte); } void __init hugetlbpage_init_defaultsize(void) diff --git a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c index 17075c78d4bc..7cd40a334c3a 100644 --- a/arch/powerpc/mm/book3s64/radix_hugetlbpage.c +++ b/arch/powerpc/mm/book3s64/radix_hugetlbpage.c @@ -58,5 +58,5 @@ void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma, atomic_read(&mm->context.copros) > 0) radix__flush_hugetlb_page(vma, addr); - set_huge_pte_at(vma->vm_mm, addr, ptep, pte); + set_huge_pte_at(vma, addr, ptep, pte); } diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c index dbbfe897455d..650a7a8496b6 100644 --- a/arch/powerpc/mm/nohash/8xx.c +++ b/arch/powerpc/mm/nohash/8xx.c @@ -91,7 +91,7 @@ static int __ref __early_map_kernel_hugepage(unsigned long va, phys_addr_t pa, if (new && WARN_ON(pte_present(*ptep) && pgprot_val(prot))) return -EINVAL; - set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); + __set_huge_pte_at(&init_mm, va, ptep, pte_mkhuge(pfn_pte(pa >> PAGE_SHIFT, prot))); return 0; } diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 3f86fd217690..9cbcb561a4d8 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -288,7 +288,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, } #if defined(CONFIG_PPC_8xx) -void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) +void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte) { pmd_t *pmd = pmd_off(mm, addr); pte_basic_t val; @@ -310,6 +310,11 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ for (i = 0; i < num; i++, entry++, val += SZ_4K) *entry = val; } + +void set_huge_pte_at(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte) +{ + __set_huge_pte_at(vma->vm_mm, addr, ptep, pte); +} #endif #endif /* CONFIG_HUGETLB_PAGE */
In order to fix a bug, arm64 needs access to the vma inside it's implementation of set_huge_pte_at(). Provide for this by converting the mm parameter to be a vma. Any implementations that require the mm can access it via vma->vm_mm. This commit makes the required powerpc modifications. Separate commits update the other arches and core code, before the actual bug is fixed in arm64. No behavioral changes intended. Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> --- arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 3 ++- arch/powerpc/mm/book3s64/hugetlbpage.c | 2 +- arch/powerpc/mm/book3s64/radix_hugetlbpage.c | 2 +- arch/powerpc/mm/nohash/8xx.c | 2 +- arch/powerpc/mm/pgtable.c | 7 ++++++- 5 files changed, 11 insertions(+), 5 deletions(-)