|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] hvc/xen: Check console connection flag
On Thu, 11 Mar 2026, Jason Andryuk wrote:
> When the console out buffer is filled, __write_console() will return 0
> as it cannot send any data. domU_write_console() will then spin in
> `while (len)` as len doesn't decrement until xenconsoled attaches. This
> would block a domU and nullify the parallelism of Hyperlaunch until dom0
> userspace starts xenconsoled, which empties the buffer.
>
> Xen 4.21 added a connection field to the xen console page. This is set
> to XENCONSOLED_DISCONNECTED (1) when a domain is built, and xenconsoled
> will set it to XENCONSOLED_CONNECTED (0) when it connects.
It should be XENCONSOLE_DISCONNECTED
> Update the hvc_xen driver to check the field. When the field is
> disconnected, drop the write with -ENOTCONN. We only drop the write
> when the field is XENCONSOLED_DISCONNECTED (1) to try for maximum
> compatibility. The Xen toolstack has historically zero initialized the
> console, so it should see XENCONSOLED_CONNECTED (0) by default. If an
> implemenation used uninitialized memory, only checking for
> XENCONSOLED_DISCONNECTED could have the lowest chance of not connecting.
>
> This lets the hyperlaunched domU boot without stalling. Once dom0
> starts xenconsoled, xl console can be used to access the domU's hvc0.
>
> Update the console.h header to bring in the new field.
>
> Signed-off-by: Jason Andryuk <jason.andryuk@xxxxxxx>
Aside from the minor comment on the commit message:
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> drivers/tty/hvc/hvc_xen.c | 3 +++
> include/xen/interface/io/console.h | 13 +++++++++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
> index 7f0b6262488c..c407592442cd 100644
> --- a/drivers/tty/hvc/hvc_xen.c
> +++ b/drivers/tty/hvc/hvc_xen.c
> @@ -139,6 +139,9 @@ static ssize_t domU_write_console(uint32_t vtermno, const
> u8 *data, size_t len)
> if (cons == NULL)
> return -EINVAL;
>
> + if (cons->intf->connection == XENCONSOLE_DISCONNECTED)
> + return -ENOTCONN;
> +
> /*
> * Make sure the whole buffer is emitted, polling if
> * necessary. We don't ever want to rely on the hvc daemon
> diff --git a/include/xen/interface/io/console.h
> b/include/xen/interface/io/console.h
> index cf17e89ed861..687949bdebb1 100644
> --- a/include/xen/interface/io/console.h
> +++ b/include/xen/interface/io/console.h
> @@ -19,6 +19,19 @@ struct xencons_interface {
> char out[2048];
> XENCONS_RING_IDX in_cons, in_prod;
> XENCONS_RING_IDX out_cons, out_prod;
> +/*
> + * Flag values signaling from backend to frontend whether the console is
> + * connected. i.e. Whether it will be serviced and emptied.
> + *
> + * The flag starts as disconnected.
> + */
> +#define XENCONSOLE_DISCONNECTED 1
> +/*
> + * The flag is set to connected when the backend connects and the console
> + * will be serviced.
> + */
> +#define XENCONSOLE_CONNECTED 0
> + uint8_t connection;
> };
>
> #endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */
> --
> 2.34.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |