]> www.infradead.org Git - users/jedix/linux-maple.git/commit
locking/local_lock: Introduce localtry_lock_t
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 13 Feb 2025 03:35:53 +0000 (19:35 -0800)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 4 Mar 2025 16:35:05 +0000 (11:35 -0500)
commit0373ef0e52e966c25d7cf1500e4c94491cbc6b2e
tree025528fc127dbd4c320e50fec4d17aec860a97e6
parent0649356335b8660c788d298d6ebde341c0089cdb
locking/local_lock: Introduce localtry_lock_t

In !PREEMPT_RT local_lock_irqsave() disables interrupts to protect
critical section, but it doesn't prevent NMI, so the fully reentrant
code cannot use local_lock_irqsave() for exclusive access.

Introduce localtry_lock_t and localtry_lock_irqsave() that
disables interrupts and sets acquired=1, so localtry_lock_irqsave()
from NMI attempting to acquire the same lock will return false.

In PREEMPT_RT local_lock_irqsave() maps to preemptible spin_lock().
Map localtry_lock_irqsave() to preemptible spin_trylock().
When in hard IRQ or NMI return false right away, since
spin_trylock() is not safe due to PI issues.

Note there is no need to use local_inc for acquired variable,
since it's a percpu variable with strict nesting scopes.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
include/linux/local_lock.h
include/linux/local_lock_internal.h