|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] console: Do not duplicate early printk messages on conring flush
On Tue, Jun 17, 2025 at 09:19:40AM +0200, Michal Orzel wrote:
> Commit f6d1bfa16052 introduced flushing conring in console_init_preirq().
> However, when CONFIG_EARLY_PRINTK is enabled, the early boot messages
> had already been sent to serial before main console initialization. This
> results in all the early boot messages being duplicated.
>
> Change conring_flush() to accept argument listing devices to which to
> flush conring. We don't want to send to serial at console initialization
> when using early printk, but we want these messages to be send at conring
> dump triggered by keyhandler.
>
> Fixes: f6d1bfa16052 ("xen/console: introduce conring_flush()")
> Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
Reviewed-by: Denis Mukhin <dmukhin@xxxxxxxx>
> ---
> xen/drivers/char/console.c | 20 ++++++++++++++------
> 1 file changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
> index 9a9836ba91e7..5879e31786ba 100644
> --- a/xen/drivers/char/console.c
> +++ b/xen/drivers/char/console.c
> @@ -453,9 +453,9 @@ void console_serial_puts(const char *s, size_t nr)
> }
>
> /*
> - * Flush contents of the conring to the physical console devices.
> + * Flush contents of the conring to the selected console devices.
> */
> -static int conring_flush(void)
> +static int conring_flush(unsigned int flags)
> {
> uint32_t idx, len, sofar, c;
> unsigned int order;
> @@ -479,7 +479,7 @@ static int conring_flush(void)
> c += len;
> }
>
> - console_send(buf, sofar, CONSOLE_SERIAL | CONSOLE_VIDEO | CONSOLE_PV);
> + console_send(buf, sofar, flags);
>
> free_xenheap_pages(buf, order);
>
> @@ -491,7 +491,7 @@ static void cf_check conring_dump_keyhandler(unsigned
> char key)
> int rc;
>
> printk("'%c' pressed -> dumping console ring buffer (dmesg)\n", key);
> - rc = conring_flush();
> + rc = conring_flush(CONSOLE_SERIAL | CONSOLE_VIDEO | CONSOLE_PV);
> if ( rc )
> printk("failed to dump console ring buffer: %d\n", rc);
> }
> @@ -1042,6 +1042,7 @@ void __init console_init_preirq(void)
> {
> char *p;
> int sh;
> + unsigned int flags = CONSOLE_SERIAL | CONSOLE_VIDEO | CONSOLE_PV;
>
> serial_init_preirq();
>
> @@ -1084,8 +1085,15 @@ void __init console_init_preirq(void)
> serial_set_rx_handler(sercon_handle, serial_rx);
> pv_console_set_rx_handler(serial_rx);
>
> - /* NB: send conring contents to all enabled physical consoles, if any */
> - conring_flush();
> + /*
> + * NB: send conring contents to all enabled physical consoles, if any.
> + * Skip serial if CONFIG_EARLY_PRINTK is enabled, which means the early
> + * messages have already been sent to serial.
> + */
> + if ( IS_ENABLED(CONFIG_EARLY_PRINTK) )
> + flags &= ~CONSOLE_SERIAL;
> +
> + conring_flush(flags);
>
> /* HELLO WORLD --- start-of-day banner text. */
> nrspin_lock(&console_lock);
> --
> 2.25.1
>
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |