Patch "soc: xilinx: Fix for call trace due to the usage of smp_processor_id()" 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

    soc: xilinx: Fix for call trace due to the usage of smp_processor_id()

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:
     soc-xilinx-fix-for-call-trace-due-to-the-usage-of-sm.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 8353882184983cfe4bf19f73729f0dbf8d32f8cc
Author: HariBabu Gattem <haribabu.gattem@xxxxxxxxxx>
Date:   Thu Oct 26 22:56:22 2023 -0700

    soc: xilinx: Fix for call trace due to the usage of smp_processor_id()
    
    [ Upstream commit daed80ed07580e5adc0e6d8bc79933a35154135a ]
    
    When preemption is enabled in kernel and if any task which can be
    preempted should not use smp_processor_id() directly, since CPU
    switch can happen at any time, the previous value of cpu_id
    differs with current cpu_id. As a result we see the below call trace
    during xlnx_event_manager_probe.
    
    [ 6.140197] dump_backtrace+0x0/0x190
    [ 6.143884] show_stack+0x18/0x40
    [ 6.147220] dump_stack_lvl+0x7c/0xa0
    [ 6.150907] dump_stack+0x18/0x34
    [ 6.154241] check_preemption_disabled+0x124/0x134
    [ 6.159068] debug_smp_processor_id+0x20/0x2c
    [ 6.163453] xlnx_event_manager_probe+0x48/0x250
    
    To protect cpu_id, It is recommended to use get_cpu()/put_cpu()
    to disable preemption, get the cpu_id and enable preemption respectively.
    (For Reference, Documentation/locking/preempt-locking.rst and
    Documentation/kernel-hacking/hacking.rst)
    
    Use preempt_disable()/smp_processor_id()/preempt_enable()
    API's to achieve the same.
    
    Signed-off-by: HariBabu Gattem <haribabu.gattem@xxxxxxxxxx>
    Signed-off-by: Jay Buddhabhatti <jay.buddhabhatti@xxxxxxx>
    Link: https://lore.kernel.org/r/20231027055622.21544-1-jay.buddhabhatti@xxxxxxx
    Signed-off-by: Michal Simek <michal.simek@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/soc/xilinx/xlnx_event_manager.c b/drivers/soc/xilinx/xlnx_event_manager.c
index 86a048a10a13..edfb1d5c10c6 100644
--- a/drivers/soc/xilinx/xlnx_event_manager.c
+++ b/drivers/soc/xilinx/xlnx_event_manager.c
@@ -555,7 +555,7 @@ static void xlnx_disable_percpu_irq(void *data)
 static int xlnx_event_init_sgi(struct platform_device *pdev)
 {
 	int ret = 0;
-	int cpu = smp_processor_id();
+	int cpu;
 	/*
 	 * IRQ related structures are used for the following:
 	 * for each SGI interrupt ensure its mapped by GIC IRQ domain
@@ -592,9 +592,12 @@ static int xlnx_event_init_sgi(struct platform_device *pdev)
 	sgi_fwspec.param[0] = sgi_num;
 	virq_sgi = irq_create_fwspec_mapping(&sgi_fwspec);
 
+	cpu = get_cpu();
 	per_cpu(cpu_number1, cpu) = cpu;
 	ret = request_percpu_irq(virq_sgi, xlnx_event_handler, "xlnx_event_mgmt",
 				 &cpu_number1);
+	put_cpu();
+
 	WARN_ON(ret);
 	if (ret) {
 		irq_dispose_mapping(virq_sgi);




[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