summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBreno Leitao <leitao@debian.org>2026-08-10 09:40:00 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-09-05 19:28:39 +0200
commitb144dc5a24149ba9a0cb2197001973a74b8c93b2 (patch)
tree237f843fcd162cc2c79d98564f360bec2899ffae
parentcee9395acd8043be0644b25c34bfa86623f2b935 (diff)
downloadlinux-b144dc5a24149ba9a0cb2197001973a74b8c93b2.tar.gz
linux-b144dc5a24149ba9a0cb2197001973a74b8c93b2.zip
virtio_console: allocate the port_buffer with the caller's gfp
put_chars() runs from the hvc console write path with preemption disabled, so it asks alloc_buf() for GFP_ATOMIC. Only the data buffer gets it: the struct port_buffer itself keeps the GFP_KERNEL default, so the allocation can enter direct reclaim and sleep. A write to /dev/kmsg on a CONFIG_DEBUG_ATOMIC_SLEEP kernel splats: BUG: sleeping function called from invalid context at ./include/linux/sched/mm.h:320 in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 1, name: virtme-ng-init preempt_count: 1, expected: 0 Preemption disabled at: [<ffffffff813fd90d>] vprintk_emit+0x17d/0x510 Call Trace: <TASK> dump_stack_lvl+0x69/0xa0 __might_resched+0x37a/0x4d0 __kmalloc_cache_noprof+0x94/0x5f0 put_chars+0x209/0x3e0 hvc_console_print+0x234/0x640 console_flush_all+0x4fc/0x950 console_unlock+0xbf/0x1b0 vprintk_emit+0x312/0x510 devkmsg_emit+0xba/0x110 devkmsg_write+0x21b/0x2e0 vfs_write+0x4dc/0x9d0 ksys_write+0x108/0x1e0 do_syscall_64+0xfa/0x460 </TASK> Pass gfp on to that allocation too. Fixes: fc220d6be3c7 ("virtio_console: refactor __send_to_port() buffer ownership") Signed-off-by: Breno Leitao <leitao@debian.org> Acked-by: Sungho Bae <baver.bae@lge.com> Tested-by: Florian Westphal <fw@strlen.de> Link: https://patch.msgid.link/20260810-serial-v1-1-abbe51602c13@debian.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/char/virtio_console.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 62eecfa61646..7f6cbe851d1e 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -426,7 +426,7 @@ static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size
* Allocate buffer and the sg list. The sg list array is allocated
* directly after the port_buffer struct.
*/
- buf = kmalloc_flex(*buf, sg, pages);
+ buf = kmalloc_flex(*buf, sg, pages, gfp);
if (!buf)
goto fail;