Medium · published September 25, 2026
In the Linux kernel, the following vulnerability has been resolved:
staging: fbtft: make dirty_lock IRQ-safe
fbtft_mkdirty() can be reached from the fbcon rendering path while
processing printk() in hardirq context. Meanwhile, dirty_lock is also
taken by fbtft_deferred_io() in workqueue context with local interrupts
enabled.
Lockdep reports a possible IRQ lock inversion involving dirty_lock and
console_owner. A hardirq can interrupt a CPU holding dirty_lock and
enter the console rendering path, which can attempt to acquire
dirty_lock again.
The following lockdep report was observed on an RK3566 system with
CONFIG_PROVE_LOCKING enabled:
WARNING: possible irq lock inversion dependency detected
swapper/2/0 just changed the state of lock:
(console_owner){-...}-{0:0}
but this lock took another, HARDIRQ-unsafe lock in the past:
(&par->dirty_lock){+.+.}-{2:2}
CPU0 CPU1
---- ----
lock(&par->dirty_lock);
local_irq_disable();
lock(console_owner);
lock(&par->dirty_lock);
<Interrupt>
lock(console_owner);
*** DEADLOCK ***
Use spin_lock_irqsave() for fbtft_mkdirty() and spin_lock_irq() for
fbtft_deferred_io(). They only access the dirty line range, so the
IRQ-off regions remain short.
| Product | Versions | Fixed in |
|---|---|---|
| linux/linux_kernel | ≥ 4.0, < 5.10.271 | 5.10.271 |
| linux/linux_kernel | ≥ 5.11, < 5.15.222 | 5.15.222 |
| linux/linux_kernel | ≥ 5.16, < 6.1.189 | 6.1.189 |
| linux/linux_kernel | ≥ 6.2, < 6.6.158 | 6.6.158 |
| linux/linux_kernel | ≥ 6.7, < 6.12.111 | 6.12.111 |
| linux/linux_kernel | ≥ 6.13, < 6.18.53 | 6.18.53 |
| linux/linux_kernel | ≥ 6.19, < 7.2.7 | 7.2.7 |
| linux/linux_kernel | all versions | — |