lkml.org 
[lkml]   [2022]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0994/1157] powerpc/32s: Fix boot failure with KASAN + SMP + JUMP_LABEL_FEATURE_CHECK_DEBUG
    Date
    From: Christophe Leroy <christophe.leroy@csgroup.eu>

    [ Upstream commit 6042a1652d643d1d34fa89bb314cb102960c0800 ]

    Since commit 4291d085b0b0 ("powerpc/32s: Make pte_update() non
    atomic on 603 core"), pte_update() has been using
    mmu_has_feature(MMU_FTR_HPTE_TABLE) to avoid a useless atomic
    operation on 603 cores.

    When kasan_early_init() sets up the early zero shadow, it uses
    __set_pte_at(). On book3s/32, __set_pte_at() calls pte_update()
    when CONFIG_SMP is selected in order to ensure the preservation of
    _PAGE_HASHPTE in case of concurrent update of the PTE. But that's
    too early for mmu_has_feature(), so when
    CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG is selected, mmu_has_feature()
    calls printk(). That's too early to call printk() because KASAN
    early zero shadow page is not set up yet. It leads to a deadlock.

    However, when kasan_early_init() is called, there is only one CPU
    running and no risk of concurrent PTE update. So __set_pte_at() can
    be called with the 'percpu' flag. With that flag set, the PTE is
    written directly instead of being written via pte_update().

    Fixes: 4291d085b0b0 ("powerpc/32s: Make pte_update() non atomic on 603 core")
    Reported-by: Erhard Furtner <erhard_f@mailbox.org>
    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/2ee707512b8b212b079b877f4ceb525a1606a3fb.1656655567.git.christophe.leroy@csgroup.eu
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/mm/kasan/init_32.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/powerpc/mm/kasan/init_32.c b/arch/powerpc/mm/kasan/init_32.c
    index f3e4d069e0ba..a70828a6d935 100644
    --- a/arch/powerpc/mm/kasan/init_32.c
    +++ b/arch/powerpc/mm/kasan/init_32.c
    @@ -25,7 +25,7 @@ static void __init kasan_populate_pte(pte_t *ptep, pgprot_t prot)
    int i;

    for (i = 0; i < PTRS_PER_PTE; i++, ptep++)
    - __set_pte_at(&init_mm, va, ptep, pfn_pte(PHYS_PFN(pa), prot), 0);
    + __set_pte_at(&init_mm, va, ptep, pfn_pte(PHYS_PFN(pa), prot), 1);
    }

    int __init kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 06:53    [W:4.024 / U:0.340 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site