v6.6-rt13
Subsystems (6)
Dear RT folks!
I'm pleased to announce the v6.6-rt13 patch set.
Changes since v6.6-rt12:
- Update to the printk series provided by John Ogness. Some of the patches were merged during the merge window other are under review. Here is a small changelog:
- warn and panic console output will interrupt the threaded printing mid-line rather than waiting for the line to finish printing
- in panic, printing is now synchronous rather than first storing all panic messages and then dumping to consoles
- printing kthreads will sleep, rather than busy-wait, while consoles are in emergency or panic states
- atomic console printing will only print to the end of the emergency messages, rather than flushing all remaining records
- apply various printk mainline fixes currently in review
https://lore.kernel.org/lkml/[email protected]
Known issues
Pierre Gondois reported crashes on ARM64 together with "rtla timerlat hist" as trigger. It is not yet understood. The report is at
https://lore.kernel.org/[email protected]
The delta patch against v6.6-rt12 is appended below and can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/incr/patch-6.6-rt12-rt13.patch.xz
You can get this release via the git tree at:
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v6.6-rt13
The RT patch against v6.6 can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patch-6.6-rt13.patch.xz
The split quilt queue is available at:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6-rt13.tar.xz
Sebastian
drivers/tty/serial/8250/8250_core.c +17 -3
@@ -592,6 +592,7 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev) #ifdef CONFIG_SERIAL_8250_CONSOLE +#ifdef CONFIG_SERIAL_8250_LEGACY_CONSOLE static void univ8250_console_write(struct console *co, const char *s, unsigned int count) {
@@ -599,7 +600,7 @@ static void univ8250_console_write(struct console *co, const char *s, serial8250_console_write(up, s, count); } - +#else static bool univ8250_console_write_atomic (struct console *co,struct nbcon_write_context *wctxt) {
@@ -608,10 +609,19 @@ static bool univ8250_console_write_atomic(struct console *co, return serial8250_console_write_atomic(up, wctxt); } +static bool univ8250_console_write_thread (struct console *co, +struct nbcon_write_context *wctxt) +{ +struct uart_8250_port *up = &serial8250_ports[co->index]; + +return serial8250_console_write_thread (up, wctxt); +} +static struct uart_port *univ8250_console_uart_port (struct console *con) {return &serial8250_ports[con->index].port; } +#endif /* CONFIG_SERIAL_8250_LEGACY_CONSOLE */ static int univ8250_console_setup (struct console *co,char *options) {
@@ -711,15 +721,19 @@ static int univ8250_console_match(struct console *co, char *name, int idx,static struct console univ8250_console = { .name ="ttyS" , +#ifdef CONFIG_SERIAL_8250_LEGACY_CONSOLE .write = univ8250_console_write, + .flags =CON_PRINTBUFFER |CON_ANYTIME , +#else .write_atomic = univ8250_console_write_atomic, - .write_thread = univ8250_console_write_atomic, + .write_thread = univ8250_console_write_thread, + .flags =CON_PRINTBUFFER |CON_ANYTIME |CON_NBCON , .uart_port = univ8250_console_uart_port, +#endif .device = uart_console_device, .setup = univ8250_console_setup, .exit = univ8250_console_exit, .match = univ8250_console_match, - .flags =CON_PRINTBUFFER |CON_ANYTIME |CON_NBCON , .index =-1 , .data = &serial8250_reg, };
drivers/tty/serial/8250/8250_port.c +120 -4
194 lines not on this page · raw message
include/linux/console.h +6 -4
@@ -467,17 +467,19 @@ static inline bool console_is_registered(const struct console *con) hlist_for_each_entry(con, &console_list, node)#ifdef CONFIG_PRINTK -extern enum nbcon_prio nbcon_atomic_enter (enum nbcon_prio prio); -extern void nbcon_atomic_exit (enum nbcon_prio prio,enum nbcon_prio prev_prio); +extern void nbcon_cpu_emergency_enter (void ); +extern void nbcon_cpu_emergency_exit (void );extern bool nbcon_can_proceed (struct nbcon_write_context *wctxt);extern bool nbcon_enter_unsafe (struct nbcon_write_context *wctxt);extern bool nbcon_exit_unsafe (struct nbcon_write_context *wctxt); +extern void nbcon_reacquire (struct nbcon_write_context *wctxt);#else -static inline enum nbcon_prio nbcon_atomic_enter (enum nbcon_prio prio) {return NBCON_PRIO_NONE ; } -static inline void nbcon_atomic_exit (enum nbcon_prio prio,enum nbcon_prio prev_prio) { } +static inline void nbcon_cpu_emergency_enter (void ) { } +static inline void nbcon_cpu_emergency_exit (void ) { }static inline bool nbcon_can_proceed (struct nbcon_write_context *wctxt) {return false; }static inline bool nbcon_enter_unsafe (struct nbcon_write_context *wctxt) {return false; }static inline bool nbcon_exit_unsafe (struct nbcon_write_context *wctxt) {return false; } +static inline void nbcon_reacquire (struct nbcon_write_context *wctxt) { }#endif extern int console_set_on_cmdline;
include/linux/printk.h +5 -5
@@ -197,9 +197,9 @@ void show_regs_print_info(const char *log_lvl); extern asmlinkage void dump_stack_lvl(const char *log_lvl) __cold; extern asmlinkage void dump_stack(void) __cold;void printk_trigger_flush (void ); -extern void nbcon_atomic_flush_all (void );extern void nbcon_handle_port_lock (struct uart_port *up);extern void nbcon_handle_port_unlock (struct uart_port *up); +void nbcon_atomic_flush_unsafe (void );#else static inline __printf(1, 0) int vprintk(const char *s, va_list args)
@@ -280,10 +280,6 @@ static inline void printk_trigger_flush(void) { } -static inline void nbcon_atomic_flush_all (void ) -{ -} -static inline void nbcon_handle_port_lock (struct uart_port *up) { }
@@ -292,6 +288,10 @@ static inline void nbcon_handle_port_unlock(struct uart_port *up) { } +static inline void nbcon_atomic_flush_unsafe (void ) +{ +} +#endif #ifdef CONFIG_SMP
include/linux/serial_8250.h +4 -0
@@ -153,6 +153,8 @@ struct uart_8250_port {#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTAunsigned char msr_saved_flags; +bool console_newline_needed; +struct uart_8250_dma *dma;const struct uart_8250_ops *ops;
@@ -206,6 +208,8 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, unsigned int count);bool serial8250_console_write_atomic (struct uart_8250_port *up,struct nbcon_write_context *wctxt); +bool serial8250_console_write_thread (struct uart_8250_port *up, +struct nbcon_write_context *wctxt);int serial8250_console_setup (struct uart_port *port,char *options,bool probe);int serial8250_console_exit (struct uart_port *port);
kernel/locking/lockdep.c +2 -4
@@ -3968,12 +3968,10 @@ static void print_usage_bug(struct task_struct *curr, struct held_lock *this, enum lock_usage_bit prev_bit, enum lock_usage_bit new_bit) { - enum nbcon_prio prev_prio; - if (!debug_locks_off() || debug_locks_silent) return; - prev_prio =nbcon_atomic_enter (NBCON_PRIO_EMERGENCY ); +nbcon_cpu_emergency_enter ();pr_warn ("\n" );pr_warn ("================================\n" );
@@ -4004,7 +4002,7 @@ print_usage_bug(struct task_struct *curr, struct held_lock *this,pr_warn ("\nstack backtrace:\n" );dump_stack (); -nbcon_atomic_exit (NBCON_PRIO_EMERGENCY , prev_prio); +nbcon_cpu_emergency_exit (); }/*
kernel/panic.c +5 -69
152 lines not on this page · raw message
kernel/printk/internal.h +9 -4
@@ -54,7 +54,7 @@ extern bool have_boot_console;* be printed serially along with the legacy consoles because nbcon * consoles cannot print simultaneously with boot consoles. */ -#define serialized_printing (have_legacy_console || have_boot_console) +#define printing_via_unlock (have_legacy_console || have_boot_console) __printf(4, 0) int vprintk_store(int facility, int level,
@@ -88,7 +88,9 @@ void nbcon_seq_force(struct console *con, u64 seq);bool nbcon_alloc (struct console *con);void nbcon_init (struct console *con);void nbcon_free (struct console *con); -bool nbcon_console_emit_next_record (struct console *con); +enum nbcon_prio nbcon_get_default_prio (void ); +void nbcon_atomic_flush_all (void ); +bool nbcon_atomic_emit_next_record (struct console *con);void nbcon_kthread_create (struct console *con);void nbcon_wake_threads (void );void nbcon_legacy_kthread_create (void );
@@ -160,7 +162,7 @@ static inline void nbcon_kthread_wake(struct console *con)static inline void nbcon_kthread_wake (struct console *con) { }static inline void nbcon_kthread_create (struct console *con) { }#define printk_threads_enabled (false) -#define serialized_printing (false) +#define printing_via_unlock (false)/* * In !PRINTK builds we still export console_sem
@@ -176,7 +178,9 @@ static inline void nbcon_seq_force(struct console *con, u64 seq) { }static inline bool nbcon_alloc (struct console *con) {return false; }static inline void nbcon_init (struct console *con) { }static inline void nbcon_free (struct console *con) { } -static bool nbcon_console_emit_next_record (struct console *con) {return false; } +enum nbcon_prio nbcon_get_default_prio (void ) {return NBCON_PRIO_NONE ; } +static inline void nbcon_atomic_flush_all (void ) { } +static bool nbcon_atomic_emit_next_record (struct console *con) {return false; }static inline bool console_is_usable (struct console *con,short flags,bool use_atomic) {return false; }
@@ -211,6 +215,7 @@ struct printk_message { };bool other_cpu_in_panic (void ); +bool this_cpu_in_panic (void );bool printk_get_next_message (struct printk_message *pmsg,u64 seq,bool is_extended,bool may_supress);
kernel/printk/nbcon.c +174 -155
537 lines not on this page · raw message
kernel/printk/printk.c +173 -77
430 lines not on this page · raw message
kernel/printk/printk_ringbuffer.c +293 -52
455 lines not on this page · raw message
kernel/printk/printk_ringbuffer.h +18 -3
@@ -75,7 +75,7 @@ struct prb_desc_ring {struct printk_info *infos;atomic_long_t head_id;atomic_long_t tail_id; -atomic_long_t last_finalized_id; +atomic_long_t last_finalized_seq; };/*
@@ -127,8 +127,22 @@ enum desc_state {#define DESC_SV (id, state) (((unsigned long)state << DESC_FLAGS_SHIFT) | id)#define DESC_ID_MASK (~DESC_FLAGS_MASK)#define DESC_ID (sv) ((sv) & DESC_ID_MASK) + +/* +* Special data block logical position values (for fields of +* @prb_desc.text_blk_lpos). +* +* - Bit0 is used to identify if the record has no data block. (Implemented in +* the LPOS_DATALESS() macro.) +* +* - Bit1 specifies the reason for not having a data block. +* +* These special values could never be real lpos values because of the +* meta data and alignment padding of data blocks. (See to_blk_size() for +* details.) +*/ #define FAILED_LPOS 0x1 -#define NO_LPOS 0x3 +#define EMPTY_LINE_LPOS 0x3#define FAILED_BLK_LPOS \ { \
@@ -259,7 +273,7 @@ static struct printk_ringbuffer name = { \ .infos = &_##name##_infos[0], \ .head_id = ATOMIC_INIT(DESC0_ID(descbits)), \ .tail_id = ATOMIC_INIT(DESC0_ID(descbits)), \ - .last_finalized_id = ATOMIC_INIT(DESC0_ID(descbits)), \ + .last_finalized_seq = ATOMIC_INIT(0), \ }, \ .text_data_ring = { \ .size_bits = (avgtextbits) + (descbits), \
@@ -380,5 +394,6 @@ bool prb_read_valid_info(struct printk_ringbuffer *rb, u64 seq,u64 prb_first_valid_seq (struct printk_ringbuffer *rb);u64 prb_next_seq (struct printk_ringbuffer *rb); +u64 prb_next_reserve_seq (struct printk_ringbuffer *rb);#endif /* _KERNEL_PRINTK_RINGBUFFER_H */
kernel/rcu/tree_stall.h +2 -3
@@ -583,7 +583,6 @@ static void rcu_check_gp_kthread_expired_fqs_timer(void)static void print_other_cpu_stall (unsigned long gp_seq,unsigned long gps) { -enum nbcon_prio prev_prio;int cpu;unsigned long flags;unsigned long gpa;
@@ -599,7 +598,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)if (rcu_stall_is_suppressed ())return ; - prev_prio =nbcon_atomic_enter (NBCON_PRIO_EMERGENCY ); +nbcon_cpu_emergency_enter ();/* * OK, time to rat on our buddy...
@@ -656,7 +655,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)rcu_force_quiescent_state ();/* Kick them all. */ -nbcon_atomic_exit (NBCON_PRIO_EMERGENCY , prev_prio); +nbcon_cpu_emergency_exit (); }static void print_cpu_stall (unsigned long gps)
localversion-rt +1 -1
@@ -1 +1 @@ --rt12 +-rt13
Hello Sebastian, hello John
Quoted 15 lines · Sebastian Andrzej Siewior
Dear RT folks!
I'm pleased to announce the v6.6-rt13 patch set.
Changes since v6.6-rt12:
- Update to the printk series provided by John Ogness. Some of the patches were merged during the merge window other are under review. Here is a small changelog:
- warn and panic console output will interrupt the threaded printing mid-line rather than waiting for the line to finish printing- in panic, printing is now synchronous rather than first storing all panic messages and then dumping to consoles
Quoted 8 lines
- printing kthreads will sleep, rather than busy-wait, while consoles are in emergency or panic states
- atomic console printing will only print to the end of the emergency messages, rather than flushing all remaining records
- apply various printk mainline fixes currently in review
https://lore.kernel.org/lkml/[email protected]
During our weekly CI tests of rt-devel branch we noticed that commit 78f4b59c6faa ("printk: Update the printk series.") breaks booting on multiple NXP i.MX platforms (arm and arm64), likely related to drivers/tty/serial/imx.c.
We are not planning any additional investigation at the moment and we have no debug outputs to share, just wanted to give you a head-up.
Francesco
Quoted 1 line · Francesco Dolcini
Hello Sebastian, hello John
Hi,
Quoted 7 lines
During our weekly CI tests of rt-devel branch we noticed that commit
78f4b59c6faa("printk: Update the printk series.") breaks booting on multiple NXP i.MX platforms (arm and arm64), likely related todrivers/tty/serial/imx.c.We are not planning any additional investigation at the moment and we have no debug outputs to share, just wanted to give you a head-up.
Thank you for the report.
As it turns out, the new bits never saw the lights of a 32bit machine. The following hunk should fix it:
kernel/printk/printk_ringbuffer.c +4 -1
@@ -1477,7 +1477,10 @@ static inline u64 __ulseq_to_u64seq(u32 ulseq)* sequence. It needs to be expanded to 64bit. Get the first sequence * number from the ringbuffer and fold it. */ - seq = rb_first_seq - ((u32 )rb_first_seq - ulseq); +if (rb_first_seq ==0 ) + seq = ulseq; +else + seq = rb_first_seq - ((u32 )rb_first_seq - ulseq);return seq; }
Quoted 1 line
Francesco
Sebastian