Re: [PATCH] tty: use printk_safe context at tty_msg()

From: Greg Kroah-Hartman
Date: Tue Apr 06 2021 - 15:10:56 EST


On Wed, Apr 07, 2021 at 01:22:34AM +0900, Tetsuo Handa wrote:
> On 2021/04/07 0:10, Petr Mladek wrote:
> >> diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
> >> index 6d4995a5f318..d59f7873bc49 100644
> >> --- a/drivers/tty/tty_buffer.c
> >> +++ b/drivers/tty/tty_buffer.c
> >> @@ -156,6 +156,7 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
> >> {
> >> struct llist_node *free;
> >> struct tty_buffer *p;
> >> + unsigned long flags;
> >>
> >> /* Round the buffer size out */
> >> size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
> >> @@ -172,7 +173,9 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
> >> have queued and recycle that ? */
> >> if (atomic_read(&port->buf.mem_used) > port->buf.mem_limit)
> >> return NULL;
> >> - p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
> >> + printk_safe_enter_irqsave(flags);
> >> + p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC | __GFP_NOWARN);
> >> + printk_safe_exit_irqrestore(flags);
> >
> > I do not see tty_buffer_alloc() anywhere at
> > https://syzkaller.appspot.com/bug?id=39ea6caa479af471183997376dc7e90bc7d64a6a
> >
> > Could you please provide more details why this is needed?
>
> Quoting from https://syzkaller.appspot.com/text?tag=CrashLog&x=131d4ddf800000 at https://syzkaller.appspot.com/bug?id=bda1a87bea05a9072003e6447c44b03ca1492b1c :
>
> [ 274.992629] FAULT_INJECTION: forcing a failure.
> [ 274.992629] name failslab, interval 1, probability 0, space 0, times 0
> [ 274.994085] CPU: 1 PID: 19187 Comm: syz-executor6 Not tainted 4.17.0+ #89
> [ 274.994094] Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
> [ 274.994099] Call Trace:
> [ 274.994120] dump_stack+0x1b9/0x294
> [ 274.994145] ? dump_stack_print_info.cold.2+0x52/0x52
> [ 275.270563] should_fail.cold.4+0xa/0x1a
> [ 275.274639] ? fault_create_debugfs_attr+0x1f0/0x1f0
> [ 275.279747] ? graph_lock+0x170/0x170
> [ 275.283541] ? check_noncircular+0x20/0x20
> [ 275.287788] ? debug_check_no_locks_freed+0x310/0x310
> [ 275.292983] ? lock_acquire+0x1dc/0x520
> [ 275.296961] ? process_echoes+0xb6/0x170
> [ 275.301021] ? check_same_owner+0x320/0x320
> [ 275.305347] ? print_usage_bug+0xc0/0xc0
> [ 275.309404] ? __might_sleep+0x95/0x190
> [ 275.313394] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.318934] __should_failslab+0x124/0x180
> [ 275.323168] should_failslab+0x9/0x14
> [ 275.326974] __kmalloc+0x63/0x760
> [ 275.330423] ? mutex_trylock+0x2a0/0x2a0
> [ 275.334479] ? print_usage_bug+0xc0/0xc0
> [ 275.338539] ? __tty_buffer_request_room+0x2d2/0x7f0
> [ 275.343648] __tty_buffer_request_room+0x2d2/0x7f0
> [ 275.348576] ? flush_to_ldisc+0x560/0x560
> [ 275.352717] ? lock_acquire+0x1dc/0x520
> [ 275.356698] ? pty_write+0xf9/0x1f0
> [ 275.360325] ? lock_release+0xa10/0xa10
> [ 275.364293] ? kasan_check_read+0x11/0x20
> [ 275.368434] ? do_raw_spin_unlock+0x9e/0x2e0
> [ 275.372831] ? do_raw_spin_trylock+0x1b0/0x1b0
> [ 275.377411] tty_insert_flip_string_fixed_flag+0x8d/0x1f0
> [ 275.382942] ? do_raw_spin_lock+0xc1/0x200
> [ 275.387174] pty_write+0x12c/0x1f0
> [ 275.390720] tty_put_char+0x129/0x150
> [ 275.394525] ? dev_match_devt+0x90/0x90
> [ 275.398498] ? pty_write_room+0xc9/0xf0
> [ 275.402485] ? __sanitizer_cov_trace_switch+0x53/0x90
> [ 275.407684] __process_echoes+0x4d9/0x8d0
> [ 275.411829] ? _raw_spin_unlock_irqrestore+0x74/0xc0
> [ 275.416936] process_echoes+0xfc/0x170
> [ 275.420816] n_tty_set_termios+0xb56/0xe80
> [ 275.425047] ? n_tty_receive_signal_char+0x120/0x120
> [ 275.430148] tty_set_termios+0x7a0/0xac0
> [ 275.434201] ? tty_wait_until_sent+0x5b0/0x5b0
> [ 275.438782] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.444318] set_termios+0x41e/0x7d0
> [ 275.448026] ? tty_perform_flush+0x80/0x80
> [ 275.452256] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.457845] tty_mode_ioctl+0x535/0xb50
> [ 275.461821] ? set_termios+0x7d0/0x7d0
> [ 275.465740] ? check_same_owner+0x320/0x320
> [ 275.470059] ? graph_lock+0x170/0x170
> [ 275.473857] n_tty_ioctl_helper+0x54/0x3b0
> [ 275.478085] n_tty_ioctl+0x54/0x320
> [ 275.481711] ? ldsem_down_read+0x37/0x40
> [ 275.485760] ? ldsem_down_read+0x37/0x40
> [ 275.489836] tty_ioctl+0x5e1/0x1870
> [ 275.493454] ? commit_echoes+0x1d0/0x1d0
> [ 275.497506] ? tty_vhangup+0x30/0x30
> [ 275.501212] ? rcu_is_watching+0x85/0x140
> [ 275.505353] ? rcu_report_qs_rnp+0x790/0x790
> [ 275.509757] ? __fget+0x40c/0x650
> [ 275.513243] ? find_held_lock+0x31/0x1c0
> [ 275.517439] ? expand_files.part.8+0x9a0/0x9a0
> [ 275.522033] ? kasan_check_write+0x14/0x20
> [ 275.526389] ? __mutex_unlock_slowpath+0x180/0x8a0
> [ 275.531314] ? wait_for_completion+0x870/0x870
> [ 275.535907] ? tty_vhangup+0x30/0x30
> [ 275.539616] do_vfs_ioctl+0x1cf/0x16f0
> [ 275.543522] ? ioctl_preallocate+0x2e0/0x2e0
> [ 275.547934] ? fget_raw+0x20/0x20
> [ 275.551554] ? __sb_end_write+0xac/0xe0
> [ 275.555525] ? __sanitizer_cov_trace_const_cmp1+0x1a/0x20
> [ 275.561064] ? fput+0x130/0x1a0
> [ 275.564345] ? ksys_write+0x1a6/0x250
> [ 275.568144] ? security_file_ioctl+0x94/0xc0
> [ 275.572576] ksys_ioctl+0xa9/0xd0
> [ 275.576028] __x64_sys_ioctl+0x73/0xb0
> [ 275.579911] do_syscall_64+0x1b1/0x800
> [ 275.583789] ? finish_task_switch+0x1ca/0x840
> [ 275.588301] ? syscall_return_slowpath+0x5c0/0x5c0
> [ 275.593310] ? syscall_return_slowpath+0x30f/0x5c0
> [ 275.598239] ? entry_SYSCALL_64_after_hwframe+0x59/0xbe
> [ 275.603605] ? trace_hardirqs_off_thunk+0x1a/0x1c
> [ 275.608463] entry_SYSCALL_64_after_hwframe+0x49/0xbe
> [ 275.613649] RIP: 0033:0x4559f9
> [ 275.616823] Code: 1d ba fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 eb b9 fb ff c3 66 2e 0f 1f 84 00 00 00 00
> [ 275.636056] RSP: 002b:00007f7ad0e91c68 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
> [ 275.643775] RAX: ffffffffffffffda RBX: 00007f7ad0e926d4 RCX: 00000000004559f9
> [ 275.651034] RDX: 0000000020002000 RSI: 0000000000005403 RDI: 0000000000000015
> [ 275.658293] RBP: 000000000072bea0 R08: 0000000000000000 R09: 0000000000000000
> [ 275.665554] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000016
> [ 275.672819] R13: 00000000004be500 R14: 00000000004ccad8 R15: 0000000000000000
> [ 275.680137] CPU: 0 PID: 19202 Comm: syz-executor2 Not tainted 4.17.0+ #89
> [ 275.680139]
> [ 275.680149] ======================================================
> [ 275.680154] WARNING: possible circular locking dependency detected
> [ 275.680156] 4.17.0+ #89 Not tainted
> [ 275.680160] ------------------------------------------------------
> [ 275.680163] syz-executor6/19187 is trying to acquire lock:
> [ 275.680165] 000000006e810651 (console_owner){-.-.}, at: vprintk_emit+0x826/0xde0
> [ 275.680175]
> [ 275.680178] but task is already holding lock:
> [ 275.680181] 000000004ec3be2c (&(&port->lock)->rlock){-.-.}, at: pty_write+0xf9/0x1f0
> [ 275.680192]
> [ 275.680196] which lock already depends on the new lock.
> [ 275.680197]
> [ 275.680199]
> [ 275.680203] the existing dependency chain (in reverse order) is:
> [ 275.680205]
> [ 275.680207] -> #2 (&(&port->lock)->rlock){-.-.}:
> [ 275.680219] _raw_spin_lock_irqsave+0x96/0xc0
> [ 275.680222] tty_port_tty_get+0x20/0x80
> [ 275.680226] tty_port_default_wakeup+0x15/0x40
> [ 275.680230] tty_port_tty_wakeup+0x5d/0x70
> [ 275.680233] uart_write_wakeup+0x44/0x60
> [ 275.680237] serial8250_tx_chars+0x4be/0xb60
> [ 275.680241] serial8250_handle_irq.part.25+0x1ee/0x280
> [ 275.680245] serial8250_default_handle_irq+0xc8/0x150
> [ 275.680248] serial8250_interrupt+0xfa/0x1d0
> [ 275.680252] __handle_irq_event_percpu+0x1c0/0xad0
> [ 275.680256] handle_irq_event_percpu+0x98/0x1c0
> [ 275.680259] handle_irq_event+0xa7/0x135
> [ 275.680262] handle_edge_irq+0x20f/0x870
> [ 275.680265] handle_irq+0x18c/0x2e7
> [ 275.680268] do_IRQ+0x78/0x190
> [ 275.680271] ret_from_intr+0x0/0x1e
> [ 275.680274] native_safe_halt+0x6/0x10
> [ 275.680277] default_idle+0xc2/0x440
> [ 275.680280] arch_cpu_idle+0x10/0x20
> [ 275.680283] default_idle_call+0x6d/0x90
> [ 275.680286] do_idle+0x395/0x560
> [ 275.680289] cpu_startup_entry+0x104/0x120
> [ 275.680293] start_secondary+0x42b/0x5c0
> [ 275.680296] secondary_startup_64+0xa5/0xb0
> [ 275.680298]
> [ 275.680300] -> #1 (&port_lock_key){-.-.}:
> [ 275.680312] _raw_spin_lock_irqsave+0x96/0xc0
> [ 275.680315] serial8250_console_write+0x8d5/0xb00
> [ 275.680319] univ8250_console_write+0x5f/0x70
> [ 275.680322] console_unlock+0xa9d/0x10a0
> [ 275.680325] vprintk_emit+0x6b2/0xde0
> [ 275.680329] vprintk_default+0x28/0x30
> [ 275.680332] vprintk_func+0x7a/0xe7
> [ 275.680335] printk+0x9e/0xba
> [ 275.680338] register_console+0x7e7/0xc00
> [ 275.680341] univ8250_console_init+0x3f/0x4b
> [ 275.680344] console_init+0x6d9/0xa38
> [ 275.680348] start_kernel+0x608/0x92d
> [ 275.680351] x86_64_start_reservations+0x29/0x2b
> [ 275.680354] x86_64_start_kernel+0x76/0x79
> [ 275.680358] secondary_startup_64+0xa5/0xb0
> [ 275.680359]
> [ 275.680361] -> #0 (console_owner){-.-.}:
> [ 275.680372] lock_acquire+0x1dc/0x520
> [ 275.680375] vprintk_emit+0x884/0xde0
> [ 275.680379] vprintk_default+0x28/0x30
> [ 275.680382] vprintk_func+0x7a/0xe7
> [ 275.680384] printk+0x9e/0xba
> [ 275.680388] should_fail+0x97a/0xbcd
> [ 275.680391] __should_failslab+0x124/0x180
> [ 275.680394] should_failslab+0x9/0x14
> [ 275.680397] __kmalloc+0x63/0x760
> [ 275.680401] __tty_buffer_request_room+0x2d2/0x7f0
> [ 275.680405] tty_insert_flip_string_fixed_flag+0x8d/0x1f0
> [ 275.680408] pty_write+0x12c/0x1f0
> [ 275.680411] tty_put_char+0x129/0x150
> [ 275.680414] __process_echoes+0x4d9/0x8d0
> [ 275.680418] process_echoes+0xfc/0x170
> [ 275.680421] n_tty_set_termios+0xb56/0xe80
> [ 275.680424] tty_set_termios+0x7a0/0xac0
> [ 275.680427] set_termios+0x41e/0x7d0
> [ 275.680430] tty_mode_ioctl+0x535/0xb50
> [ 275.680434] n_tty_ioctl_helper+0x54/0x3b0
> [ 275.680437] n_tty_ioctl+0x54/0x320
> [ 275.680440] tty_ioctl+0x5e1/0x1870
> [ 275.680443] do_vfs_ioctl+0x1cf/0x16f0
> [ 275.680446] ksys_ioctl+0xa9/0xd0
> [ 275.680449] __x64_sys_ioctl+0x73/0xb0
> [ 275.680452] do_syscall_64+0x1b1/0x800
> [ 275.680456] entry_SYSCALL_64_after_hwframe+0x49/0xbe
> [ 275.680458]
> [ 275.680461] other info that might help us debug this:
> [ 275.680463]
> [ 275.680466] Chain exists of:
> [ 275.680467] console_owner --> &port_lock_key --> &(&port->lock)->rlock
> [ 275.680482]
> [ 275.680485] Possible unsafe locking scenario:
> [ 275.680487]
> [ 275.680490] CPU0 CPU1
> [ 275.680493] ---- ----
> [ 275.680495] lock(&(&port->lock)->rlock);
> [ 275.680503] lock(&port_lock_key);
> [ 275.680511] lock(&(&port->lock)->rlock);
> [ 275.680517] lock(console_owner);
> [ 275.680524]
> [ 275.680526] *** DEADLOCK ***
> [ 275.680528]
> [ 275.680531] 5 locks held by syz-executor6/19187:
> [ 275.680533] #0: 000000007080a3ba (&tty->ldisc_sem){++++}, at: ldsem_down_read+0x37/0x40
> [ 275.680547] #1: 000000006fe00659 (&o_tty->termios_rwsem/1){++++}, at: tty_set_termios+0xfd/0xac0
> [ 275.680563] #2: 000000007080a3ba (&tty->ldisc_sem){++++}, at: tty_ldisc_ref+0x22/0x90
> [ 275.680576] #3: 00000000f8d1ab16 (&ldata->output_lock){+.+.}, at: process_echoes+0xb6/0x170
> [ 275.680589] #4: 000000004ec3be2c (&(&port->lock)->rlock){-.-.}, at: pty_write+0xf9/0x1f0
> [ 275.680603]
> [ 275.680605] stack backtrace:
> [ 275.680610] CPU: 1 PID: 19187 Comm: syz-executor6 Not tainted 4.17.0+ #89
> [ 275.680616] Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
> [ 275.680618] Call Trace:
> [ 275.680621] dump_stack+0x1b9/0x294
> [ 275.680625] ? dump_stack_print_info.cold.2+0x52/0x52
> [ 275.680628] ? vprintk_func+0xd0/0xe7
> [ 275.680632] print_circular_bug.isra.36.cold.56+0x1bd/0x27d
> [ 275.680636] ? save_trace+0xe0/0x290
> [ 275.680639] __lock_acquire+0x343e/0x5140
> [ 275.680643] ? debug_check_no_locks_freed+0x310/0x310
> [ 275.680646] ? check_noncircular+0x20/0x20
> [ 275.680649] ? dentry_name+0x687/0x930
> [ 275.680653] ? restricted_pointer+0x400/0x400
> [ 275.680656] ? __lock_acquire+0x7f5/0x5140
> [ 275.680659] ? print_usage_bug+0xc0/0xc0
> [ 275.680662] ? graph_lock+0x170/0x170
> [ 275.680665] ? graph_lock+0x170/0x170
> [ 275.680668] ? graph_lock+0x170/0x170
> [ 275.680672] ? find_held_lock+0x36/0x1c0
> [ 275.680675] lock_acquire+0x1dc/0x520
> [ 275.680678] ? vprintk_emit+0x826/0xde0
> [ 275.680681] ? lock_release+0xa10/0xa10
> [ 275.680684] ? kasan_check_read+0x11/0x20
> [ 275.680687] ? do_raw_spin_unlock+0x9e/0x2e0
> [ 275.680691] ? do_raw_spin_trylock+0x1b0/0x1b0
> [ 275.680694] ? kasan_check_write+0x14/0x20
> [ 275.680698] ? do_raw_spin_lock+0xc1/0x200
> [ 275.680701] vprintk_emit+0x884/0xde0
> [ 275.680704] ? vprintk_emit+0x826/0xde0
> [ 275.680707] ? wake_up_klogd+0x100/0x100
> [ 275.680711] ? debug_check_no_locks_freed+0x310/0x310
> [ 275.680714] ? print_usage_bug+0xc0/0xc0
> [ 275.680717] ? print_usage_bug+0xc0/0xc0
> [ 275.680720] vprintk_default+0x28/0x30
> [ 275.680723] vprintk_func+0x7a/0xe7
> [ 275.680726] printk+0x9e/0xba
> [ 275.680730] ? kmsg_dump_rewind_nolock+0xe4/0xe4
> [ 275.680733] should_fail+0x97a/0xbcd
> [ 275.680737] ? fault_create_debugfs_attr+0x1f0/0x1f0
> [ 275.680740] ? graph_lock+0x170/0x170
> [ 275.680743] ? check_noncircular+0x20/0x20
> [ 275.680747] ? debug_check_no_locks_freed+0x310/0x310
> [ 275.680750] ? lock_acquire+0x1dc/0x520
> [ 275.680753] ? process_echoes+0xb6/0x170
> [ 275.680757] ? check_same_owner+0x320/0x320
> [ 275.680760] ? print_usage_bug+0xc0/0xc0
> [ 275.680763] ? __might_sleep+0x95/0x190
> [ 275.680767] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.680770] __should_failslab+0x124/0x180
> [ 275.680774] should_failslab+0x9/0x14
> [ 275.680776] __kmalloc+0x63/0x760
> [ 275.680780] ? mutex_trylock+0x2a0/0x2a0
> [ 275.680783] ? print_usage_bug+0xc0/0xc0
> [ 275.680787] ? __tty_buffer_request_room+0x2d2/0x7f0
> [ 275.680790] __tty_buffer_request_room+0x2d2/0x7f0
> [ 275.680794] ? flush_to_ldisc+0x560/0x560
> [ 275.680797] ? lock_acquire+0x1dc/0x520
> [ 275.680800] ? pty_write+0xf9/0x1f0
> [ 275.680803] ? lock_release+0xa10/0xa10
> [ 275.680806] ? kasan_check_read+0x11/0x20
> [ 275.680810] ? do_raw_spin_unlock+0x9e/0x2e0
> [ 275.680813] ? do_raw_spin_trylock+0x1b0/0x1b0
> [ 275.680817] tty_insert_flip_string_fixed_flag+0x8d/0x1f0
> [ 275.680821] ? do_raw_spin_lock+0xc1/0x200
> [ 275.680823] pty_write+0x12c/0x1f0
> [ 275.680827] tty_put_char+0x129/0x150
> [ 275.680830] ? dev_match_devt+0x90/0x90
> [ 275.680833] ? pty_write_room+0xc9/0xf0
> [ 275.680837] ? __sanitizer_cov_trace_switch+0x53/0x90
> [ 275.680840] __process_echoes+0x4d9/0x8d0
> [ 275.680844] ? _raw_spin_unlock_irqrestore+0x74/0xc0
> [ 275.680847] process_echoes+0xfc/0x170
> [ 275.680850] n_tty_set_termios+0xb56/0xe80
> [ 275.680854] ? n_tty_receive_signal_char+0x120/0x120
> [ 275.680857] tty_set_termios+0x7a0/0xac0
> [ 275.680861] ? tty_wait_until_sent+0x5b0/0x5b0
> [ 275.680865] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.680868] set_termios+0x41e/0x7d0
> [ 275.680871] ? tty_perform_flush+0x80/0x80
> [ 275.680875] ? __sanitizer_cov_trace_const_cmp8+0x18/0x20
> [ 275.680878] tty_mode_ioctl+0x535/0xb50
> [ 275.680881] ? set_termios+0x7d0/0x7d0
> [ 275.680885] ? check_same_owner+0x320/0x320
> [ 275.680887] ? graph_lock+0x170/0x170
> [ 275.680891] n_tty_ioctl_helper+0x54/0x3b0
> [ 275.680894] n_tty_ioctl+0x54/0x320
> [ 275.680897] ? ldsem_down_read+0x37/0x40
> [ 275.680900] ? ldsem_down_read+0x37/0x40
> [ 275.680903] tty_ioctl+0x5e1/0x1870
> [ 275.680906] ? commit_echoes+0x1d0/0x1d0
> [ 275.680909] ? tty_vhangup+0x30/0x30
> [ 275.680913] ? rcu_is_watching+0x85/0x140
> [ 275.680916] ? rcu_report_qs_rnp+0x790/0x790
> [ 275.680919] ? __fget+0x40c/0x650
> [ 275.680922] ? find_held_lock+0x31/0x1c0
> [ 275.680926] ? expand_files.part.8+0x9a0/0x9a0
> [ 275.680929] ? kasan_check_write+0x14/0x20
> [ 275.680933] ? __mutex_unlock_slowpath+0x180/0x8a0
> [ 275.680936] ? wait_for_completion+0x870/0x870
> [ 275.680939] ? tty_vhangup+0x30/0x30
> [ 275.680942] do_vfs_ioctl+0x1cf/0x16f0
> [ 275.680945] ? ioctl_preallocate+0x2e0/0x2e0
> [ 275.680948] ? fget_raw+0x20/0x20
> [ 275.680951] ? __sb_end_write+0xac/0xe0
> [ 275.680955] ? __sanitizer_cov_trace_const_cmp1+0x1a/0x20
> [ 275.680958] ? fput+0x130/0x1a0
> [ 275.680961] ? ksys_write+0x1a6/0x250
> [ 275.680965] ? security_file_ioctl+0x94/0xc0
> [ 275.680968] ksys_ioctl+0xa9/0xd0
> [ 275.680970] __x64_sys_ioctl+0x73/0xb0
> [ 275.680974] do_syscall_64+0x1b1/0x800
> [ 275.680977] ? finish_task_switch+0x1ca/0x840
> [ 275.680981] ? syscall_return_slowpath+0x5c0/0x5c0
> [ 275.680984] ? syscall_return_slowpath+0x30f/0x5c0
> [ 275.680988] ? entry_SYSCALL_64_after_hwframe+0x59/0xbe
> [ 275.680992] ? trace_hardirqs_off_thunk+0x1a/0x1c
> [ 275.680996] entry_SYSCALL_64_after_hwframe+0x49/0xbe
> [ 275.680999] RIP: 0033:0x4559f9
> [ 275.681001] Code: 1d ba fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff
>
> >> /*
> >> @@ -773,7 +774,13 @@ static inline void proc_tty_unregister_driver(struct tty_driver *d) {}
> >> #endif
> >>
> >> #define tty_msg(fn, tty, f, ...) \
> >> - fn("%s %s: " f, tty_driver_name(tty), tty_name(tty), ##__VA_ARGS__)
> >> + do { \
> >> + unsigned long flags; \
> >> + \
> >> + printk_safe_enter_irqsave(flags); \
> >> + fn("%s %s: " f, tty_driver_name(tty), tty_name(tty), ##__VA_ARGS__); \
> >> + printk_safe_exit_irqrestore(flags); \
> >> + } while (0)
> >
> > There is no need to call single printk() in printk_safe() context.
> > printk_deferred() is enough.
>
> Then, regarding tty_msg() we can update
>
> #define tty_msg(fn, tty, f, ...) \
> fn("%s %s: " f, tty_driver_name(tty), tty_name(tty), ##__VA_ARGS__)
>
> #define tty_debug(tty, f, ...) tty_msg(pr_debug, tty, f, ##__VA_ARGS__)
> #define tty_info(tty, f, ...) tty_msg(pr_info, tty, f, ##__VA_ARGS__)
> #define tty_notice(tty, f, ...) tty_msg(pr_notice, tty, f, ##__VA_ARGS__)
> #define tty_warn(tty, f, ...) tty_msg(pr_warn, tty, f, ##__VA_ARGS__)
> #define tty_err(tty, f, ...) tty_msg(pr_err, tty, f, ##__VA_ARGS__)
>
> #define tty_info_ratelimited(tty, f, ...) \
> tty_msg(pr_info_ratelimited, tty, f, ##__VA_ARGS__)
>
> to use printk_deferred().
>
> > Just note that printk_deferred()/printk_safe() is only temporary
> > solution. It will get obsoleted by offloading the console handling
> > to kthreads. It goes slowly because it is not trivial. We want
> > to do it a clean way and carefully. Any historic or new
> > workarounds/hacks would only slow it down.
> >
> > My estimation is that we could have the offloaded consoles
> > within the next 3-4 development cycles.
> >
> > Please, consider whether it is really worth adding these workarounds.
>
> 1000+ days have elapsed since this problem was reported. Given that
> offloading the console handling to kthreads needs big changes which
> are not suitable for backporting, what can we offer for current and
> stable kernels?

As it can't be triggered without fault injections, is this even a "real"
issue? Let's let the printk developers get this right.

thnaks,

greg k-h