[1/3] powerpc/mm/radix: Refactor radix__mark_rodata_ro()

Submitted by Michael Ellerman on July 14, 2017, 6:51 a.m.

Details

Message ID 1500015083-23511-1-git-send-email-mpe@ellerman.id.au
State Accepted
Commit b134bd90286dc9f2952c35a91ab405474ca9374c
Headers show

Commit Message

Michael Ellerman July 14, 2017, 6:51 a.m.
Move the core logic into a helper, so we can use it for changing permissions
other than _PAGE_WRITE.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
---
 arch/powerpc/mm/pgtable-radix.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

Balbir Singh July 18, 2017, 1:04 a.m.
On Fri, Jul 14, 2017 at 4:51 PM, Michael Ellerman <mpe@ellerman.id.au> wrote:
> Move the core logic into a helper, so we can use it for changing permissions
> other than _PAGE_WRITE.
>
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
> ---
>  arch/powerpc/mm/pgtable-radix.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
> index 8c13e4282308..336e52ec652c 100644
> --- a/arch/powerpc/mm/pgtable-radix.c
> +++ b/arch/powerpc/mm/pgtable-radix.c
> @@ -112,10 +112,9 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa,
>  }
>
>  #ifdef CONFIG_STRICT_KERNEL_RWX
> -void radix__mark_rodata_ro(void)
> +void radix__change_memory_range(unsigned long start, unsigned long end,
> +                               unsigned long clear)
>  {
> -       unsigned long start = (unsigned long)_stext;
> -       unsigned long end = (unsigned long)__init_begin;
>         unsigned long idx;
>         pgd_t *pgdp;
>         pud_t *pudp;
> @@ -125,7 +124,8 @@ void radix__mark_rodata_ro(void)
>         start = ALIGN_DOWN(start, PAGE_SIZE);
>         end = PAGE_ALIGN(end); // aligns up
>
> -       pr_devel("marking ro start %lx, end %lx\n", start, end);
> +       pr_debug("Changing flags on range %lx-%lx removing 0x%lx\n",
> +                start, end, clear);
>
>         for (idx = start; idx < end; idx += PAGE_SIZE) {
>                 pgdp = pgd_offset_k(idx);
> @@ -147,11 +147,21 @@ void radix__mark_rodata_ro(void)
>                 if (!ptep)
>                         continue;
>  update_the_pte:
> -               radix__pte_update(&init_mm, idx, ptep, _PAGE_WRITE, 0, 0);
> +               radix__pte_update(&init_mm, idx, ptep, clear, 0, 0);
>         }
>
>         radix__flush_tlb_kernel_range(start, end);
>  }
> +
> +void radix__mark_rodata_ro(void)
> +{
> +       unsigned long start, end;
> +
> +       start = (unsigned long)_stext;
> +       end = (unsigned long)__init_begin;
> +
> +       radix__change_memory_range(start, end, _PAGE_WRITE);
> +}
>  #endif /* CONFIG_STRICT_KERNEL_RWX */
>

Looks good, I had something similar for the patches to enable
relocation, but that's a
a larger chunk.

Reviewed-by: Balbir Singh <bsingharora@gmail.com>
Michael Ellerman July 21, 2017, 11:13 a.m.
On Fri, 2017-07-14 at 06:51:21 UTC, Michael Ellerman wrote:
> Move the core logic into a helper, so we can use it for changing permissions
> other than _PAGE_WRITE.
> 
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
> Reviewed-by: Balbir Singh <bsingharora@gmail.com>

Series applied to powerpc fixes.

https://git.kernel.org/powerpc/c/b134bd90286dc9f2952c35a91ab405

cheers

Patch hide | download patch | download mbox

diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index 8c13e4282308..336e52ec652c 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -112,10 +112,9 @@  int radix__map_kernel_page(unsigned long ea, unsigned long pa,
 }
 
 #ifdef CONFIG_STRICT_KERNEL_RWX
-void radix__mark_rodata_ro(void)
+void radix__change_memory_range(unsigned long start, unsigned long end,
+				unsigned long clear)
 {
-	unsigned long start = (unsigned long)_stext;
-	unsigned long end = (unsigned long)__init_begin;
 	unsigned long idx;
 	pgd_t *pgdp;
 	pud_t *pudp;
@@ -125,7 +124,8 @@  void radix__mark_rodata_ro(void)
 	start = ALIGN_DOWN(start, PAGE_SIZE);
 	end = PAGE_ALIGN(end); // aligns up
 
-	pr_devel("marking ro start %lx, end %lx\n", start, end);
+	pr_debug("Changing flags on range %lx-%lx removing 0x%lx\n",
+		 start, end, clear);
 
 	for (idx = start; idx < end; idx += PAGE_SIZE) {
 		pgdp = pgd_offset_k(idx);
@@ -147,11 +147,21 @@  void radix__mark_rodata_ro(void)
 		if (!ptep)
 			continue;
 update_the_pte:
-		radix__pte_update(&init_mm, idx, ptep, _PAGE_WRITE, 0, 0);
+		radix__pte_update(&init_mm, idx, ptep, clear, 0, 0);
 	}
 
 	radix__flush_tlb_kernel_range(start, end);
 }
+
+void radix__mark_rodata_ro(void)
+{
+	unsigned long start, end;
+
+	start = (unsigned long)_stext;
+	end = (unsigned long)__init_begin;
+
+	radix__change_memory_range(start, end, _PAGE_WRITE);
+}
 #endif /* CONFIG_STRICT_KERNEL_RWX */
 
 static inline void __meminit print_mapping(unsigned long start,