From: Ruiqiang Hao <ruiqiang....@windriver.com>

When start with preempt-rt kernel, the following problem occurs.
Change the type of gic_ipi_track::lock from spinlock_t to raw_spinlock_t
to fix this.

BUG: sleeping function called from invalid context at 
kernel/locking/spinlock_rt.c:46
in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 0, name: swapper/15
preempt_count: 6, expected: 0
RCU nest depth: 0, expected: 0
Preemption disabled at:
[<ffff800008246370>] __create_object+0x110/0x380
CPU: 15 PID: 0 Comm: swapper/15 Tainted: G        W          
6.1.90-rt18-yocto-preempt-rt #1
Hardware name: Marvell OcteonTX CN96XX board (DT)
Call trace:
 dump_backtrace.part.0+0xe8/0xf4
 show_stack+0x20/0x30
 dump_stack_lvl+0x64/0x80
 dump_stack+0x18/0x34
 __might_resched+0x160/0x1c0
 rt_spin_lock+0x38/0xd0
 gic_write_sgi1r_retry+0x58/0x120
 gic_ipi_send_mask+0x148/0x184
 __ipi_send_mask+0x34/0x11c
 smp_cross_call+0x4c/0x10c
 arch_irq_work_raise+0x3c/0x4c
 __irq_work_queue_local+0x9c/0xb0
 irq_work_queue+0x48/0x80
 sugov_update_shared+0x258/0x260
 enqueue_top_rt_rq+0x7c/0x124
 enqueue_task_rt+0x1cc/0x2ec
 ttwu_do_activate+0x84/0x170
 try_to_wake_up+0x21c/0x5c0
 wake_up_process+0x20/0x30
 irq_exit_rcu+0x134/0x140
 el1_interrupt+0x38/0x70
 el1h_64_irq_handler+0x18/0x2c
 el1h_64_irq+0x64/0x68
 arch_cpu_idle+0x18/0x2c
 default_idle_call+0x40/0x1d0
 do_idle+0x230/0x2a0
 cpu_startup_entry+0x3c/0x4c
 secondary_start_kernel+0x120/0x14c
 __secondary_switched+0xb0/0xb4

Signed-off-by: Ruiqiang Hao <ruiqiang....@windriver.com>
---
 drivers/irqchip/irq-gic-v3-fixes.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-fixes.c 
b/drivers/irqchip/irq-gic-v3-fixes.c
index 7d88e3295686..62d41cb4e9a4 100644
--- a/drivers/irqchip/irq-gic-v3-fixes.c
+++ b/drivers/irqchip/irq-gic-v3-fixes.c
@@ -31,7 +31,7 @@ enum ipi_msg_type {
 struct gic_ipi_track {
        atomic_t tx_count;
        atomic_t rx_count;
-       spinlock_t lock;
+       raw_spinlock_t lock;
 };
 
 static struct gic_ipi_track gic_ipitrack[NR_CPUS][NR_IPIS];
@@ -79,7 +79,7 @@ void gic_write_sgi1r_retry(int dest_cpu, int irq, u64 val)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&gic_ipitrack[dest_cpu][irq].lock, flags);
+       raw_spin_lock_irqsave(&gic_ipitrack[dest_cpu][irq].lock, flags);
        wmb(); /* Ensure lock is acquired before we generate an IPI */
 retry:
        gic_write_sgi1r(val);
@@ -95,7 +95,7 @@ void gic_write_sgi1r_retry(int dest_cpu, int irq, u64 val)
        wmb(); /* Ensure the write is completed before we start again */
        goto retry;
 out:
-       spin_unlock_irqrestore(&gic_ipitrack[dest_cpu][irq].lock, flags);
+       raw_spin_unlock_irqrestore(&gic_ipitrack[dest_cpu][irq].lock, flags);
 }
 
 static bool __maybe_unused gicv3_enable_quirk_otx(void *data)
@@ -107,7 +107,7 @@ static bool __maybe_unused gicv3_enable_quirk_otx(void 
*data)
        /* Initialize necessary lock */
        for_each_possible_cpu(cpu)
                for (ipi = 0; ipi < NR_IPIS; ipi++)
-                       spin_lock_init(&gic_ipitrack[cpu][ipi].lock);
+                       raw_spin_lock_init(&gic_ipitrack[cpu][ipi].lock);
 
        return true;
 }
-- 
2.35.5

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#13922): 
https://lists.yoctoproject.org/g/linux-yocto/message/13922
Mute This Topic: https://lists.yoctoproject.org/mt/105994193/21656
Group Owner: linux-yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to