Messages in this thread | | | Date | Tue, 22 Jun 2021 22:53:04 +0800 | From | Jisheng Zhang <> | Subject | Re: [PATCH v7 1/2] riscv: Introduce set_kernel_memory helper |
| |
Hi Alex,
On Tue, 22 Jun 2021 10:21:33 +0200 Alexandre Ghiti <alex@ghiti.fr> wrote:
> This helper should be used for setting permissions to the kernel > mapping as it takes pointers as arguments and then avoids explicit cast > to unsigned long needed for the set_memory_* API. > > Suggested-by: Christoph Hellwig <hch@infradead.org> > Signed-off-by: Alexandre Ghiti <alex@ghiti.fr> > Reviewed-by: Anup Patel <anup@brainfault.org> > --- > arch/riscv/include/asm/set_memory.h | 8 ++++++++ > arch/riscv/mm/pageattr.c | 11 +++++++++++ > 2 files changed, 19 insertions(+) > > diff --git a/arch/riscv/include/asm/set_memory.h b/arch/riscv/include/asm/set_memory.h > index 9d4d455726d4..4f9fc54d1806 100644 > --- a/arch/riscv/include/asm/set_memory.h > +++ b/arch/riscv/include/asm/set_memory.h > @@ -16,6 +16,8 @@ int set_memory_rw(unsigned long addr, int numpages); > int set_memory_x(unsigned long addr, int numpages); > int set_memory_nx(unsigned long addr, int numpages); > int set_memory_rw_nx(unsigned long addr, int numpages); > +int set_kernel_memory(char *start, char *end, > + int (*set_memory)(unsigned long start, int num_pages)); > void protect_kernel_text_data(void); > #else > static inline int set_memory_ro(unsigned long addr, int numpages) { return 0; } > @@ -24,6 +26,12 @@ static inline int set_memory_x(unsigned long addr, int numpages) { return 0; } > static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; } > static inline void protect_kernel_text_data(void) {} > static inline int set_memory_rw_nx(unsigned long addr, int numpages) { return 0; } > +static inline int set_kernel_memory(char *start, char *end, > + int (*set_memory)(unsigned long start, > + int num_pages)) > +{ > + return 0; > +} > #endif > > #if defined(CONFIG_64BIT) && defined(CONFIG_STRICT_KERNEL_RWX) > diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c > index 5e49e4b4a4cc..11d0b0f4c65d 100644 > --- a/arch/riscv/mm/pageattr.c > +++ b/arch/riscv/mm/pageattr.c > @@ -156,6 +156,17 @@ int set_memory_nx(unsigned long addr, int numpages) > return __set_memory(addr, numpages, __pgprot(0), __pgprot(_PAGE_EXEC)); > } > > +__always_inline int set_kernel_memory(char *startp, char *endp,
If __always_inline, can it be moved to set_memory.h?
Thanks
> + int (*set_memory)(unsigned long start, > + int num_pages)) > +{ > + unsigned long start = (unsigned long)startp; > + unsigned long end = (unsigned long)endp; > + int num_pages = PAGE_ALIGN(end - start) >> PAGE_SHIFT; > + > + return set_memory(start, num_pages); > +} > + > int set_direct_map_invalid_noflush(struct page *page) > { > int ret;
| |