[PATCH] hvc/xen: Check console connection flag

Jason Andryuk posted 1 patch 1 week, 4 days ago
Failed in applying to current master (apply log)
There is a newer version of this series
drivers/tty/hvc/hvc_xen.c          |  3 +++
include/xen/interface/io/console.h | 13 +++++++++++++
2 files changed, 16 insertions(+)
[PATCH] hvc/xen: Check console connection flag
Posted by Jason Andryuk 1 week, 4 days ago
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.

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@amd.com>
---
 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
Re: [PATCH] hvc/xen: Check console connection flag
Posted by Stefano Stabellini 1 week, 2 days ago
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@amd.com>

Aside from the minor comment on the commit message:

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
>  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
>
Re: [PATCH] hvc/xen: Check console connection flag
Posted by Jiri Slaby 1 week, 3 days ago
On 12. 03. 26, 18:38, Jason Andryuk wrote:
> --- 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

This all should be an enum. And you can document it using kernel-doc 
properly then.

> +    uint8_t connection;

And type check as well.

thanks,
-- 
js
suse labs
Re: [PATCH] hvc/xen: Check console connection flag
Posted by Andrew Cooper 1 week, 3 days ago
On 13/03/2026 8:33 am, Jiri Slaby wrote:
> On 12. 03. 26, 18:38, Jason Andryuk wrote:
>> --- 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
>
> This all should be an enum. And you can document it using kernel-doc
> properly then.
>
>> +    uint8_t connection;
>
> And type check as well.

This is a non-Linux header file being re-sync'd with it's original source.

It describes an ABI between VMs, where things like enum are forbidden.

~Andrew

Re: [PATCH] hvc/xen: Check console connection flag
Posted by Jason Andryuk 1 week, 3 days ago
On 2026-03-13 06:44, Andrew Cooper wrote:
> On 13/03/2026 8:33 am, Jiri Slaby wrote:
>> On 12. 03. 26, 18:38, Jason Andryuk wrote:
>>> --- 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
>>
>> This all should be an enum. And you can document it using kernel-doc
>> properly then.
>>
>>> +    uint8_t connection;
>>
>> And type check as well.
> 
> This is a non-Linux header file being re-sync'd with it's original source.
> 
> It describes an ABI between VMs, where things like enum are forbidden.

Yes, it is as Andrew wrote.  I included "Update the console.h header to 
bring in the new field." in the commit message to try in indicate that. 
"Sync console.h from the xen repo to bring in the new field." would 
better explain its origin.

I only brought in the needed part.  There is an emacs variable block 
that is not synced for other headers.  There is also an ifdef block for
XEN_WANT_FLEX_CONSOLE_RING that isn't used by linux, which I did not sync.

Thanks,
Jason