On Wed 2021-11-10 10:37:26, Daniel Vetter wrote:
On Tue, Nov 09, 2021 at 10:38:47PM +0100, Peter Zijlstra wrote:
On Tue, Nov 09, 2021 at 12:06:48PM -0800, Sultan Alsawaf wrote:
Hi,
I encountered a printk deadlock on 5.13 which appears to still affect the latest kernel. The deadlock occurs due to printk being used while having the current CPU's runqueue locked, and the underlying framebuffer console attempting to lock the same runqueue when printk tries to flush the log buffer.
Yes, that's a known 'feature' of some consoles. printk() is in the process of being reworked to not call con->write() from the printk() calling context, which would go a long way towards fixing this.
And it's getting worse by the year:
- direct scanout displays (i.e. just a few mmio writes and it will show up) are on the way out at least in laptops, everyone gets self-refresh (dp psr) under software control, so without being able to kick a kthread off nothing shows up except more oopses
printk() tries to avoid this problem by waking processes via irq_vork(). For example, it is used for waking userspace log daemons, see wake_up_klogd().
There is one hidden wake_up_process() in up() of @console_sem. It is "less" critical because it calls the wake_up() only when there is another process waiting for console_lock(). It must be a non-printk caller because printk() uses trylock and does not add waiters. So, there is a non-trivial chance to avoid the deadlock and the messages.
I wonder if fbdev might use the same trick.
- because of the impendence mismatch between fbdev and drm-kms we even go ever more this direction for dumb framebuffers, including the firmware boot-up framebuffer simpledrm. This could perhaps be fixed with a new dedicate console driver directly on top of drm-kms, but that's on the wishlist for years and I don't see anyone typing that.
So yeah for fbcon at least I think we really should throw out direct con->write from printk completely.
Yup, that would be great.
Well, I guess that it would be available only for a panic mode when it will not race with other users?
Best Regards, Petr