Skip to content

Commit d50dd72

Browse files
jandryukgregkh
authored andcommitted
hvc/xen: Check console connection flag
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 XENCONSOLE_DISCONNECTED (1) when a domain is built, and xenconsoled will set it to XENCONSOLE_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 XENCONSOLE_DISCONNECTED (1) to try for maximum compatibility. The Xen toolstack has historically zero initialized the console, so it should see XENCONSOLE_CONNECTED (0) by default. If an implemenation used uninitialized memory, only checking for XENCONSOLE_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. Paritally sync console.h from xen.git to bring in the new field. Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com> Link: https://patch.msgid.link/20260318235326.14568-1-jason.andryuk@amd.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 8f18d3c commit d50dd72

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

drivers/tty/hvc/hvc_xen.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ static ssize_t domU_write_console(uint32_t vtermno, const u8 *data, size_t len)
139139
if (cons == NULL)
140140
return -EINVAL;
141141

142+
if (cons->intf->connection == XENCONSOLE_DISCONNECTED)
143+
return -ENOTCONN;
144+
142145
/*
143146
* Make sure the whole buffer is emitted, polling if
144147
* necessary. We don't ever want to rely on the hvc daemon

include/xen/interface/io/console.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ struct xencons_interface {
1919
char out[2048];
2020
XENCONS_RING_IDX in_cons, in_prod;
2121
XENCONS_RING_IDX out_cons, out_prod;
22+
/*
23+
* Flag values signaling from backend to frontend whether the console is
24+
* connected. i.e. Whether it will be serviced and emptied.
25+
*
26+
* The flag starts as disconnected.
27+
*/
28+
#define XENCONSOLE_DISCONNECTED 1
29+
/*
30+
* The flag is set to connected when the backend connects and the console
31+
* will be serviced.
32+
*/
33+
#define XENCONSOLE_CONNECTED 0
34+
uint8_t connection;
2235
};
2336

2437
#endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */

0 commit comments

Comments
 (0)