Patch "riscv: prevent pt_regs corruption for secondary idle threads" has been added to the 6.1-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: prevent pt_regs corruption for secondary idle threads

to the 6.1-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-prevent-pt_regs-corruption-for-secondary-idle-.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 98ccbf5a2e96b66c8fcbb1b7a1ff68992262f00e
Author: Sergey Matyukevich <sergey.matyukevich@xxxxxxxxxxxxx>
Date:   Thu May 23 11:43:23 2024 +0300

    riscv: prevent pt_regs corruption for secondary idle threads
    
    [ Upstream commit a638b0461b58aa3205cd9d5f14d6f703d795b4af ]
    
    Top of the kernel thread stack should be reserved for pt_regs. However
    this is not the case for the idle threads of the secondary boot harts.
    Their stacks overlap with their pt_regs, so both may get corrupted.
    
    Similar issue has been fixed for the primary hart, see c7cdd96eca28
    ("riscv: prevent stack corruption by reserving task_pt_regs(p) early").
    However that fix was not propagated to the secondary harts. The problem
    has been noticed in some CPU hotplug tests with V enabled. The function
    smp_callin stored several registers on stack, corrupting top of pt_regs
    structure including status field. As a result, kernel attempted to save
    or restore inexistent V context.
    
    Fixes: 9a2451f18663 ("RISC-V: Avoid using per cpu array for ordered booting")
    Fixes: 2875fe056156 ("RISC-V: Add cpu_ops and modify default booting method")
    Signed-off-by: Sergey Matyukevich <sergey.matyukevich@xxxxxxxxxxxxx>
    Reviewed-by: Alexandre Ghiti <alexghiti@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240523084327.2013211-1-geomatsi@xxxxxxxxx
    Signed-off-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/riscv/kernel/cpu_ops_sbi.c b/arch/riscv/kernel/cpu_ops_sbi.c
index efa0f0816634c..93cbc38d18057 100644
--- a/arch/riscv/kernel/cpu_ops_sbi.c
+++ b/arch/riscv/kernel/cpu_ops_sbi.c
@@ -72,7 +72,7 @@ static int sbi_cpu_start(unsigned int cpuid, struct task_struct *tidle)
 	/* Make sure tidle is updated */
 	smp_mb();
 	bdata->task_ptr = tidle;
-	bdata->stack_ptr = task_stack_page(tidle) + THREAD_SIZE;
+	bdata->stack_ptr = task_pt_regs(tidle);
 	/* Make sure boot data is updated */
 	smp_mb();
 	hsm_data = __pa(bdata);
diff --git a/arch/riscv/kernel/cpu_ops_spinwait.c b/arch/riscv/kernel/cpu_ops_spinwait.c
index d98d19226b5f5..691e0c5366d2b 100644
--- a/arch/riscv/kernel/cpu_ops_spinwait.c
+++ b/arch/riscv/kernel/cpu_ops_spinwait.c
@@ -34,8 +34,7 @@ static void cpu_update_secondary_bootdata(unsigned int cpuid,
 
 	/* Make sure tidle is updated */
 	smp_mb();
-	WRITE_ONCE(__cpu_spinwait_stack_pointer[hartid],
-		   task_stack_page(tidle) + THREAD_SIZE);
+	WRITE_ONCE(__cpu_spinwait_stack_pointer[hartid], task_pt_regs(tidle));
 	WRITE_ONCE(__cpu_spinwait_task_pointer[hartid], tidle);
 }
 




[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