[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH v3] xenconsole: Add connected flag


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jason Andryuk <jason.andryuk@xxxxxxx>
  • Date: Thu, 15 May 2025 16:12:45 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YbjAW9090cd/bjSRbjftgw3ADh8FbS19dgg6yyE6XXs=; b=Shl/YlGbOIkcMm902EsFnjpxmO22G2wROc3i8TgIg/Qo21+LEqGrNqQk0IvfMHAPgHOeLXbFDy3kSTktllDRbDz5oJ7Hj/Htstu3je1dHP17tHfls9uobVb1WhNEu+t/eeeFmckrhIFS9TFG7+fXj5r+hdSYviFPMGs0KFc7s3st7IvfIVUHooq5c2+DTOcpHetaIFHSqEaRV9Hf6pUhysauBL/Kb8HRfB3cMOnAlR4aXDFL0DxyZlqxxq7ad2EUZ5xUNdTcYemKLXxuRhJ2oPkSktYccJkJyE3ZWz7DnbTkxnzgdjH4cQODOXTQ1G+MJzZSWfc2+ECrdAsk3XCA2g==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Tk66sZPBRraqtp+2D0sUrsgGQR0/cKRqlI69sfiXH/Pz0dujCOjdc/HIswhvbCqHUsPqOWl3ssJ1JTJMC+A32BfuAgKWCTqW6orG6brWnamJK7sNWQw6N90CIgZbHho7glShs+5gZuVT4c9RA53p2HFttccaVfWScG6Zhty4UfviGYeveknCNZ8G/MKRIbzRES/2TT3+WqIRNhEntUrFj6sIY2KjpYRoBh/mVB9JkEGfAqtLGJUXEaoiL7ZLUa6sponMEDI+2IdXzyyMjRLp6Srhy/MwZq3a6Mdl2pxaGP1zx71/ihviAkMNyeRFIJpyp/lQT6wkL9x2w4Zep2QSIA==
  • Cc: Jason Andryuk <jason.andryuk@xxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>
  • Delivery-date: Thu, 15 May 2025 20:13:06 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Sending again with an expanded description.  RFC to have a discussion
about the approach.

With hyperlaunch, a domU can start before its console ring is connected
by xenconsoled.  With nothing emptying the ring, it can quickly fill
during boot.  In domU_write_console(), __write_console returns 0 when
the ring is full.  This loops spins until xenconsoled starts emptying
the ring:

        while (len) {
                ssize_t sent = __write_console(cons, data, len);

                if (sent < 0)
                        return sent;

                data += sent;
                len -= sent;

                if (unlikely(len))
                        HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
        }

The goal of this patch is to add a way for the frontend to know when a
console is connected.  This patch adds a new flag to the end of the
console ring structure.  It is used for the backend to indicate that it
has connected and started servicing the page.

The two values are
XENCONSOLE_DISCONNECTED 1
XENCONSOLE_CONNECTED    0

XENCONSOLE_DISCONNECTED indicates to the guest that ring is
disconnected, so it will not be serviced.  The guest can avoid writing
into it in that case.  A domU can use console hypercalls and only
transition to the ring when it is connected and won't fill and block.

Once the backend (xenconsoled) maps and starts servicing the
console, the flag will be set to XENCONSOLE_CONNECTED (0) to indicate
the backend state to the frontend.

With the flag change, the backend sends an event channel notification so
the frontend can check the state.  Though this is not strictly
necessary.

The connected value as 0 will be match the default of a zero-ed console
page.  Hyperlaunch can set the flag to XENCONSOLE_DISCONNECTED and let
xenconsoled set to XENCONSOLE_CONNECTED.

In terms of compatibility:
Old domU drivers won't check the flag, so no change.
New domU running on a new xen/xenconsoled will wait for the flag.
New domU on an old xen/xenconsoled should only see a 0 for the flag and
behave as if connected.

Signed-off-by: Jason Andryuk <jason.andryuk@xxxxxxx>
---
v3:
Flip flag values so 0 is connected.

The other option would be to add distinct features and connected fields:
uint32_t features
uint32_t connected

New domUs would check features for a magic value or flag to then know
they can rely on connected transitioning.

I think making XENCONSOLE_CONNECTED == 0 side steps the need for
an additional features field.  As long as assuming zero-ed memory is
acceptable.  However, this only matters for a hyperlaunched guest -
xenconsoled will normally readily connect the console and set the value.

This assumes that existing frontends are not using the flag space for
some other use.

The idea of the event channel notification is to let the domU receive an
indication that xenconsoled is connected.  For xenstore, the xenstore
driver owns the event channel/irq and can rebind it.  For hvc_xen, the
hvc subsystem owns the irq, so it isn't readily available for rebinding.
Maybe this should just be dropped.

I had the idea for the kernel to use a static key and switch writing
from the hypercall to the PV ring once connected.  It didn't actually
work in my short attempt - I think changing the static key from within
an interupt was wrong.  I fell back to just checking the flag directly
without an optimization.  That would work and would make the event
channel notification unnecessary.
---
 tools/console/daemon/io.c       |  6 ++++++
 xen/include/public/io/console.h | 13 +++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index bb739bdb8c..10524eead7 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -731,6 +731,9 @@ static int console_create_ring(struct console *con)
                con->ring_ref = ring_ref;
        }
 
+       /* Mark the console as connected. */
+       con->interface->flag = XENCONSOLE_CONNECTED;
+
        /* Go no further if port has not changed and we are still bound. */
        if (remote_port == con->remote_port) {
                xc_evtchn_status_t status = {
@@ -780,6 +783,9 @@ static int console_create_ring(struct console *con)
        if (log_guest && (con->log_fd == -1))
                con->log_fd = create_console_log(con);
 
+       /* Notify to check flags field. */
+       xenevtchn_notify(con->xce_handle, con->local_port);
+
  out:
        return err;
 }
diff --git a/xen/include/public/io/console.h b/xen/include/public/io/console.h
index 4509b4b689..c16ef42ef4 100644
--- a/xen/include/public/io/console.h
+++ b/xen/include/public/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
+    uint32_t flag;
 };
 
 #ifdef XEN_WANT_FLEX_CONSOLE_RING
-- 
2.49.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.