]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc/32: Call mmu_mark_initmem_nx() regardless of data block mapping.
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 14 Jun 2022 10:34:08 +0000 (12:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:12 +0000 (14:24 +0200)
[ Upstream commit 7f4e4c5305226f2fb6d9a603e7d59624bcee1b47 ]

mark_initmem_nx() calls either mmu_mark_initmem_nx() or
set_memory_attr() based on return from v_block_mapped()
of _sinittext.

But we can now handle text and data independently, so that
text may be mapped by block even when data is mapped by pages.

On the 8xx for instance, at startup 32Mbytes of memory are
pinned in TLB. So the pinned entries need to go away for sinittext.

In next patch a BAT will be set to also covers sinittext on book3s/32.
So it will also be needed to call mmu_mark_initmem_nx() even when
data above sinittext is not mapped with BATs.

As this is highly dependent on the platform, call mmu_mark_initmem_nx()
regardless of data block mapping. Then the platform will know what to
do.

Modify 8xx mmu_mark_initmem_nx() so that inittext mapping is modified
only when pagealloc debug and kfence are not active, otherwise inittext
is mapped with standard pages. And don't do anything on kernel text
which is already mapped with PAGE_KERNEL_TEXT.

Fixes: be7fa81e8aa6 ("powerpc/8xx: Allow STRICT_KERNEL_RwX with pinned TLB")
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/db3fc14f3bfa6215b0786ef58a6e2bc1e1f964d7.1655202804.git.christophe.leroy@csgroup.eu
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/powerpc/mm/nohash/8xx.c
arch/powerpc/mm/pgtable_32.c

index 0df9fe29dd567f0596bf7b1f37d39f0562736031..5348e1f9eb9404276c7876a7238a2b65e0af57ca 100644 (file)
@@ -183,8 +183,8 @@ void mmu_mark_initmem_nx(void)
        unsigned long boundary = strict_kernel_rwx_enabled() ? sinittext : etext8;
        unsigned long einittext8 = ALIGN(__pa(_einittext), SZ_8M);
 
-       mmu_mapin_ram_chunk(0, boundary, PAGE_KERNEL_TEXT, false);
-       mmu_mapin_ram_chunk(boundary, einittext8, PAGE_KERNEL, false);
+       if (!debug_pagealloc_enabled_or_kfence())
+               mmu_mapin_ram_chunk(boundary, einittext8, PAGE_KERNEL, false);
 
        mmu_pin_tlb(block_mapped_ram, false);
 }
index f288597714407af94389404d3ea0c91b5d82eb2d..502e3d3d1dbf7aea95682862885ac4eee97177b3 100644 (file)
@@ -138,9 +138,9 @@ void mark_initmem_nx(void)
        unsigned long numpages = PFN_UP((unsigned long)_einittext) -
                                 PFN_DOWN((unsigned long)_sinittext);
 
-       if (v_block_mapped((unsigned long)_sinittext)) {
-               mmu_mark_initmem_nx();
-       } else {
+       mmu_mark_initmem_nx();
+
+       if (!v_block_mapped((unsigned long)_sinittext)) {
                set_memory_nx((unsigned long)_sinittext, numpages);
                set_memory_rw((unsigned long)_sinittext, numpages);
        }