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 <[email protected]> Aside from the minor comment on the commit message: Reviewed-by: Stefano Stabellini <[email protected]> > --- > 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 >
