Messages in this thread |  | | Date | Tue, 5 May 2026 08:27:14 +0200 | | From | Sebastian Andrzej Siewior <> | | Subject | Re: [PATCH] firmware: tegra: bpmp: Make atomic_tx_lock a raw_spinlock |
| |
On 2026-05-04 12:34:48 [-0400], Waiman Long wrote: > The atomic_tx_lock was first introduced by commit 1abb081e41a7 > ("firmware: tegra: Simplify channel management") as a spinlock_t. It > is used only in tegra_bpmp_transfer_atomic() to ensure mutual exclusion. > > Since the merging of PREEMPT_RT support into mainline Linux kernel > in v6.12, a spinlock becomes a sleeping lock when CONFIG_PREEMPT_RT > is enabled. As tegra_bpmp_transfer_atomic() is called with interrupt > disabled, acquiring a sleeping lock will lead to the following bug > report when booting up a PREEMPT_RT kernel on an tegra based arm64 > system with Boot and Power Management Processor (BPMP). > > BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48 > in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper/0 > preempt_count: 0, expected: 0 > RCU nest depth: 0, expected: 0 > 2 locks held by swapper/0/1: > #0: ffff42bda2d5b0f0 (&dev->mutex){....}-{3:3}, at: __driver_attach+0x110/0x2c0 > #1: ffff42bda4da5138 (&bpmp->atomic_tx_lock){....}-{2:2}, at: tegra_bpmp_transfer_atomic+0x118/0x3c0 > > Fix it by changing the type of atomic_tx_lock in the tegra_bpmp structure > to raw_spinlock_t and use raw_spinlock APIs to access it.
Do you have a backtrace why interrupts are disabled to begin with?
Sebastian
|  |