|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 4/9] console: support multiple serial console simultaneously
On 06.07.2022 17:32, Marek Marczykowski-Górecki wrote:
> Previously only one serial console was supported at the same time. Using
> console=com1,dbgp,vga silently ignored all but last serial console (in
> this case: only dbgp and vga were active).
>
> Fix this by storing not a single sercon_handle, but an array of them, up
> to MAX_SERCONS entries. The value of MAX_SERCONS (4) is arbitrary,
> inspired by the number of SERHND_IDX values.
>
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> ---
> xen/drivers/char/console.c | 58 ++++++++++++++++++++++++++++++---------
> 1 file changed, 45 insertions(+), 13 deletions(-)
>
> diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
> index f9937c5134c0..44b703296487 100644
> --- a/xen/drivers/char/console.c
> +++ b/xen/drivers/char/console.c
> @@ -113,7 +113,9 @@ static char *__read_mostly conring = _conring;
> static uint32_t __read_mostly conring_size = _CONRING_SIZE;
> static uint32_t conringc, conringp;
>
> -static int __read_mostly sercon_handle = -1;
> +#define MAX_SERCONS 4
Might this want to be a Kconfig setting?
> +static int __read_mostly sercon_handle[MAX_SERCONS];
> +static int __read_mostly nr_sercon_handle = 0;
I would have wanted to ask for __ro_after_init here, but Arm still
hasn't enabled support for it.
> @@ -395,9 +397,17 @@ static unsigned int serial_rx_cons, serial_rx_prod;
>
> static void (*serial_steal_fn)(const char *, size_t nr) = early_puts;
>
> +/* Redirect any console output to *fn*, if *handle* is configured as a
> console. */
> int console_steal(int handle, void (*fn)(const char *, size_t nr))
> {
> - if ( (handle == -1) || (handle != sercon_handle) )
> + int i;
unsigned int please (also elsewhere).
> + if ( handle == -1 )
> + return 0;
> + for ( i = 0; i < nr_sercon_handle; i++ )
> + if ( handle == sercon_handle[i] )
> + break;
> + if ( nr_sercon_handle && i == nr_sercon_handle )
> return 0;
No need for the left side of the &&, I think. I guess it's actively
wrong to be there.
> if ( serial_steal_fn != NULL )
I guess you then also want to make serial_steal_fn an array, and no
longer return constant 1 from the function.
> @@ -977,7 +990,8 @@ void __init console_init_preirq(void)
> continue;
> else if ( (sh = serial_parse_handle(p)) >= 0 )
> {
> - sercon_handle = sh;
> + if ( nr_sercon_handle < MAX_SERCONS )
> + sercon_handle[nr_sercon_handle++] = sh;
else <log a message>
> @@ -1291,7 +1322,8 @@ static int suspend_steal_id;
>
> int console_suspend(void)
> {
> - suspend_steal_id = console_steal(sercon_handle, suspend_steal_fn);
> + if ( nr_sercon_handle )
> + suspend_steal_id = console_steal(sercon_handle[0], suspend_steal_fn);
> serial_suspend();
> return 0;
> }
The commit message gives no explanation why only the first handle
would want/need dealing with here.
One overall remark: Especially with sync_console latency is going to
be yet worse with all output being done sequentially. The help text
for "console=" will want to mention this, up and until this would be
parallelized.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |