| Message ID | 20210316031741.1004850-7-jniethe5@gmail.com (mailing list archive) |
|---|---|
| State | Changes Requested |
| Headers | show |
| Series | [v9,1/8] powerpc/mm: Implement set_memory() routines | expand |
| Related | show |
| Context | Check | Description |
|---|---|---|
| snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/merge (0512161accb8b6f6dacc85d165350b1812ddcc33) |
| snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/next (fbda7904302499dd7ffc073a3c84eb7c9275db0a) |
| snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linus/master (1a4431a5db2bf800c647ee0ed87f2727b8d6c29c) |
| snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/fixes (eed5fae00593ab9d261a0c1ffc1bdb786a87a55a) |
| snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linux-next (1e28eed17697bcf343c6743f0028cc3b5dd88bf0) |
| snowpatch_ozlabs/apply_patch | fail | Failed to apply to any branch |
Le 16/03/2021 à 04:17, Jordan Niethe a écrit : > From: Christophe Leroy <christophe.leroy@c-s.fr> Can you please update the whole series with my new email address: christophe.leroy@csgroup.eu > > In addition to the set_memory_xx() functions which allows to change > the memory attributes of not (yet) used memory regions, implement a > set_memory_attr() function to: > - set the final memory protection after init on currently used > kernel regions. > - enable/disable kernel memory regions in the scope of DEBUG_PAGEALLOC. > > Unlike the set_memory_xx() which can act in three step as the regions > are unused, this function must modify 'on the fly' as the kernel is > executing from them. At the moment only PPC32 will use it and changing > page attributes on the fly is not an issue. > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > Reported-by: kbuild test robot <lkp@intel.com> > [ruscur: cast "data" to unsigned long instead of int] > Signed-off-by: Russell Currey <ruscur@russell.cc> > Signed-off-by: Jordan Niethe <jniethe5@gmail.com> > --- > arch/powerpc/include/asm/set_memory.h | 2 ++ > arch/powerpc/mm/pageattr.c | 33 +++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h > index 64011ea444b4..b040094f7920 100644 > --- a/arch/powerpc/include/asm/set_memory.h > +++ b/arch/powerpc/include/asm/set_memory.h > @@ -29,4 +29,6 @@ static inline int set_memory_x(unsigned long addr, int numpages) > return change_memory_attr(addr, numpages, SET_MEMORY_X); > } > > +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); > + > #endif > diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c > index 2da3fbab6ff7..2fde1b195c85 100644 > --- a/arch/powerpc/mm/pageattr.c > +++ b/arch/powerpc/mm/pageattr.c > @@ -79,3 +79,36 @@ int change_memory_attr(unsigned long addr, int numpages, long action) > return apply_to_existing_page_range(&init_mm, start, sz, > change_page_attr, (void *)action); > } > + > +/* > + * Set the attributes of a page: > + * > + * This function is used by PPC32 at the end of init to set final kernel memory > + * protection. It includes changing the maping of the page it is executing from > + * and data pages it is using. > + */ > +static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) > +{ > + pgprot_t prot = __pgprot((unsigned long)data); > + > + spin_lock(&init_mm.page_table_lock); > + > + set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); > + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); > + > + spin_unlock(&init_mm.page_table_lock); > + > + return 0; > +} > + > +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) > +{ > + unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); > + unsigned long sz = numpages * PAGE_SIZE; > + > + if (numpages <= 0) > + return 0; > + > + return apply_to_existing_page_range(&init_mm, start, sz, set_page_attr, > + (void *)pgprot_val(prot)); > +} >
On Tue, Mar 16, 2021 at 6:25 PM Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > > > Le 16/03/2021 à 04:17, Jordan Niethe a écrit : > > From: Christophe Leroy <christophe.leroy@c-s.fr> > > Can you please update the whole series with my new email address: christophe.leroy@csgroup.eu Of course, I shall do that. > > > > > > > In addition to the set_memory_xx() functions which allows to change > > the memory attributes of not (yet) used memory regions, implement a > > set_memory_attr() function to: > > - set the final memory protection after init on currently used > > kernel regions. > > - enable/disable kernel memory regions in the scope of DEBUG_PAGEALLOC. > > > > Unlike the set_memory_xx() which can act in three step as the regions > > are unused, this function must modify 'on the fly' as the kernel is > > executing from them. At the moment only PPC32 will use it and changing > > page attributes on the fly is not an issue. > > > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > > Reported-by: kbuild test robot <lkp@intel.com> > > [ruscur: cast "data" to unsigned long instead of int] > > Signed-off-by: Russell Currey <ruscur@russell.cc> > > Signed-off-by: Jordan Niethe <jniethe5@gmail.com> > > --- > > arch/powerpc/include/asm/set_memory.h | 2 ++ > > arch/powerpc/mm/pageattr.c | 33 +++++++++++++++++++++++++++ > > 2 files changed, 35 insertions(+) > > > > diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h > > index 64011ea444b4..b040094f7920 100644 > > --- a/arch/powerpc/include/asm/set_memory.h > > +++ b/arch/powerpc/include/asm/set_memory.h > > @@ -29,4 +29,6 @@ static inline int set_memory_x(unsigned long addr, int numpages) > > return change_memory_attr(addr, numpages, SET_MEMORY_X); > > } > > > > +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); > > + > > #endif > > diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c > > index 2da3fbab6ff7..2fde1b195c85 100644 > > --- a/arch/powerpc/mm/pageattr.c > > +++ b/arch/powerpc/mm/pageattr.c > > @@ -79,3 +79,36 @@ int change_memory_attr(unsigned long addr, int numpages, long action) > > return apply_to_existing_page_range(&init_mm, start, sz, > > change_page_attr, (void *)action); > > } > > + > > +/* > > + * Set the attributes of a page: > > + * > > + * This function is used by PPC32 at the end of init to set final kernel memory > > + * protection. It includes changing the maping of the page it is executing from > > + * and data pages it is using. > > + */ > > +static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) > > +{ > > + pgprot_t prot = __pgprot((unsigned long)data); > > + > > + spin_lock(&init_mm.page_table_lock); > > + > > + set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); > > + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); > > + > > + spin_unlock(&init_mm.page_table_lock); > > + > > + return 0; > > +} > > + > > +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) > > +{ > > + unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); > > + unsigned long sz = numpages * PAGE_SIZE; > > + > > + if (numpages <= 0) > > + return 0; > > + > > + return apply_to_existing_page_range(&init_mm, start, sz, set_page_attr, > > + (void *)pgprot_val(prot)); > > +} > >
diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h index 64011ea444b4..b040094f7920 100644 --- a/arch/powerpc/include/asm/set_memory.h +++ b/arch/powerpc/include/asm/set_memory.h @@ -29,4 +29,6 @@ static inline int set_memory_x(unsigned long addr, int numpages) return change_memory_attr(addr, numpages, SET_MEMORY_X); } +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); + #endif diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c index 2da3fbab6ff7..2fde1b195c85 100644 --- a/arch/powerpc/mm/pageattr.c +++ b/arch/powerpc/mm/pageattr.c @@ -79,3 +79,36 @@ int change_memory_attr(unsigned long addr, int numpages, long action) return apply_to_existing_page_range(&init_mm, start, sz, change_page_attr, (void *)action); } + +/* + * Set the attributes of a page: + * + * This function is used by PPC32 at the end of init to set final kernel memory + * protection. It includes changing the maping of the page it is executing from + * and data pages it is using. + */ +static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) +{ + pgprot_t prot = __pgprot((unsigned long)data); + + spin_lock(&init_mm.page_table_lock); + + set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); + + spin_unlock(&init_mm.page_table_lock); + + return 0; +} + +int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) +{ + unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); + unsigned long sz = numpages * PAGE_SIZE; + + if (numpages <= 0) + return 0; + + return apply_to_existing_page_range(&init_mm, start, sz, set_page_attr, + (void *)pgprot_val(prot)); +}