[v1,2/8] powerpc: hugetlb: Convert set_huge_pte_at() to take vma

Message ID 20230921162007.1630149-3-ryan.roberts@arm.com
State New
Headers
Series Fix set_huge_pte_at() panic on arm64 |

Commit Message

Ryan Roberts Sept. 21, 2023, 4:20 p.m. UTC
  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(-)
  

Comments

Christophe Leroy Sept. 21, 2023, 6:43 p.m. UTC | #1
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
  
Christophe Leroy Sept. 22, 2023, 6:44 a.m. UTC | #2
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
  
Christophe Leroy Sept. 22, 2023, 6:56 a.m. UTC | #3
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
  
Ryan Roberts Sept. 22, 2023, 7:19 a.m. UTC | #4
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
  
Ryan Roberts Sept. 22, 2023, 7:33 a.m. UTC | #5
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
  
Christophe Leroy Sept. 22, 2023, 8:10 a.m. UTC | #6
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
>
  
Ryan Roberts Sept. 22, 2023, 8:41 a.m. UTC | #7
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
>>
  
Christophe Leroy Sept. 22, 2023, 9:14 a.m. UTC | #8
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
  
Ryan Roberts Sept. 22, 2023, 9:37 a.m. UTC | #9
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
  

Patch

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 */