Patch "riscv: mm: execute local TLB flush after populating vmemmap" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    riscv: mm: execute local TLB flush after populating vmemmap

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     riscv-mm-execute-local-tlb-flush-after-populating-vm.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a76b2f246a5410b0d6292c8c6b516de724097bf1
Author: Vincent Chen <vincent.chen@xxxxxxxxxx>
Date:   Wed Jan 17 22:03:33 2024 +0800

    riscv: mm: execute local TLB flush after populating vmemmap
    
    [ Upstream commit d9807d60c145836043ffa602328ea1d66dc458b1 ]
    
    The spare_init() calls memmap_populate() many times to create VA to PA
    mapping for the VMEMMAP area, where all "struct page" are located once
    CONFIG_SPARSEMEM_VMEMMAP is defined. These "struct page" are later
    initialized in the zone_sizes_init() function. However, during this
    process, no sfence.vma instruction is executed for this VMEMMAP area.
    This omission may cause the hart to fail to perform page table walk
    because some data related to the address translation is invisible to the
    hart. To solve this issue, the local_flush_tlb_kernel_range() is called
    right after the sparse_init() to execute a sfence.vma instruction for this
    VMEMMAP area, ensuring that all data related to the address translation
    is visible to the hart.
    
    Fixes: d95f1a542c3d ("RISC-V: Implement sparsemem")
    Signed-off-by: Vincent Chen <vincent.chen@xxxxxxxxxx>
    Reviewed-by: Alexandre Ghiti <alexghiti@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240117140333.2479667-1-vincent.chen@xxxxxxxxxx
    Fixes: 7a92fc8b4d20 ("mm: Introduce flush_cache_vmap_early()")
    Signed-off-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/riscv/include/asm/tlbflush.h b/arch/riscv/include/asm/tlbflush.h
index a60416bbe190..51664ae4852e 100644
--- a/arch/riscv/include/asm/tlbflush.h
+++ b/arch/riscv/include/asm/tlbflush.h
@@ -67,6 +67,7 @@ static inline void flush_tlb_kernel_range(unsigned long start,
 
 #define flush_tlb_mm(mm) flush_tlb_all()
 #define flush_tlb_mm_range(mm, start, end, page_size) flush_tlb_all()
+#define local_flush_tlb_kernel_range(start, end) flush_tlb_all()
 #endif /* !CONFIG_SMP || !CONFIG_MMU */
 
 #endif /* _ASM_RISCV_TLBFLUSH_H */
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index e71dd19ac801..b50faa232b5e 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -1502,6 +1502,10 @@ void __init misc_mem_init(void)
 	early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
 	arch_numa_init();
 	sparse_init();
+#ifdef CONFIG_SPARSEMEM_VMEMMAP
+	/* The entire VMEMMAP region has been populated. Flush TLB for this region */
+	local_flush_tlb_kernel_range(VMEMMAP_START, VMEMMAP_END);
+#endif
 	zone_sizes_init();
 	reserve_crashkernel();
 	memblock_dump_all();
diff --git a/arch/riscv/mm/tlbflush.c b/arch/riscv/mm/tlbflush.c
index b1ab6cf78e9e..bdee5de918e0 100644
--- a/arch/riscv/mm/tlbflush.c
+++ b/arch/riscv/mm/tlbflush.c
@@ -65,9 +65,10 @@ static inline void local_flush_tlb_range_asid(unsigned long start,
 		local_flush_tlb_range_threshold_asid(start, size, stride, asid);
 }
 
+/* Flush a range of kernel pages without broadcasting */
 void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
 {
-	local_flush_tlb_range_asid(start, end, PAGE_SIZE, FLUSH_TLB_NO_ASID);
+	local_flush_tlb_range_asid(start, end - start, PAGE_SIZE, FLUSH_TLB_NO_ASID);
 }
 
 static void __ipi_flush_tlb_all(void *info)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux