Message ID | 1644805853-21338-26-git-send-email-anshuman.khandual@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/mmap: Drop protection_map[] and platform's __SXXX/__PXXX requirements | expand |
Hi Anshuman, On 2/13/22 20:30, Anshuman Khandual wrote: > This defines and exports a platform specific custom vm_get_page_prot() via > subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and __PXXX > macros can be dropped which are no longer needed. > > Cc: Dinh Nguyen <dinguyen@kernel.org> > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> > Acked-by: Dinh Nguyen <dinguyen@kernel.org> > --- > arch/nios2/Kconfig | 1 + > arch/nios2/include/asm/pgtable.h | 16 ------------ > arch/nios2/mm/init.c | 45 ++++++++++++++++++++++++++++++++ > 3 files changed, 46 insertions(+), 16 deletions(-) > > diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig > index 33fd06f5fa41..85a58a357a3b 100644 > --- a/arch/nios2/Kconfig > +++ b/arch/nios2/Kconfig > @@ -6,6 +6,7 @@ config NIOS2 > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_HAS_DMA_SET_UNCACHED > + select ARCH_HAS_VM_GET_PAGE_PROT > select ARCH_NO_SWAP > select COMMON_CLK > select TIMER_OF > diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h > index 4a995fa628ee..2678dad58a63 100644 > --- a/arch/nios2/include/asm/pgtable.h > +++ b/arch/nios2/include/asm/pgtable.h > @@ -40,24 +40,8 @@ struct mm_struct; > */ > > /* Remove W bit on private pages for COW support */ > -#define __P000 MKP(0, 0, 0) > -#define __P001 MKP(0, 0, 1) > -#define __P010 MKP(0, 0, 0) /* COW */ > -#define __P011 MKP(0, 0, 1) /* COW */ > -#define __P100 MKP(1, 0, 0) > -#define __P101 MKP(1, 0, 1) > -#define __P110 MKP(1, 0, 0) /* COW */ > -#define __P111 MKP(1, 0, 1) /* COW */ > > /* Shared pages can have exact HW mapping */ > -#define __S000 MKP(0, 0, 0) > -#define __S001 MKP(0, 0, 1) > -#define __S010 MKP(0, 1, 0) > -#define __S011 MKP(0, 1, 1) > -#define __S100 MKP(1, 0, 0) > -#define __S101 MKP(1, 0, 1) > -#define __S110 MKP(1, 1, 0) > -#define __S111 MKP(1, 1, 1) > > /* Used all over the kernel */ > #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ > diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c > index 613fcaa5988a..311b2146a248 100644 > --- a/arch/nios2/mm/init.c > +++ b/arch/nios2/mm/init.c > @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) > { > return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; > } > + > +pgprot_t vm_get_page_prot(unsigned long vm_flags) > +{ > + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { > + case VM_NONE: > + return MKP(0, 0, 0); > + case VM_READ: > + return MKP(0, 0, 1); > + /* COW */ > + case VM_WRITE: > + return MKP(0, 0, 0); > + /* COW */ > + case VM_WRITE | VM_READ: > + return MKP(0, 0, 1); > + case VM_EXEC: > + return MKP(1, 0, 0); > + case VM_EXEC | VM_READ: > + return MKP(1, 0, 1); > + /* COW */ > + case VM_EXEC | VM_WRITE: > + return MKP(1, 0, 0); > + /* COW */ > + case VM_EXEC | VM_WRITE | VM_READ: > + return MKP(1, 0, 1); > + case VM_SHARED: > + return MKP(0, 0, 0); > + case VM_SHARED | VM_READ: > + return MKP(0, 0, 1); > + case VM_SHARED | VM_WRITE: > + return MKP(0, 1, 0); > + case VM_SHARED | VM_WRITE | VM_READ: > + return MKP(0, 1, 1); > + case VM_SHARED | VM_EXEC: > + return MKP(1, 0, 0); > + case VM_SHARED | VM_EXEC | VM_READ: > + return MKP(1, 0, 1); > + case VM_SHARED | VM_EXEC | VM_WRITE: > + return MKP(1, 1, 0); > + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: > + return MKP(1, 1, 1); > + default: > + BUILD_BUG(); > + } > +} > +EXPORT_SYMBOL(vm_get_page_prot); I'm getting this compile error after applying this patch when build NIOS2: mm/mmap.c:105:2: error: ‘__P000’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:10: error: ‘__P001’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:18: error: ‘__P010’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ AR fs/devpts/built-in.a mm/mmap.c:105:26: error: ‘__P011’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:34: error: ‘__P100’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:42: error: ‘__P101’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:50: error: ‘__P110’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:105:58: error: ‘__P111’ undeclared here (not in a function) 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, | ^~~~~~ mm/mmap.c:106:2: error: ‘__S000’ undeclared here (not in a function) 106 | __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 | ^~~~~~ mm/mmap.c:106:10: error: ‘__S001’ undeclared here (not in a function) 106 | __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 Dinh
On 2/25/22 7:01 AM, Dinh Nguyen wrote: > Hi Anshuman, > > On 2/13/22 20:30, Anshuman Khandual wrote: >> This defines and exports a platform specific custom vm_get_page_prot() via >> subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and __PXXX >> macros can be dropped which are no longer needed. >> >> Cc: Dinh Nguyen <dinguyen@kernel.org> >> Cc: linux-kernel@vger.kernel.org >> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >> Acked-by: Dinh Nguyen <dinguyen@kernel.org> >> --- >> arch/nios2/Kconfig | 1 + >> arch/nios2/include/asm/pgtable.h | 16 ------------ >> arch/nios2/mm/init.c | 45 ++++++++++++++++++++++++++++++++ >> 3 files changed, 46 insertions(+), 16 deletions(-) >> >> diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig >> index 33fd06f5fa41..85a58a357a3b 100644 >> --- a/arch/nios2/Kconfig >> +++ b/arch/nios2/Kconfig >> @@ -6,6 +6,7 @@ config NIOS2 >> select ARCH_HAS_SYNC_DMA_FOR_CPU >> select ARCH_HAS_SYNC_DMA_FOR_DEVICE >> select ARCH_HAS_DMA_SET_UNCACHED >> + select ARCH_HAS_VM_GET_PAGE_PROT >> select ARCH_NO_SWAP >> select COMMON_CLK >> select TIMER_OF >> diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h >> index 4a995fa628ee..2678dad58a63 100644 >> --- a/arch/nios2/include/asm/pgtable.h >> +++ b/arch/nios2/include/asm/pgtable.h >> @@ -40,24 +40,8 @@ struct mm_struct; >> */ >> /* Remove W bit on private pages for COW support */ >> -#define __P000 MKP(0, 0, 0) >> -#define __P001 MKP(0, 0, 1) >> -#define __P010 MKP(0, 0, 0) /* COW */ >> -#define __P011 MKP(0, 0, 1) /* COW */ >> -#define __P100 MKP(1, 0, 0) >> -#define __P101 MKP(1, 0, 1) >> -#define __P110 MKP(1, 0, 0) /* COW */ >> -#define __P111 MKP(1, 0, 1) /* COW */ >> /* Shared pages can have exact HW mapping */ >> -#define __S000 MKP(0, 0, 0) >> -#define __S001 MKP(0, 0, 1) >> -#define __S010 MKP(0, 1, 0) >> -#define __S011 MKP(0, 1, 1) >> -#define __S100 MKP(1, 0, 0) >> -#define __S101 MKP(1, 0, 1) >> -#define __S110 MKP(1, 1, 0) >> -#define __S111 MKP(1, 1, 1) >> /* Used all over the kernel */ >> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ >> diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c >> index 613fcaa5988a..311b2146a248 100644 >> --- a/arch/nios2/mm/init.c >> +++ b/arch/nios2/mm/init.c >> @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) >> { >> return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; >> } >> + >> +pgprot_t vm_get_page_prot(unsigned long vm_flags) >> +{ >> + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { >> + case VM_NONE: >> + return MKP(0, 0, 0); >> + case VM_READ: >> + return MKP(0, 0, 1); >> + /* COW */ >> + case VM_WRITE: >> + return MKP(0, 0, 0); >> + /* COW */ >> + case VM_WRITE | VM_READ: >> + return MKP(0, 0, 1); >> + case VM_EXEC: >> + return MKP(1, 0, 0); >> + case VM_EXEC | VM_READ: >> + return MKP(1, 0, 1); >> + /* COW */ >> + case VM_EXEC | VM_WRITE: >> + return MKP(1, 0, 0); >> + /* COW */ >> + case VM_EXEC | VM_WRITE | VM_READ: >> + return MKP(1, 0, 1); >> + case VM_SHARED: >> + return MKP(0, 0, 0); >> + case VM_SHARED | VM_READ: >> + return MKP(0, 0, 1); >> + case VM_SHARED | VM_WRITE: >> + return MKP(0, 1, 0); >> + case VM_SHARED | VM_WRITE | VM_READ: >> + return MKP(0, 1, 1); >> + case VM_SHARED | VM_EXEC: >> + return MKP(1, 0, 0); >> + case VM_SHARED | VM_EXEC | VM_READ: >> + return MKP(1, 0, 1); >> + case VM_SHARED | VM_EXEC | VM_WRITE: >> + return MKP(1, 1, 0); >> + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: >> + return MKP(1, 1, 1); >> + default: >> + BUILD_BUG(); >> + } >> +} >> +EXPORT_SYMBOL(vm_get_page_prot); > > I'm getting this compile error after applying this patch when build NIOS2: Hmm, that is strange. Did you apply the entire series or atleast upto the nios2 patch ? Generic vm_get_page_prot() should not be called (which is build complaining here) when ARCH_HAS_VM_GET_PAGE_PROT is already enabled on nios2 platform. Ran a quick build test on nios2 for the entire series and also just upto this particular patch, build was successful. > > > mm/mmap.c:105:2: error: ‘__P000’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:10: error: ‘__P001’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:18: error: ‘__P010’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > AR fs/devpts/built-in.a > > mm/mmap.c:105:26: error: ‘__P011’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:34: error: ‘__P100’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:42: error: ‘__P101’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:50: error: ‘__P110’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:105:58: error: ‘__P111’ undeclared here (not in a function) > > 105 | __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, > > | ^~~~~~ > > mm/mmap.c:106:2: error: ‘__S000’ undeclared here (not in a function) > > 106 | __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 > > | ^~~~~~ > > mm/mmap.c:106:10: error: ‘__S001’ undeclared here (not in a function) > > 106 | __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 > > > > Dinh >
On 2/25/22 2:22 PM, Anshuman Khandual wrote: > > On 2/25/22 7:01 AM, Dinh Nguyen wrote: >> Hi Anshuman, >> >> On 2/13/22 20:30, Anshuman Khandual wrote: >>> This defines and exports a platform specific custom vm_get_page_prot() via >>> subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and __PXXX >>> macros can be dropped which are no longer needed. >>> >>> Cc: Dinh Nguyen <dinguyen@kernel.org> >>> Cc: linux-kernel@vger.kernel.org >>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>> Acked-by: Dinh Nguyen <dinguyen@kernel.org> >>> --- >>> arch/nios2/Kconfig | 1 + >>> arch/nios2/include/asm/pgtable.h | 16 ------------ >>> arch/nios2/mm/init.c | 45 ++++++++++++++++++++++++++++++++ >>> 3 files changed, 46 insertions(+), 16 deletions(-) >>> >>> diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig >>> index 33fd06f5fa41..85a58a357a3b 100644 >>> --- a/arch/nios2/Kconfig >>> +++ b/arch/nios2/Kconfig >>> @@ -6,6 +6,7 @@ config NIOS2 >>> select ARCH_HAS_SYNC_DMA_FOR_CPU >>> select ARCH_HAS_SYNC_DMA_FOR_DEVICE >>> select ARCH_HAS_DMA_SET_UNCACHED >>> + select ARCH_HAS_VM_GET_PAGE_PROT >>> select ARCH_NO_SWAP >>> select COMMON_CLK >>> select TIMER_OF >>> diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h >>> index 4a995fa628ee..2678dad58a63 100644 >>> --- a/arch/nios2/include/asm/pgtable.h >>> +++ b/arch/nios2/include/asm/pgtable.h >>> @@ -40,24 +40,8 @@ struct mm_struct; >>> */ >>> /* Remove W bit on private pages for COW support */ >>> -#define __P000 MKP(0, 0, 0) >>> -#define __P001 MKP(0, 0, 1) >>> -#define __P010 MKP(0, 0, 0) /* COW */ >>> -#define __P011 MKP(0, 0, 1) /* COW */ >>> -#define __P100 MKP(1, 0, 0) >>> -#define __P101 MKP(1, 0, 1) >>> -#define __P110 MKP(1, 0, 0) /* COW */ >>> -#define __P111 MKP(1, 0, 1) /* COW */ >>> /* Shared pages can have exact HW mapping */ >>> -#define __S000 MKP(0, 0, 0) >>> -#define __S001 MKP(0, 0, 1) >>> -#define __S010 MKP(0, 1, 0) >>> -#define __S011 MKP(0, 1, 1) >>> -#define __S100 MKP(1, 0, 0) >>> -#define __S101 MKP(1, 0, 1) >>> -#define __S110 MKP(1, 1, 0) >>> -#define __S111 MKP(1, 1, 1) >>> /* Used all over the kernel */ >>> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ >>> diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c >>> index 613fcaa5988a..311b2146a248 100644 >>> --- a/arch/nios2/mm/init.c >>> +++ b/arch/nios2/mm/init.c >>> @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) >>> { >>> return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; >>> } >>> + >>> +pgprot_t vm_get_page_prot(unsigned long vm_flags) >>> +{ >>> + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { >>> + case VM_NONE: >>> + return MKP(0, 0, 0); >>> + case VM_READ: >>> + return MKP(0, 0, 1); >>> + /* COW */ >>> + case VM_WRITE: >>> + return MKP(0, 0, 0); >>> + /* COW */ >>> + case VM_WRITE | VM_READ: >>> + return MKP(0, 0, 1); >>> + case VM_EXEC: >>> + return MKP(1, 0, 0); >>> + case VM_EXEC | VM_READ: >>> + return MKP(1, 0, 1); >>> + /* COW */ >>> + case VM_EXEC | VM_WRITE: >>> + return MKP(1, 0, 0); >>> + /* COW */ >>> + case VM_EXEC | VM_WRITE | VM_READ: >>> + return MKP(1, 0, 1); >>> + case VM_SHARED: >>> + return MKP(0, 0, 0); >>> + case VM_SHARED | VM_READ: >>> + return MKP(0, 0, 1); >>> + case VM_SHARED | VM_WRITE: >>> + return MKP(0, 1, 0); >>> + case VM_SHARED | VM_WRITE | VM_READ: >>> + return MKP(0, 1, 1); >>> + case VM_SHARED | VM_EXEC: >>> + return MKP(1, 0, 0); >>> + case VM_SHARED | VM_EXEC | VM_READ: >>> + return MKP(1, 0, 1); >>> + case VM_SHARED | VM_EXEC | VM_WRITE: >>> + return MKP(1, 1, 0); >>> + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: >>> + return MKP(1, 1, 1); >>> + default: >>> + BUILD_BUG(); >>> + } >>> +} >>> +EXPORT_SYMBOL(vm_get_page_prot); >> I'm getting this compile error after applying this patch when build NIOS2: > Hmm, that is strange. > > Did you apply the entire series or atleast upto the nios2 patch ? Generic > vm_get_page_prot() should not be called (which is build complaining here) > when ARCH_HAS_VM_GET_PAGE_PROT is already enabled on nios2 platform. > > Ran a quick build test on nios2 for the entire series and also just upto > this particular patch, build was successful. > Please refer to the latest version V2 instead. https://lore.kernel.org/linux-mm/1645425519-9034-1-git-send-email-anshuman.khandual@arm.com/
On 2/25/22 02:52, Anshuman Khandual wrote: > > > On 2/25/22 7:01 AM, Dinh Nguyen wrote: >> Hi Anshuman, >> >> On 2/13/22 20:30, Anshuman Khandual wrote: >>> This defines and exports a platform specific custom vm_get_page_prot() via >>> subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and __PXXX >>> macros can be dropped which are no longer needed. >>> >>> Cc: Dinh Nguyen <dinguyen@kernel.org> >>> Cc: linux-kernel@vger.kernel.org >>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>> Acked-by: Dinh Nguyen <dinguyen@kernel.org> >>> --- >>> arch/nios2/Kconfig | 1 + >>> arch/nios2/include/asm/pgtable.h | 16 ------------ >>> arch/nios2/mm/init.c | 45 ++++++++++++++++++++++++++++++++ >>> 3 files changed, 46 insertions(+), 16 deletions(-) >>> >>> diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig >>> index 33fd06f5fa41..85a58a357a3b 100644 >>> --- a/arch/nios2/Kconfig >>> +++ b/arch/nios2/Kconfig >>> @@ -6,6 +6,7 @@ config NIOS2 >>> select ARCH_HAS_SYNC_DMA_FOR_CPU >>> select ARCH_HAS_SYNC_DMA_FOR_DEVICE >>> select ARCH_HAS_DMA_SET_UNCACHED >>> + select ARCH_HAS_VM_GET_PAGE_PROT >>> select ARCH_NO_SWAP >>> select COMMON_CLK >>> select TIMER_OF >>> diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h >>> index 4a995fa628ee..2678dad58a63 100644 >>> --- a/arch/nios2/include/asm/pgtable.h >>> +++ b/arch/nios2/include/asm/pgtable.h >>> @@ -40,24 +40,8 @@ struct mm_struct; >>> */ >>> /* Remove W bit on private pages for COW support */ >>> -#define __P000 MKP(0, 0, 0) >>> -#define __P001 MKP(0, 0, 1) >>> -#define __P010 MKP(0, 0, 0) /* COW */ >>> -#define __P011 MKP(0, 0, 1) /* COW */ >>> -#define __P100 MKP(1, 0, 0) >>> -#define __P101 MKP(1, 0, 1) >>> -#define __P110 MKP(1, 0, 0) /* COW */ >>> -#define __P111 MKP(1, 0, 1) /* COW */ >>> /* Shared pages can have exact HW mapping */ >>> -#define __S000 MKP(0, 0, 0) >>> -#define __S001 MKP(0, 0, 1) >>> -#define __S010 MKP(0, 1, 0) >>> -#define __S011 MKP(0, 1, 1) >>> -#define __S100 MKP(1, 0, 0) >>> -#define __S101 MKP(1, 0, 1) >>> -#define __S110 MKP(1, 1, 0) >>> -#define __S111 MKP(1, 1, 1) >>> /* Used all over the kernel */ >>> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ >>> diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c >>> index 613fcaa5988a..311b2146a248 100644 >>> --- a/arch/nios2/mm/init.c >>> +++ b/arch/nios2/mm/init.c >>> @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) >>> { >>> return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; >>> } >>> + >>> +pgprot_t vm_get_page_prot(unsigned long vm_flags) >>> +{ >>> + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { >>> + case VM_NONE: >>> + return MKP(0, 0, 0); >>> + case VM_READ: >>> + return MKP(0, 0, 1); >>> + /* COW */ >>> + case VM_WRITE: >>> + return MKP(0, 0, 0); >>> + /* COW */ >>> + case VM_WRITE | VM_READ: >>> + return MKP(0, 0, 1); >>> + case VM_EXEC: >>> + return MKP(1, 0, 0); >>> + case VM_EXEC | VM_READ: >>> + return MKP(1, 0, 1); >>> + /* COW */ >>> + case VM_EXEC | VM_WRITE: >>> + return MKP(1, 0, 0); >>> + /* COW */ >>> + case VM_EXEC | VM_WRITE | VM_READ: >>> + return MKP(1, 0, 1); >>> + case VM_SHARED: >>> + return MKP(0, 0, 0); >>> + case VM_SHARED | VM_READ: >>> + return MKP(0, 0, 1); >>> + case VM_SHARED | VM_WRITE: >>> + return MKP(0, 1, 0); >>> + case VM_SHARED | VM_WRITE | VM_READ: >>> + return MKP(0, 1, 1); >>> + case VM_SHARED | VM_EXEC: >>> + return MKP(1, 0, 0); >>> + case VM_SHARED | VM_EXEC | VM_READ: >>> + return MKP(1, 0, 1); >>> + case VM_SHARED | VM_EXEC | VM_WRITE: >>> + return MKP(1, 1, 0); >>> + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: >>> + return MKP(1, 1, 1); >>> + default: >>> + BUILD_BUG(); >>> + } >>> +} >>> +EXPORT_SYMBOL(vm_get_page_prot); >> >> I'm getting this compile error after applying this patch when build NIOS2: > > Hmm, that is strange. > > Did you apply the entire series or atleast upto the nios2 patch ? Generic > vm_get_page_prot() should not be called (which is build complaining here) > when ARCH_HAS_VM_GET_PAGE_PROT is already enabled on nios2 platform. > > Ran a quick build test on nios2 for the entire series and also just upto > this particular patch, build was successful. > Ok, I did not apply the whole series, just this patch. Dinh
On 2/25/22 08:29, Dinh Nguyen wrote: > > > On 2/25/22 02:52, Anshuman Khandual wrote: >> >> >> On 2/25/22 7:01 AM, Dinh Nguyen wrote: >>> Hi Anshuman, >>> >>> On 2/13/22 20:30, Anshuman Khandual wrote: >>>> This defines and exports a platform specific custom >>>> vm_get_page_prot() via >>>> subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and >>>> __PXXX >>>> macros can be dropped which are no longer needed. >>>> >>>> Cc: Dinh Nguyen <dinguyen@kernel.org> >>>> Cc: linux-kernel@vger.kernel.org >>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>>> Acked-by: Dinh Nguyen <dinguyen@kernel.org> >>>> --- >>>> arch/nios2/Kconfig | 1 + >>>> arch/nios2/include/asm/pgtable.h | 16 ------------ >>>> arch/nios2/mm/init.c | 45 >>>> ++++++++++++++++++++++++++++++++ >>>> 3 files changed, 46 insertions(+), 16 deletions(-) >>>> >>>> diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig >>>> index 33fd06f5fa41..85a58a357a3b 100644 >>>> --- a/arch/nios2/Kconfig >>>> +++ b/arch/nios2/Kconfig >>>> @@ -6,6 +6,7 @@ config NIOS2 >>>> select ARCH_HAS_SYNC_DMA_FOR_CPU >>>> select ARCH_HAS_SYNC_DMA_FOR_DEVICE >>>> select ARCH_HAS_DMA_SET_UNCACHED >>>> + select ARCH_HAS_VM_GET_PAGE_PROT >>>> select ARCH_NO_SWAP >>>> select COMMON_CLK >>>> select TIMER_OF >>>> diff --git a/arch/nios2/include/asm/pgtable.h >>>> b/arch/nios2/include/asm/pgtable.h >>>> index 4a995fa628ee..2678dad58a63 100644 >>>> --- a/arch/nios2/include/asm/pgtable.h >>>> +++ b/arch/nios2/include/asm/pgtable.h >>>> @@ -40,24 +40,8 @@ struct mm_struct; >>>> */ >>>> /* Remove W bit on private pages for COW support */ >>>> -#define __P000 MKP(0, 0, 0) >>>> -#define __P001 MKP(0, 0, 1) >>>> -#define __P010 MKP(0, 0, 0) /* COW */ >>>> -#define __P011 MKP(0, 0, 1) /* COW */ >>>> -#define __P100 MKP(1, 0, 0) >>>> -#define __P101 MKP(1, 0, 1) >>>> -#define __P110 MKP(1, 0, 0) /* COW */ >>>> -#define __P111 MKP(1, 0, 1) /* COW */ >>>> /* Shared pages can have exact HW mapping */ >>>> -#define __S000 MKP(0, 0, 0) >>>> -#define __S001 MKP(0, 0, 1) >>>> -#define __S010 MKP(0, 1, 0) >>>> -#define __S011 MKP(0, 1, 1) >>>> -#define __S100 MKP(1, 0, 0) >>>> -#define __S101 MKP(1, 0, 1) >>>> -#define __S110 MKP(1, 1, 0) >>>> -#define __S111 MKP(1, 1, 1) >>>> /* Used all over the kernel */ >>>> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | >>>> _PAGE_READ | \ >>>> diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c >>>> index 613fcaa5988a..311b2146a248 100644 >>>> --- a/arch/nios2/mm/init.c >>>> +++ b/arch/nios2/mm/init.c >>>> @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct >>>> *vma) >>>> { >>>> return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; >>>> } >>>> + >>>> +pgprot_t vm_get_page_prot(unsigned long vm_flags) >>>> +{ >>>> + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { >>>> + case VM_NONE: >>>> + return MKP(0, 0, 0); >>>> + case VM_READ: >>>> + return MKP(0, 0, 1); >>>> + /* COW */ >>>> + case VM_WRITE: >>>> + return MKP(0, 0, 0); >>>> + /* COW */ >>>> + case VM_WRITE | VM_READ: >>>> + return MKP(0, 0, 1); >>>> + case VM_EXEC: >>>> + return MKP(1, 0, 0); >>>> + case VM_EXEC | VM_READ: >>>> + return MKP(1, 0, 1); >>>> + /* COW */ >>>> + case VM_EXEC | VM_WRITE: >>>> + return MKP(1, 0, 0); >>>> + /* COW */ >>>> + case VM_EXEC | VM_WRITE | VM_READ: >>>> + return MKP(1, 0, 1); >>>> + case VM_SHARED: >>>> + return MKP(0, 0, 0); >>>> + case VM_SHARED | VM_READ: >>>> + return MKP(0, 0, 1); >>>> + case VM_SHARED | VM_WRITE: >>>> + return MKP(0, 1, 0); >>>> + case VM_SHARED | VM_WRITE | VM_READ: >>>> + return MKP(0, 1, 1); >>>> + case VM_SHARED | VM_EXEC: >>>> + return MKP(1, 0, 0); >>>> + case VM_SHARED | VM_EXEC | VM_READ: >>>> + return MKP(1, 0, 1); >>>> + case VM_SHARED | VM_EXEC | VM_WRITE: >>>> + return MKP(1, 1, 0); >>>> + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: >>>> + return MKP(1, 1, 1); >>>> + default: >>>> + BUILD_BUG(); >>>> + } >>>> +} >>>> +EXPORT_SYMBOL(vm_get_page_prot); >>> >>> I'm getting this compile error after applying this patch when build >>> NIOS2: >> >> Hmm, that is strange. >> >> Did you apply the entire series or atleast upto the nios2 patch ? Generic >> vm_get_page_prot() should not be called (which is build complaining here) >> when ARCH_HAS_VM_GET_PAGE_PROT is already enabled on nios2 platform. >> >> Ran a quick build test on nios2 for the entire series and also just upto >> this particular patch, build was successful. >> > > Ok, I did not apply the whole series, just this patch. > Is someone taking this whole series or should I just take this patch? Dinh
On 2/25/22 8:08 PM, Dinh Nguyen wrote: > > > On 2/25/22 08:29, Dinh Nguyen wrote: >> >> >> On 2/25/22 02:52, Anshuman Khandual wrote: >>> >>> >>> On 2/25/22 7:01 AM, Dinh Nguyen wrote: >>>> Hi Anshuman, >>>> >>>> On 2/13/22 20:30, Anshuman Khandual wrote: >>>>> This defines and exports a platform specific custom vm_get_page_prot() via >>>>> subscribing ARCH_HAS_VM_GET_PAGE_PROT. Subsequently all __SXXX and __PXXX >>>>> macros can be dropped which are no longer needed. >>>>> >>>>> Cc: Dinh Nguyen <dinguyen@kernel.org> >>>>> Cc: linux-kernel@vger.kernel.org >>>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> >>>>> Acked-by: Dinh Nguyen <dinguyen@kernel.org> >>>>> --- >>>>> arch/nios2/Kconfig | 1 + >>>>> arch/nios2/include/asm/pgtable.h | 16 ------------ >>>>> arch/nios2/mm/init.c | 45 ++++++++++++++++++++++++++++++++ >>>>> 3 files changed, 46 insertions(+), 16 deletions(-) >>>>> >>>>> diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig >>>>> index 33fd06f5fa41..85a58a357a3b 100644 >>>>> --- a/arch/nios2/Kconfig >>>>> +++ b/arch/nios2/Kconfig >>>>> @@ -6,6 +6,7 @@ config NIOS2 >>>>> select ARCH_HAS_SYNC_DMA_FOR_CPU >>>>> select ARCH_HAS_SYNC_DMA_FOR_DEVICE >>>>> select ARCH_HAS_DMA_SET_UNCACHED >>>>> + select ARCH_HAS_VM_GET_PAGE_PROT >>>>> select ARCH_NO_SWAP >>>>> select COMMON_CLK >>>>> select TIMER_OF >>>>> diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h >>>>> index 4a995fa628ee..2678dad58a63 100644 >>>>> --- a/arch/nios2/include/asm/pgtable.h >>>>> +++ b/arch/nios2/include/asm/pgtable.h >>>>> @@ -40,24 +40,8 @@ struct mm_struct; >>>>> */ >>>>> /* Remove W bit on private pages for COW support */ >>>>> -#define __P000 MKP(0, 0, 0) >>>>> -#define __P001 MKP(0, 0, 1) >>>>> -#define __P010 MKP(0, 0, 0) /* COW */ >>>>> -#define __P011 MKP(0, 0, 1) /* COW */ >>>>> -#define __P100 MKP(1, 0, 0) >>>>> -#define __P101 MKP(1, 0, 1) >>>>> -#define __P110 MKP(1, 0, 0) /* COW */ >>>>> -#define __P111 MKP(1, 0, 1) /* COW */ >>>>> /* Shared pages can have exact HW mapping */ >>>>> -#define __S000 MKP(0, 0, 0) >>>>> -#define __S001 MKP(0, 0, 1) >>>>> -#define __S010 MKP(0, 1, 0) >>>>> -#define __S011 MKP(0, 1, 1) >>>>> -#define __S100 MKP(1, 0, 0) >>>>> -#define __S101 MKP(1, 0, 1) >>>>> -#define __S110 MKP(1, 1, 0) >>>>> -#define __S111 MKP(1, 1, 1) >>>>> /* Used all over the kernel */ >>>>> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ >>>>> diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c >>>>> index 613fcaa5988a..311b2146a248 100644 >>>>> --- a/arch/nios2/mm/init.c >>>>> +++ b/arch/nios2/mm/init.c >>>>> @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) >>>>> { >>>>> return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; >>>>> } >>>>> + >>>>> +pgprot_t vm_get_page_prot(unsigned long vm_flags) >>>>> +{ >>>>> + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { >>>>> + case VM_NONE: >>>>> + return MKP(0, 0, 0); >>>>> + case VM_READ: >>>>> + return MKP(0, 0, 1); >>>>> + /* COW */ >>>>> + case VM_WRITE: >>>>> + return MKP(0, 0, 0); >>>>> + /* COW */ >>>>> + case VM_WRITE | VM_READ: >>>>> + return MKP(0, 0, 1); >>>>> + case VM_EXEC: >>>>> + return MKP(1, 0, 0); >>>>> + case VM_EXEC | VM_READ: >>>>> + return MKP(1, 0, 1); >>>>> + /* COW */ >>>>> + case VM_EXEC | VM_WRITE: >>>>> + return MKP(1, 0, 0); >>>>> + /* COW */ >>>>> + case VM_EXEC | VM_WRITE | VM_READ: >>>>> + return MKP(1, 0, 1); >>>>> + case VM_SHARED: >>>>> + return MKP(0, 0, 0); >>>>> + case VM_SHARED | VM_READ: >>>>> + return MKP(0, 0, 1); >>>>> + case VM_SHARED | VM_WRITE: >>>>> + return MKP(0, 1, 0); >>>>> + case VM_SHARED | VM_WRITE | VM_READ: >>>>> + return MKP(0, 1, 1); >>>>> + case VM_SHARED | VM_EXEC: >>>>> + return MKP(1, 0, 0); >>>>> + case VM_SHARED | VM_EXEC | VM_READ: >>>>> + return MKP(1, 0, 1); >>>>> + case VM_SHARED | VM_EXEC | VM_WRITE: >>>>> + return MKP(1, 1, 0); >>>>> + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: >>>>> + return MKP(1, 1, 1); >>>>> + default: >>>>> + BUILD_BUG(); >>>>> + } >>>>> +} >>>>> +EXPORT_SYMBOL(vm_get_page_prot); >>>> >>>> I'm getting this compile error after applying this patch when build NIOS2: >>> >>> Hmm, that is strange. >>> >>> Did you apply the entire series or atleast upto the nios2 patch ? Generic >>> vm_get_page_prot() should not be called (which is build complaining here) >>> when ARCH_HAS_VM_GET_PAGE_PROT is already enabled on nios2 platform. >>> >>> Ran a quick build test on nios2 for the entire series and also just upto >>> this particular patch, build was successful. >>> >> >> Ok, I did not apply the whole series, just this patch. >> > > > Is someone taking this whole series or should I just take this patch? I expect the series (latest instead) will go via the mm tree, but will really appreciate your tags if you find the series acceptable.
diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig index 33fd06f5fa41..85a58a357a3b 100644 --- a/arch/nios2/Kconfig +++ b/arch/nios2/Kconfig @@ -6,6 +6,7 @@ config NIOS2 select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_DMA_SET_UNCACHED + select ARCH_HAS_VM_GET_PAGE_PROT select ARCH_NO_SWAP select COMMON_CLK select TIMER_OF diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h index 4a995fa628ee..2678dad58a63 100644 --- a/arch/nios2/include/asm/pgtable.h +++ b/arch/nios2/include/asm/pgtable.h @@ -40,24 +40,8 @@ struct mm_struct; */ /* Remove W bit on private pages for COW support */ -#define __P000 MKP(0, 0, 0) -#define __P001 MKP(0, 0, 1) -#define __P010 MKP(0, 0, 0) /* COW */ -#define __P011 MKP(0, 0, 1) /* COW */ -#define __P100 MKP(1, 0, 0) -#define __P101 MKP(1, 0, 1) -#define __P110 MKP(1, 0, 0) /* COW */ -#define __P111 MKP(1, 0, 1) /* COW */ /* Shared pages can have exact HW mapping */ -#define __S000 MKP(0, 0, 0) -#define __S001 MKP(0, 0, 1) -#define __S010 MKP(0, 1, 0) -#define __S011 MKP(0, 1, 1) -#define __S100 MKP(1, 0, 0) -#define __S101 MKP(1, 0, 1) -#define __S110 MKP(1, 1, 0) -#define __S111 MKP(1, 1, 1) /* Used all over the kernel */ #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHED | _PAGE_READ | \ diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c index 613fcaa5988a..311b2146a248 100644 --- a/arch/nios2/mm/init.c +++ b/arch/nios2/mm/init.c @@ -124,3 +124,48 @@ const char *arch_vma_name(struct vm_area_struct *vma) { return (vma->vm_start == KUSER_BASE) ? "[kuser]" : NULL; } + +pgprot_t vm_get_page_prot(unsigned long vm_flags) +{ + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { + case VM_NONE: + return MKP(0, 0, 0); + case VM_READ: + return MKP(0, 0, 1); + /* COW */ + case VM_WRITE: + return MKP(0, 0, 0); + /* COW */ + case VM_WRITE | VM_READ: + return MKP(0, 0, 1); + case VM_EXEC: + return MKP(1, 0, 0); + case VM_EXEC | VM_READ: + return MKP(1, 0, 1); + /* COW */ + case VM_EXEC | VM_WRITE: + return MKP(1, 0, 0); + /* COW */ + case VM_EXEC | VM_WRITE | VM_READ: + return MKP(1, 0, 1); + case VM_SHARED: + return MKP(0, 0, 0); + case VM_SHARED | VM_READ: + return MKP(0, 0, 1); + case VM_SHARED | VM_WRITE: + return MKP(0, 1, 0); + case VM_SHARED | VM_WRITE | VM_READ: + return MKP(0, 1, 1); + case VM_SHARED | VM_EXEC: + return MKP(1, 0, 0); + case VM_SHARED | VM_EXEC | VM_READ: + return MKP(1, 0, 1); + case VM_SHARED | VM_EXEC | VM_WRITE: + return MKP(1, 1, 0); + case VM_SHARED | VM_EXEC | VM_WRITE | VM_READ: + return MKP(1, 1, 1); + default: + BUILD_BUG(); + } +} +EXPORT_SYMBOL(vm_get_page_prot);