* [PATCH 0/2] Allow injection of virtio-gpu EDID name
@ 2024-10-17 21:53 Roque Arcudia Hernandez
2024-10-17 21:53 ` [PATCH 1/2] ui: Allow injection of vnc display name Roque Arcudia Hernandez
2024-10-17 21:53 ` [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
0 siblings, 2 replies; 21+ messages in thread
From: Roque Arcudia Hernandez @ 2024-10-17 21:53 UTC (permalink / raw)
To: ankeesler, mst, marcandre.lureau
Cc: qemu-devel, venture, Roque Arcudia Hernandez
Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
Identification Data) is propagated by QEMU such that a virtual
display presents legitimate metadata (e.g., name, serial number,
preferred resolutions, etc.) to its connected guest.
This change adds the ability to specify the EDID name for a
particular virtio-vga display. Previously, every virtual display
would have the same name: "QEMU Monitor". Now, we can inject names of
displays in order to test guest behavior that is specific to display
names. We provide the ability to inject the display name from the
display configuration as that most closely resembles how real
displays work (hardware displays contain static EDID information that
is provided to every connected host).
This new behavior must be enabled by setting the edid_name boolean
property on the display device (it is disabled by default).
It should be noted that EDID names longer than 12 bytes will be
truncated per spec (I think?).
Testing: verified that when I specified 2 outputs for a virtio-gpu
with edid_name set, the names matched those that I configured with my
vnc display.
-display vnc=localhost:0,id=aaa,display=vga,head=0,name=AAA \
-display vnc=localhost:1,id=bbb,display=vga,head=1,name=BBB \
-device virtio-vga,max_outputs=2,id=vga,edid_name=true
Andrew Keesler (2):
ui: Allow injection of vnc display name
hw/display: Allow injection of virtio-gpu EDID name
hw/display/virtio-gpu-base.c | 4 ++++
include/hw/virtio/virtio-gpu.h | 5 +++++
include/ui/console.h | 2 ++
ui/console-priv.h | 1 +
ui/console.c | 16 ++++++++++++++++
ui/vnc.c | 8 +++++++-
6 files changed, 35 insertions(+), 1 deletion(-)
--
2.47.0.rc1.288.g06298d1525-goog
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-17 21:53 [PATCH 0/2] Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
@ 2024-10-17 21:53 ` Roque Arcudia Hernandez
2024-10-21 11:14 ` Marc-André Lureau
2024-10-22 7:14 ` Daniel P. Berrangé
2024-10-17 21:53 ` [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
1 sibling, 2 replies; 21+ messages in thread
From: Roque Arcudia Hernandez @ 2024-10-17 21:53 UTC (permalink / raw)
To: ankeesler, mst, marcandre.lureau
Cc: qemu-devel, venture, Roque Arcudia Hernandez
From: Andrew Keesler <ankeesler@google.com>
Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
Data) is propagated by QEMU such that a virtual display presents legitimate
metadata (e.g., name, serial number, preferred resolutions, etc.) to its
connected guest.
This change propagates an optional user-provided display name to
QemuConsole. Future changes will update downstream devices to leverage this
display name for various uses, the primary one being providing a custom EDID
name to guests. Future changes will also update other displays (e.g., spice)
with a similar option to propagate a display name to downstream devices.
Currently, every virtio-gpu virtual display has the same name: "QEMU
Monitor". We hope to be able to inject the EDID name of virtual displays in
order to test guest behavior that is specific to display names. We provide the
ability to inject the display name from the display configuration as that most
closely resembles how real displays work (hardware displays contain static EDID
information that is provided to every connected host).
It should also be noted that EDID names longer than 12 bytes will be truncated
per spec (I think?).
Signed-off-by: Andrew Keesler <ankeesler@google.com>
Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
---
include/ui/console.h | 1 +
ui/console-priv.h | 1 +
ui/console.c | 8 ++++++++
ui/vnc.c | 8 +++++++-
4 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/include/ui/console.h b/include/ui/console.h
index 5832d52a8a..74ab03ed72 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
uint32_t qemu_console_get_head(QemuConsole *con);
int qemu_console_get_width(QemuConsole *con, int fallback);
int qemu_console_get_height(QemuConsole *con, int fallback);
+void qemu_console_set_name(QemuConsole *con, const char *name);
/* Return the low-level window id for the console */
int qemu_console_get_window_id(QemuConsole *con);
/* Set the low-level window id for the console */
diff --git a/ui/console-priv.h b/ui/console-priv.h
index 43ceb8122f..9f2769843f 100644
--- a/ui/console-priv.h
+++ b/ui/console-priv.h
@@ -18,6 +18,7 @@ struct QemuConsole {
Object parent;
int index;
+ const char *name;
DisplayState *ds;
DisplaySurface *surface;
DisplayScanout scanout;
diff --git a/ui/console.c b/ui/console.c
index 5165f17125..f377fd8417 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con, int fallback)
}
}
+void qemu_console_set_name(QemuConsole *con, const char *name)
+{
+ if (con == NULL) {
+ return;
+ }
+ con->name = name;
+}
+
int qemu_invalidate_text_consoles(void)
{
QemuConsole *s;
diff --git a/ui/vnc.c b/ui/vnc.c
index 93a8dbd253..7d6acc5c2e 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
},{
.name = "power-control",
.type = QEMU_OPT_BOOL,
+ },{
+ .name = "name",
+ .type = QEMU_OPT_STRING,
},
{ /* end of list */ }
},
@@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error **errp)
QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
g_autoptr(SocketAddressList) saddr_list = NULL;
g_autoptr(SocketAddressList) wsaddr_list = NULL;
- const char *share, *device_id;
+ const char *share, *device_id, *name;
QemuConsole *con;
bool password = false;
bool reverse = false;
@@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error **errp)
}
qkbd_state_set_delay(vd->kbd, key_delay_ms);
+ name = qemu_opt_get(opts, "name");
+ qemu_console_set_name(vd->dcl.con, name);
+
if (saddr_list == NULL) {
return;
}
--
2.47.0.rc1.288.g06298d1525-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-10-17 21:53 [PATCH 0/2] Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
2024-10-17 21:53 ` [PATCH 1/2] ui: Allow injection of vnc display name Roque Arcudia Hernandez
@ 2024-10-17 21:53 ` Roque Arcudia Hernandez
2024-11-25 12:04 ` Daniel P. Berrangé
1 sibling, 1 reply; 21+ messages in thread
From: Roque Arcudia Hernandez @ 2024-10-17 21:53 UTC (permalink / raw)
To: ankeesler, mst, marcandre.lureau
Cc: qemu-devel, venture, Roque Arcudia Hernandez
From: Andrew Keesler <ankeesler@google.com>
Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
Data) is propagated by QEMU such that a virtual display presents legitimate
metadata (e.g., name, serial number, preferred resolutions, etc.) to its
connected guest.
This change adds the ability to specify the EDID name for a particular
virtio-vga display. Previously, every virtual display would have the same name:
"QEMU Monitor". Now, we can inject names of displays in order to test guest
behavior that is specific to display names. We provide the ability to inject the
display name from the display configuration as that most closely resembles how
real displays work (hardware displays contain static EDID information that is
provided to every connected host).
This new behavior must be enabled by setting the edid_name boolean property on
the display device (it is disabled by default).
It should be noted that EDID names longer than 12 bytes will be truncated per
spec (I think?).
Testing: verified that when I specified 2 outputs for a virtio-gpu with
edid_name set, the names matched those that I configured with my vnc display.
-display vnc=localhost:0,id=aaa,display=vga,head=0,name=AAA \
-display vnc=localhost:1,id=bbb,display=vga,head=1,name=BBB \
-device virtio-vga,max_outputs=2,id=vga,edid_name=true
Signed-off-by: Andrew Keesler <ankeesler@google.com>
Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
---
hw/display/virtio-gpu-base.c | 4 ++++
include/hw/virtio/virtio-gpu.h | 5 +++++
include/ui/console.h | 1 +
ui/console.c | 8 ++++++++
4 files changed, 18 insertions(+)
diff --git a/hw/display/virtio-gpu-base.c b/hw/display/virtio-gpu-base.c
index 4fc7ef8896..778b798c45 100644
--- a/hw/display/virtio-gpu-base.c
+++ b/hw/display/virtio-gpu-base.c
@@ -64,6 +64,10 @@ virtio_gpu_base_generate_edid(VirtIOGPUBase *g, int scanout,
.refresh_rate = g->req_state[scanout].refresh_rate,
};
+ if (virtio_gpu_edid_name_enabled(g->conf)) {
+ info.name = qemu_console_get_name(g->scanout[scanout].con, NULL);
+ }
+
edid->size = cpu_to_le32(sizeof(edid->edid));
qemu_edid_generate(edid->edid, sizeof(edid->edid), &info);
}
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index e343110e23..186355d0b9 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -97,6 +97,7 @@ enum virtio_gpu_base_conf_flags {
VIRTIO_GPU_FLAG_BLOB_ENABLED,
VIRTIO_GPU_FLAG_CONTEXT_INIT_ENABLED,
VIRTIO_GPU_FLAG_RUTABAGA_ENABLED,
+ VIRTIO_GPU_FLAG_EDID_NAME_ENABLED,
};
#define virtio_gpu_virgl_enabled(_cfg) \
@@ -115,6 +116,8 @@ enum virtio_gpu_base_conf_flags {
(_cfg.flags & (1 << VIRTIO_GPU_FLAG_RUTABAGA_ENABLED))
#define virtio_gpu_hostmem_enabled(_cfg) \
(_cfg.hostmem > 0)
+#define virtio_gpu_edid_name_enabled(_cfg) \
+ (_cfg.flags & (1 << VIRTIO_GPU_FLAG_EDID_NAME_ENABLED))
struct virtio_gpu_base_conf {
uint32_t max_outputs;
@@ -163,6 +166,8 @@ struct VirtIOGPUBaseClass {
DEFINE_PROP_UINT32("max_outputs", _state, _conf.max_outputs, 1), \
DEFINE_PROP_BIT("edid", _state, _conf.flags, \
VIRTIO_GPU_FLAG_EDID_ENABLED, true), \
+ DEFINE_PROP_BIT("edid_name", _state, _conf.flags, \
+ VIRTIO_GPU_FLAG_EDID_NAME_ENABLED, false), \
DEFINE_PROP_UINT32("xres", _state, _conf.xres, 1280), \
DEFINE_PROP_UINT32("yres", _state, _conf.yres, 800)
diff --git a/include/ui/console.h b/include/ui/console.h
index 74ab03ed72..ce90802e0e 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
uint32_t qemu_console_get_head(QemuConsole *con);
int qemu_console_get_width(QemuConsole *con, int fallback);
int qemu_console_get_height(QemuConsole *con, int fallback);
+const char *qemu_console_get_name(QemuConsole *con, const char *fallback);
void qemu_console_set_name(QemuConsole *con, const char *name);
/* Return the low-level window id for the console */
int qemu_console_get_window_id(QemuConsole *con);
diff --git a/ui/console.c b/ui/console.c
index f377fd8417..329688858e 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con, int fallback)
}
}
+const char *qemu_console_get_name(QemuConsole *con, const char *fallback)
+{
+ if (con == NULL) {
+ return fallback;
+ }
+ return con->name;
+}
+
void qemu_console_set_name(QemuConsole *con, const char *name)
{
if (con == NULL) {
--
2.47.0.rc1.288.g06298d1525-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-17 21:53 ` [PATCH 1/2] ui: Allow injection of vnc display name Roque Arcudia Hernandez
@ 2024-10-21 11:14 ` Marc-André Lureau
2024-10-21 20:03 ` Andrew Keesler
2024-10-22 7:53 ` Daniel P. Berrangé
2024-10-22 7:14 ` Daniel P. Berrangé
1 sibling, 2 replies; 21+ messages in thread
From: Marc-André Lureau @ 2024-10-21 11:14 UTC (permalink / raw)
To: Roque Arcudia Hernandez; +Cc: ankeesler, mst, qemu-devel, venture
Hi Roque
On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
<roqueh@google.com> wrote:
>
> From: Andrew Keesler <ankeesler@google.com>
>
> Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
> Data) is propagated by QEMU such that a virtual display presents legitimate
> metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> connected guest.
>
> This change propagates an optional user-provided display name to
> QemuConsole. Future changes will update downstream devices to leverage this
> display name for various uses, the primary one being providing a custom EDID
> name to guests. Future changes will also update other displays (e.g., spice)
> with a similar option to propagate a display name to downstream devices.
>
> Currently, every virtio-gpu virtual display has the same name: "QEMU
> Monitor". We hope to be able to inject the EDID name of virtual displays in
> order to test guest behavior that is specific to display names. We provide the
> ability to inject the display name from the display configuration as that most
> closely resembles how real displays work (hardware displays contain static EDID
> information that is provided to every connected host).
>
> It should also be noted that EDID names longer than 12 bytes will be truncated
> per spec (I think?).
>
> Signed-off-by: Andrew Keesler <ankeesler@google.com>
> Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> ---
> include/ui/console.h | 1 +
> ui/console-priv.h | 1 +
> ui/console.c | 8 ++++++++
> ui/vnc.c | 8 +++++++-
> 4 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/include/ui/console.h b/include/ui/console.h
> index 5832d52a8a..74ab03ed72 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> uint32_t qemu_console_get_head(QemuConsole *con);
> int qemu_console_get_width(QemuConsole *con, int fallback);
> int qemu_console_get_height(QemuConsole *con, int fallback);
> +void qemu_console_set_name(QemuConsole *con, const char *name);
> /* Return the low-level window id for the console */
> int qemu_console_get_window_id(QemuConsole *con);
> /* Set the low-level window id for the console */
> diff --git a/ui/console-priv.h b/ui/console-priv.h
> index 43ceb8122f..9f2769843f 100644
> --- a/ui/console-priv.h
> +++ b/ui/console-priv.h
> @@ -18,6 +18,7 @@ struct QemuConsole {
> Object parent;
>
> int index;
> + const char *name;
> DisplayState *ds;
> DisplaySurface *surface;
> DisplayScanout scanout;
> diff --git a/ui/console.c b/ui/console.c
> index 5165f17125..f377fd8417 100644
> --- a/ui/console.c
> +++ b/ui/console.c
> @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con, int fallback)
> }
> }
>
> +void qemu_console_set_name(QemuConsole *con, const char *name)
> +{
> + if (con == NULL) {
> + return;
> + }
> + con->name = name;
> +}
> +
> int qemu_invalidate_text_consoles(void)
> {
> QemuConsole *s;
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 93a8dbd253..7d6acc5c2e 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> },{
> .name = "power-control",
> .type = QEMU_OPT_BOOL,
> + },{
> + .name = "name",
> + .type = QEMU_OPT_STRING,
> },
> { /* end of list */ }
> },
> @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error **errp)
> QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> g_autoptr(SocketAddressList) saddr_list = NULL;
> g_autoptr(SocketAddressList) wsaddr_list = NULL;
> - const char *share, *device_id;
> + const char *share, *device_id, *name;
> QemuConsole *con;
> bool password = false;
> bool reverse = false;
> @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error **errp)
> }
> qkbd_state_set_delay(vd->kbd, key_delay_ms);
>
> + name = qemu_opt_get(opts, "name");
> + qemu_console_set_name(vd->dcl.con, name);
Why not expose a "head_name" property in QemuGraphicConsole?
This way it should be possible to set the name with QMP qom-set.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-21 11:14 ` Marc-André Lureau
@ 2024-10-21 20:03 ` Andrew Keesler
2024-10-22 7:49 ` Marc-André Lureau
2024-10-22 7:53 ` Daniel P. Berrangé
1 sibling, 1 reply; 21+ messages in thread
From: Andrew Keesler @ 2024-10-21 20:03 UTC (permalink / raw)
To: Marc-André Lureau; +Cc: Roque Arcudia Hernandez, mst, qemu-devel, venture
[-- Attachment #1: Type: text/plain, Size: 5905 bytes --]
Hi Marc-André -
The ability to set the name with QMP qom-set seems like a nice behavior.
Note that the ultimate goal of this name is to propagate it downstream to
a device (see next patch[0] for a sample propagation to virtio-gpu).
In order to accomplish this, would it work to expose this new "head_name"
property via a qemu_graphic_console_get_head_name(QemuConsole *c) function
that:
1. verifies that c is indeed a QemuGraphicConsole with
QEMU_IS_GRAPHIC_CONSOLE(), and
2. returns c->head_name (similar to qemu_console_get_name() from [0])?
We'd probably need a similar function
qemu_graphic_console_get_head_name(QemuConsole *c, const char *name) in
order to
set the head_name from a display (e.g., VNC) - correct me if you were
thinking
of going a different direction with this interface, though. My main goal is
to
provide some way for a user to inject a display EDID name from the command
line.
Also, just to verify my understanding - there would never be a QemuConsole
that
a) is NOT a QemuGraphicConsole AND b) is associated with an EDID in a guest,
correct?
[0] https://lists.gnu.org/archive/html/qemu-devel/2024-10/msg03238.html
On Mon, Oct 21, 2024 at 7:14 AM Marc-André Lureau <
marcandre.lureau@redhat.com> wrote:
> Hi Roque
>
> On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
> <roqueh@google.com> wrote:
> >
> > From: Andrew Keesler <ankeesler@google.com>
> >
> > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
> Identification
> > Data) is propagated by QEMU such that a virtual display presents
> legitimate
> > metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> > connected guest.
> >
> > This change propagates an optional user-provided display name to
> > QemuConsole. Future changes will update downstream devices to leverage
> this
> > display name for various uses, the primary one being providing a custom
> EDID
> > name to guests. Future changes will also update other displays (e.g.,
> spice)
> > with a similar option to propagate a display name to downstream devices.
> >
> > Currently, every virtio-gpu virtual display has the same name: "QEMU
> > Monitor". We hope to be able to inject the EDID name of virtual displays
> in
> > order to test guest behavior that is specific to display names. We
> provide the
> > ability to inject the display name from the display configuration as
> that most
> > closely resembles how real displays work (hardware displays contain
> static EDID
> > information that is provided to every connected host).
> >
> > It should also be noted that EDID names longer than 12 bytes will be
> truncated
> > per spec (I think?).
> >
> > Signed-off-by: Andrew Keesler <ankeesler@google.com>
> > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> > ---
> > include/ui/console.h | 1 +
> > ui/console-priv.h | 1 +
> > ui/console.c | 8 ++++++++
> > ui/vnc.c | 8 +++++++-
> > 4 files changed, 17 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/ui/console.h b/include/ui/console.h
> > index 5832d52a8a..74ab03ed72 100644
> > --- a/include/ui/console.h
> > +++ b/include/ui/console.h
> > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> > uint32_t qemu_console_get_head(QemuConsole *con);
> > int qemu_console_get_width(QemuConsole *con, int fallback);
> > int qemu_console_get_height(QemuConsole *con, int fallback);
> > +void qemu_console_set_name(QemuConsole *con, const char *name);
> > /* Return the low-level window id for the console */
> > int qemu_console_get_window_id(QemuConsole *con);
> > /* Set the low-level window id for the console */
> > diff --git a/ui/console-priv.h b/ui/console-priv.h
> > index 43ceb8122f..9f2769843f 100644
> > --- a/ui/console-priv.h
> > +++ b/ui/console-priv.h
> > @@ -18,6 +18,7 @@ struct QemuConsole {
> > Object parent;
> >
> > int index;
> > + const char *name;
> > DisplayState *ds;
> > DisplaySurface *surface;
> > DisplayScanout scanout;
> > diff --git a/ui/console.c b/ui/console.c
> > index 5165f17125..f377fd8417 100644
> > --- a/ui/console.c
> > +++ b/ui/console.c
> > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con, int
> fallback)
> > }
> > }
> >
> > +void qemu_console_set_name(QemuConsole *con, const char *name)
> > +{
> > + if (con == NULL) {
> > + return;
> > + }
> > + con->name = name;
> > +}
> > +
> > int qemu_invalidate_text_consoles(void)
> > {
> > QemuConsole *s;
> > diff --git a/ui/vnc.c b/ui/vnc.c
> > index 93a8dbd253..7d6acc5c2e 100644
> > --- a/ui/vnc.c
> > +++ b/ui/vnc.c
> > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> > },{
> > .name = "power-control",
> > .type = QEMU_OPT_BOOL,
> > + },{
> > + .name = "name",
> > + .type = QEMU_OPT_STRING,
> > },
> > { /* end of list */ }
> > },
> > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error **errp)
> > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> > g_autoptr(SocketAddressList) saddr_list = NULL;
> > g_autoptr(SocketAddressList) wsaddr_list = NULL;
> > - const char *share, *device_id;
> > + const char *share, *device_id, *name;
> > QemuConsole *con;
> > bool password = false;
> > bool reverse = false;
> > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error **errp)
> > }
> > qkbd_state_set_delay(vd->kbd, key_delay_ms);
> >
> > + name = qemu_opt_get(opts, "name");
> > + qemu_console_set_name(vd->dcl.con, name);
>
> Why not expose a "head_name" property in QemuGraphicConsole?
>
> This way it should be possible to set the name with QMP qom-set.
>
>
[-- Attachment #2: Type: text/html, Size: 7309 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-17 21:53 ` [PATCH 1/2] ui: Allow injection of vnc display name Roque Arcudia Hernandez
2024-10-21 11:14 ` Marc-André Lureau
@ 2024-10-22 7:14 ` Daniel P. Berrangé
1 sibling, 0 replies; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-10-22 7:14 UTC (permalink / raw)
To: Roque Arcudia Hernandez
Cc: ankeesler, mst, marcandre.lureau, qemu-devel, venture
On Thu, Oct 17, 2024 at 09:53:03PM +0000, Roque Arcudia Hernandez wrote:
> From: Andrew Keesler <ankeesler@google.com>
>
> Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
> Data) is propagated by QEMU such that a virtual display presents legitimate
> metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> connected guest.
>
> This change propagates an optional user-provided display name to
> QemuConsole. Future changes will update downstream devices to leverage this
> display name for various uses, the primary one being providing a custom EDID
> name to guests. Future changes will also update other displays (e.g., spice)
> with a similar option to propagate a display name to downstream devices.
>
> Currently, every virtio-gpu virtual display has the same name: "QEMU
> Monitor". We hope to be able to inject the EDID name of virtual displays in
> order to test guest behavior that is specific to display names. We provide the
> ability to inject the display name from the display configuration as that most
> closely resembles how real displays work (hardware displays contain static EDID
> information that is provided to every connected host).
>
> It should also be noted that EDID names longer than 12 bytes will be truncated
> per spec (I think?).
>
> Signed-off-by: Andrew Keesler <ankeesler@google.com>
> Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> ---
> include/ui/console.h | 1 +
> ui/console-priv.h | 1 +
> ui/console.c | 8 ++++++++
> ui/vnc.c | 8 +++++++-
> 4 files changed, 17 insertions(+), 1 deletion(-)
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 93a8dbd253..7d6acc5c2e 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> },{
> .name = "power-control",
> .type = QEMU_OPT_BOOL,
> + },{
> + .name = "name",
> + .type = QEMU_OPT_STRING,
> },
> { /* end of list */ }
> },
> @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error **errp)
> QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> g_autoptr(SocketAddressList) saddr_list = NULL;
> g_autoptr(SocketAddressList) wsaddr_list = NULL;
> - const char *share, *device_id;
> + const char *share, *device_id, *name;
> QemuConsole *con;
> bool password = false;
> bool reverse = false;
> @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error **errp)
> }
> qkbd_state_set_delay(vd->kbd, key_delay_ms);
>
> + name = qemu_opt_get(opts, "name");
> + qemu_console_set_name(vd->dcl.con, name);
> +
> if (saddr_list == NULL) {
> return;
> }
The VNC protocol has a display name field that is sent to the client,
and which they would typically display in the Window titlebar. As a
user, I would expect this 'name' setting to be controlling that. It
is currently set in the 'protocol_client_init' method.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-21 20:03 ` Andrew Keesler
@ 2024-10-22 7:49 ` Marc-André Lureau
2024-10-22 7:55 ` Daniel P. Berrangé
0 siblings, 1 reply; 21+ messages in thread
From: Marc-André Lureau @ 2024-10-22 7:49 UTC (permalink / raw)
To: Andrew Keesler; +Cc: Roque Arcudia Hernandez, mst, qemu-devel, venture
[-- Attachment #1: Type: text/plain, Size: 6524 bytes --]
Hi
On Tue, Oct 22, 2024 at 12:23 AM Andrew Keesler <ankeesler@google.com>
wrote:
> Hi Marc-André -
>
> The ability to set the name with QMP qom-set seems like a nice behavior.
>
> Note that the ultimate goal of this name is to propagate it downstream to
> a device (see next patch[0] for a sample propagation to virtio-gpu).
>
> In order to accomplish this, would it work to expose this new "head_name"
> property via a qemu_graphic_console_get_head_name(QemuConsole *c) function
> that:
>
> 1. verifies that c is indeed a QemuGraphicConsole with
> QEMU_IS_GRAPHIC_CONSOLE(), and
> 2. returns c->head_name (similar to qemu_console_get_name() from [0])?
>
> We'd probably need a similar function
> qemu_graphic_console_get_head_name(QemuConsole *c, const char *name) in
> order to
> set the head_name from a display (e.g., VNC) - correct me if you were
> thinking
>
Right (qemu_graphic_console_set_head_name), get/set exposed to QOM via
object_class_property_add_str()
> of going a different direction with this interface, though. My main goal
> is to
> provide some way for a user to inject a display EDID name from the command
> line.
>
> Also, just to verify my understanding - there would never be a QemuConsole
> that
> a) is NOT a QemuGraphicConsole AND b) is associated with an EDID in a
> guest,
> correct?
>
>
Seems correct.
(fwiw, I think we should have all UI info(s) as part of QemuUIInfo,
including the head name, but this would require further refactoring to
avoid some copy etc)
> [0] https://lists.gnu.org/archive/html/qemu-devel/2024-10/msg03238.html
>
> On Mon, Oct 21, 2024 at 7:14 AM Marc-André Lureau <
> marcandre.lureau@redhat.com> wrote:
>
>> Hi Roque
>>
>> On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
>> <roqueh@google.com> wrote:
>> >
>> > From: Andrew Keesler <ankeesler@google.com>
>> >
>> > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
>> Identification
>> > Data) is propagated by QEMU such that a virtual display presents
>> legitimate
>> > metadata (e.g., name, serial number, preferred resolutions, etc.) to its
>> > connected guest.
>> >
>> > This change propagates an optional user-provided display name to
>> > QemuConsole. Future changes will update downstream devices to leverage
>> this
>> > display name for various uses, the primary one being providing a custom
>> EDID
>> > name to guests. Future changes will also update other displays (e.g.,
>> spice)
>> > with a similar option to propagate a display name to downstream devices.
>> >
>> > Currently, every virtio-gpu virtual display has the same name: "QEMU
>> > Monitor". We hope to be able to inject the EDID name of virtual
>> displays in
>> > order to test guest behavior that is specific to display names. We
>> provide the
>> > ability to inject the display name from the display configuration as
>> that most
>> > closely resembles how real displays work (hardware displays contain
>> static EDID
>> > information that is provided to every connected host).
>> >
>> > It should also be noted that EDID names longer than 12 bytes will be
>> truncated
>> > per spec (I think?).
>> >
>> > Signed-off-by: Andrew Keesler <ankeesler@google.com>
>> > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
>> > ---
>> > include/ui/console.h | 1 +
>> > ui/console-priv.h | 1 +
>> > ui/console.c | 8 ++++++++
>> > ui/vnc.c | 8 +++++++-
>> > 4 files changed, 17 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/include/ui/console.h b/include/ui/console.h
>> > index 5832d52a8a..74ab03ed72 100644
>> > --- a/include/ui/console.h
>> > +++ b/include/ui/console.h
>> > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
>> > uint32_t qemu_console_get_head(QemuConsole *con);
>> > int qemu_console_get_width(QemuConsole *con, int fallback);
>> > int qemu_console_get_height(QemuConsole *con, int fallback);
>> > +void qemu_console_set_name(QemuConsole *con, const char *name);
>> > /* Return the low-level window id for the console */
>> > int qemu_console_get_window_id(QemuConsole *con);
>> > /* Set the low-level window id for the console */
>> > diff --git a/ui/console-priv.h b/ui/console-priv.h
>> > index 43ceb8122f..9f2769843f 100644
>> > --- a/ui/console-priv.h
>> > +++ b/ui/console-priv.h
>> > @@ -18,6 +18,7 @@ struct QemuConsole {
>> > Object parent;
>> >
>> > int index;
>> > + const char *name;
>> > DisplayState *ds;
>> > DisplaySurface *surface;
>> > DisplayScanout scanout;
>> > diff --git a/ui/console.c b/ui/console.c
>> > index 5165f17125..f377fd8417 100644
>> > --- a/ui/console.c
>> > +++ b/ui/console.c
>> > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con,
>> int fallback)
>> > }
>> > }
>> >
>> > +void qemu_console_set_name(QemuConsole *con, const char *name)
>> > +{
>> > + if (con == NULL) {
>> > + return;
>> > + }
>> > + con->name = name;
>> > +}
>> > +
>> > int qemu_invalidate_text_consoles(void)
>> > {
>> > QemuConsole *s;
>> > diff --git a/ui/vnc.c b/ui/vnc.c
>> > index 93a8dbd253..7d6acc5c2e 100644
>> > --- a/ui/vnc.c
>> > +++ b/ui/vnc.c
>> > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
>> > },{
>> > .name = "power-control",
>> > .type = QEMU_OPT_BOOL,
>> > + },{
>> > + .name = "name",
>> > + .type = QEMU_OPT_STRING,
>> > },
>> > { /* end of list */ }
>> > },
>> > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
>> **errp)
>> > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
>> > g_autoptr(SocketAddressList) saddr_list = NULL;
>> > g_autoptr(SocketAddressList) wsaddr_list = NULL;
>> > - const char *share, *device_id;
>> > + const char *share, *device_id, *name;
>> > QemuConsole *con;
>> > bool password = false;
>> > bool reverse = false;
>> > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
>> **errp)
>> > }
>> > qkbd_state_set_delay(vd->kbd, key_delay_ms);
>> >
>> > + name = qemu_opt_get(opts, "name");
>> > + qemu_console_set_name(vd->dcl.con, name);
>>
>> Why not expose a "head_name" property in QemuGraphicConsole?
>>
>> This way it should be possible to set the name with QMP qom-set.
>>
>>
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 8757 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-21 11:14 ` Marc-André Lureau
2024-10-21 20:03 ` Andrew Keesler
@ 2024-10-22 7:53 ` Daniel P. Berrangé
2024-10-22 8:04 ` Marc-André Lureau
1 sibling, 1 reply; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-10-22 7:53 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Roque Arcudia Hernandez, ankeesler, mst, qemu-devel, venture
On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
> Hi Roque
>
> On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
> <roqueh@google.com> wrote:
> >
> > From: Andrew Keesler <ankeesler@google.com>
> >
> > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
> > Data) is propagated by QEMU such that a virtual display presents legitimate
> > metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> > connected guest.
> >
> > This change propagates an optional user-provided display name to
> > QemuConsole. Future changes will update downstream devices to leverage this
> > display name for various uses, the primary one being providing a custom EDID
> > name to guests. Future changes will also update other displays (e.g., spice)
> > with a similar option to propagate a display name to downstream devices.
> >
> > Currently, every virtio-gpu virtual display has the same name: "QEMU
> > Monitor". We hope to be able to inject the EDID name of virtual displays in
> > order to test guest behavior that is specific to display names. We provide the
> > ability to inject the display name from the display configuration as that most
> > closely resembles how real displays work (hardware displays contain static EDID
> > information that is provided to every connected host).
> >
> > It should also be noted that EDID names longer than 12 bytes will be truncated
> > per spec (I think?).
> >
> > Signed-off-by: Andrew Keesler <ankeesler@google.com>
> > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> > ---
> > include/ui/console.h | 1 +
> > ui/console-priv.h | 1 +
> > ui/console.c | 8 ++++++++
> > ui/vnc.c | 8 +++++++-
> > 4 files changed, 17 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/ui/console.h b/include/ui/console.h
> > index 5832d52a8a..74ab03ed72 100644
> > --- a/include/ui/console.h
> > +++ b/include/ui/console.h
> > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> > uint32_t qemu_console_get_head(QemuConsole *con);
> > int qemu_console_get_width(QemuConsole *con, int fallback);
> > int qemu_console_get_height(QemuConsole *con, int fallback);
> > +void qemu_console_set_name(QemuConsole *con, const char *name);
> > /* Return the low-level window id for the console */
> > int qemu_console_get_window_id(QemuConsole *con);
> > /* Set the low-level window id for the console */
> > diff --git a/ui/console-priv.h b/ui/console-priv.h
> > index 43ceb8122f..9f2769843f 100644
> > --- a/ui/console-priv.h
> > +++ b/ui/console-priv.h
> > @@ -18,6 +18,7 @@ struct QemuConsole {
> > Object parent;
> >
> > int index;
> > + const char *name;
> > DisplayState *ds;
> > DisplaySurface *surface;
> > DisplayScanout scanout;
> > diff --git a/ui/console.c b/ui/console.c
> > index 5165f17125..f377fd8417 100644
> > --- a/ui/console.c
> > +++ b/ui/console.c
> > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con, int fallback)
> > }
> > }
> >
> > +void qemu_console_set_name(QemuConsole *con, const char *name)
> > +{
> > + if (con == NULL) {
> > + return;
> > + }
> > + con->name = name;
> > +}
> > +
> > int qemu_invalidate_text_consoles(void)
> > {
> > QemuConsole *s;
> > diff --git a/ui/vnc.c b/ui/vnc.c
> > index 93a8dbd253..7d6acc5c2e 100644
> > --- a/ui/vnc.c
> > +++ b/ui/vnc.c
> > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> > },{
> > .name = "power-control",
> > .type = QEMU_OPT_BOOL,
> > + },{
> > + .name = "name",
> > + .type = QEMU_OPT_STRING,
> > },
> > { /* end of list */ }
> > },
> > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error **errp)
> > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> > g_autoptr(SocketAddressList) saddr_list = NULL;
> > g_autoptr(SocketAddressList) wsaddr_list = NULL;
> > - const char *share, *device_id;
> > + const char *share, *device_id, *name;
> > QemuConsole *con;
> > bool password = false;
> > bool reverse = false;
> > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error **errp)
> > }
> > qkbd_state_set_delay(vd->kbd, key_delay_ms);
> >
> > + name = qemu_opt_get(opts, "name");
> > + qemu_console_set_name(vd->dcl.con, name);
>
> Why not expose a "head_name" property in QemuGraphicConsole?
QemuGraphicConsole isn't mapped to any CLI though, is it ?
In QAPI we have DisplayOptions union for all the local displays,
and as a user I think I'd expect 'name' to be settable from
those.
For VNC/SPICE, we have not mapped to QAPI, but they do have their
own CLI options we can expose.
For runtime setting, we have a QMP "display-update" command, that
currently just lets you change VNC listening address, but was intended
to allow for any runtime display changes.
> This way it should be possible to set the name with QMP qom-set.
qom-set isn't a particularly nice interface, as things you can set
from that are not introspectable and have no type information that
can be queried.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-22 7:49 ` Marc-André Lureau
@ 2024-10-22 7:55 ` Daniel P. Berrangé
0 siblings, 0 replies; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-10-22 7:55 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Andrew Keesler, Roque Arcudia Hernandez, mst, qemu-devel, venture
On Tue, Oct 22, 2024 at 11:49:46AM +0400, Marc-André Lureau wrote:
> Hi
>
> On Tue, Oct 22, 2024 at 12:23 AM Andrew Keesler <ankeesler@google.com>
> wrote:
>
> > Hi Marc-André -
> >
> > The ability to set the name with QMP qom-set seems like a nice behavior.
> >
> > Note that the ultimate goal of this name is to propagate it downstream to
> > a device (see next patch[0] for a sample propagation to virtio-gpu).
> >
> > In order to accomplish this, would it work to expose this new "head_name"
> > property via a qemu_graphic_console_get_head_name(QemuConsole *c) function
> > that:
> >
> > 1. verifies that c is indeed a QemuGraphicConsole with
> > QEMU_IS_GRAPHIC_CONSOLE(), and
> > 2. returns c->head_name (similar to qemu_console_get_name() from [0])?
> >
>
> > We'd probably need a similar function
> > qemu_graphic_console_get_head_name(QemuConsole *c, const char *name) in
> > order to
> > set the head_name from a display (e.g., VNC) - correct me if you were
> > thinking
> >
>
> Right (qemu_graphic_console_set_head_name), get/set exposed to QOM via
> object_class_property_add_str()
>
>
> > of going a different direction with this interface, though. My main goal
> > is to
> > provide some way for a user to inject a display EDID name from the command
> > line.
> >
> > Also, just to verify my understanding - there would never be a QemuConsole
> > that
> > a) is NOT a QemuGraphicConsole AND b) is associated with an EDID in a
> > guest,
> > correct?
> >
> >
> Seems correct.
>
> (fwiw, I think we should have all UI info(s) as part of QemuUIInfo,
> including the head name, but this would require further refactoring to
> avoid some copy etc)
QemuUIInfo is an internal struct, on the public side we have DisplayOptions
in QAPI which is where this should live.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-22 7:53 ` Daniel P. Berrangé
@ 2024-10-22 8:04 ` Marc-André Lureau
2024-10-22 8:10 ` Daniel P. Berrangé
0 siblings, 1 reply; 21+ messages in thread
From: Marc-André Lureau @ 2024-10-22 8:04 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Roque Arcudia Hernandez, ankeesler, mst, qemu-devel, venture
[-- Attachment #1: Type: text/plain, Size: 6138 bytes --]
Hi
On Tue, Oct 22, 2024 at 11:54 AM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
> > Hi Roque
> >
> > On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
> > <roqueh@google.com> wrote:
> > >
> > > From: Andrew Keesler <ankeesler@google.com>
> > >
> > > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
> Identification
> > > Data) is propagated by QEMU such that a virtual display presents
> legitimate
> > > metadata (e.g., name, serial number, preferred resolutions, etc.) to
> its
> > > connected guest.
> > >
> > > This change propagates an optional user-provided display name to
> > > QemuConsole. Future changes will update downstream devices to leverage
> this
> > > display name for various uses, the primary one being providing a
> custom EDID
> > > name to guests. Future changes will also update other displays (e.g.,
> spice)
> > > with a similar option to propagate a display name to downstream
> devices.
> > >
> > > Currently, every virtio-gpu virtual display has the same name: "QEMU
> > > Monitor". We hope to be able to inject the EDID name of virtual
> displays in
> > > order to test guest behavior that is specific to display names. We
> provide the
> > > ability to inject the display name from the display configuration as
> that most
> > > closely resembles how real displays work (hardware displays contain
> static EDID
> > > information that is provided to every connected host).
> > >
> > > It should also be noted that EDID names longer than 12 bytes will be
> truncated
> > > per spec (I think?).
> > >
> > > Signed-off-by: Andrew Keesler <ankeesler@google.com>
> > > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> > > ---
> > > include/ui/console.h | 1 +
> > > ui/console-priv.h | 1 +
> > > ui/console.c | 8 ++++++++
> > > ui/vnc.c | 8 +++++++-
> > > 4 files changed, 17 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/include/ui/console.h b/include/ui/console.h
> > > index 5832d52a8a..74ab03ed72 100644
> > > --- a/include/ui/console.h
> > > +++ b/include/ui/console.h
> > > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> > > uint32_t qemu_console_get_head(QemuConsole *con);
> > > int qemu_console_get_width(QemuConsole *con, int fallback);
> > > int qemu_console_get_height(QemuConsole *con, int fallback);
> > > +void qemu_console_set_name(QemuConsole *con, const char *name);
> > > /* Return the low-level window id for the console */
> > > int qemu_console_get_window_id(QemuConsole *con);
> > > /* Set the low-level window id for the console */
> > > diff --git a/ui/console-priv.h b/ui/console-priv.h
> > > index 43ceb8122f..9f2769843f 100644
> > > --- a/ui/console-priv.h
> > > +++ b/ui/console-priv.h
> > > @@ -18,6 +18,7 @@ struct QemuConsole {
> > > Object parent;
> > >
> > > int index;
> > > + const char *name;
> > > DisplayState *ds;
> > > DisplaySurface *surface;
> > > DisplayScanout scanout;
> > > diff --git a/ui/console.c b/ui/console.c
> > > index 5165f17125..f377fd8417 100644
> > > --- a/ui/console.c
> > > +++ b/ui/console.c
> > > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con,
> int fallback)
> > > }
> > > }
> > >
> > > +void qemu_console_set_name(QemuConsole *con, const char *name)
> > > +{
> > > + if (con == NULL) {
> > > + return;
> > > + }
> > > + con->name = name;
> > > +}
> > > +
> > > int qemu_invalidate_text_consoles(void)
> > > {
> > > QemuConsole *s;
> > > diff --git a/ui/vnc.c b/ui/vnc.c
> > > index 93a8dbd253..7d6acc5c2e 100644
> > > --- a/ui/vnc.c
> > > +++ b/ui/vnc.c
> > > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> > > },{
> > > .name = "power-control",
> > > .type = QEMU_OPT_BOOL,
> > > + },{
> > > + .name = "name",
> > > + .type = QEMU_OPT_STRING,
> > > },
> > > { /* end of list */ }
> > > },
> > > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
> **errp)
> > > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> > > g_autoptr(SocketAddressList) saddr_list = NULL;
> > > g_autoptr(SocketAddressList) wsaddr_list = NULL;
> > > - const char *share, *device_id;
> > > + const char *share, *device_id, *name;
> > > QemuConsole *con;
> > > bool password = false;
> > > bool reverse = false;
> > > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
> **errp)
> > > }
> > > qkbd_state_set_delay(vd->kbd, key_delay_ms);
> > >
> > > + name = qemu_opt_get(opts, "name");
> > > + qemu_console_set_name(vd->dcl.con, name);
> >
> > Why not expose a "head_name" property in QemuGraphicConsole?
>
> QemuGraphicConsole isn't mapped to any CLI though, is it ?
>
>
No, it would be a bit tedious to do so with multi-head -devices.
> In QAPI we have DisplayOptions union for all the local displays,
> and as a user I think I'd expect 'name' to be settable from
> those.
>
>
DisplayOptions is meant for the UI display.. Here, the intent is really to
set the HW EDID name field.
Also DisplayOptions doesn't map to a specific console.
For VNC/SPICE, we have not mapped to QAPI, but they do have their
> own CLI options we can expose.
>
> For runtime setting, we have a QMP "display-update" command, that
> currently just lets you change VNC listening address, but was intended
> to allow for any runtime display changes.
>
> > This way it should be possible to set the name with QMP qom-set.
>
> qom-set isn't a particularly nice interface, as things you can set
> from that are not introspectable and have no type information that
> can be queried.
>
fwiw, it could be easily exposed to D-Bus, for ex:
busctl --user set-property org.qemu /org/qemu/Display1/Console_1
org.qemu.Display1.Console HeadName s "First Monitor"
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 8341 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-22 8:04 ` Marc-André Lureau
@ 2024-10-22 8:10 ` Daniel P. Berrangé
2024-10-22 8:36 ` Marc-André Lureau
0 siblings, 1 reply; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-10-22 8:10 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Roque Arcudia Hernandez, ankeesler, mst, qemu-devel, venture
On Tue, Oct 22, 2024 at 12:04:29PM +0400, Marc-André Lureau wrote:
> Hi
>
> On Tue, Oct 22, 2024 at 11:54 AM Daniel P. Berrangé <berrange@redhat.com>
> wrote:
>
> > On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
> > > Hi Roque
> > >
> > > On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
> > > <roqueh@google.com> wrote:
> > > >
> > > > From: Andrew Keesler <ankeesler@google.com>
> > > >
> > > > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
> > Identification
> > > > Data) is propagated by QEMU such that a virtual display presents
> > legitimate
> > > > metadata (e.g., name, serial number, preferred resolutions, etc.) to
> > its
> > > > connected guest.
> > > >
> > > > This change propagates an optional user-provided display name to
> > > > QemuConsole. Future changes will update downstream devices to leverage
> > this
> > > > display name for various uses, the primary one being providing a
> > custom EDID
> > > > name to guests. Future changes will also update other displays (e.g.,
> > spice)
> > > > with a similar option to propagate a display name to downstream
> > devices.
> > > >
> > > > Currently, every virtio-gpu virtual display has the same name: "QEMU
> > > > Monitor". We hope to be able to inject the EDID name of virtual
> > displays in
> > > > order to test guest behavior that is specific to display names. We
> > provide the
> > > > ability to inject the display name from the display configuration as
> > that most
> > > > closely resembles how real displays work (hardware displays contain
> > static EDID
> > > > information that is provided to every connected host).
> > > >
> > > > It should also be noted that EDID names longer than 12 bytes will be
> > truncated
> > > > per spec (I think?).
> > > >
> > > > Signed-off-by: Andrew Keesler <ankeesler@google.com>
> > > > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> > > > ---
> > > > include/ui/console.h | 1 +
> > > > ui/console-priv.h | 1 +
> > > > ui/console.c | 8 ++++++++
> > > > ui/vnc.c | 8 +++++++-
> > > > 4 files changed, 17 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/include/ui/console.h b/include/ui/console.h
> > > > index 5832d52a8a..74ab03ed72 100644
> > > > --- a/include/ui/console.h
> > > > +++ b/include/ui/console.h
> > > > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> > > > uint32_t qemu_console_get_head(QemuConsole *con);
> > > > int qemu_console_get_width(QemuConsole *con, int fallback);
> > > > int qemu_console_get_height(QemuConsole *con, int fallback);
> > > > +void qemu_console_set_name(QemuConsole *con, const char *name);
> > > > /* Return the low-level window id for the console */
> > > > int qemu_console_get_window_id(QemuConsole *con);
> > > > /* Set the low-level window id for the console */
> > > > diff --git a/ui/console-priv.h b/ui/console-priv.h
> > > > index 43ceb8122f..9f2769843f 100644
> > > > --- a/ui/console-priv.h
> > > > +++ b/ui/console-priv.h
> > > > @@ -18,6 +18,7 @@ struct QemuConsole {
> > > > Object parent;
> > > >
> > > > int index;
> > > > + const char *name;
> > > > DisplayState *ds;
> > > > DisplaySurface *surface;
> > > > DisplayScanout scanout;
> > > > diff --git a/ui/console.c b/ui/console.c
> > > > index 5165f17125..f377fd8417 100644
> > > > --- a/ui/console.c
> > > > +++ b/ui/console.c
> > > > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole *con,
> > int fallback)
> > > > }
> > > > }
> > > >
> > > > +void qemu_console_set_name(QemuConsole *con, const char *name)
> > > > +{
> > > > + if (con == NULL) {
> > > > + return;
> > > > + }
> > > > + con->name = name;
> > > > +}
> > > > +
> > > > int qemu_invalidate_text_consoles(void)
> > > > {
> > > > QemuConsole *s;
> > > > diff --git a/ui/vnc.c b/ui/vnc.c
> > > > index 93a8dbd253..7d6acc5c2e 100644
> > > > --- a/ui/vnc.c
> > > > +++ b/ui/vnc.c
> > > > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> > > > },{
> > > > .name = "power-control",
> > > > .type = QEMU_OPT_BOOL,
> > > > + },{
> > > > + .name = "name",
> > > > + .type = QEMU_OPT_STRING,
> > > > },
> > > > { /* end of list */ }
> > > > },
> > > > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
> > **errp)
> > > > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> > > > g_autoptr(SocketAddressList) saddr_list = NULL;
> > > > g_autoptr(SocketAddressList) wsaddr_list = NULL;
> > > > - const char *share, *device_id;
> > > > + const char *share, *device_id, *name;
> > > > QemuConsole *con;
> > > > bool password = false;
> > > > bool reverse = false;
> > > > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
> > **errp)
> > > > }
> > > > qkbd_state_set_delay(vd->kbd, key_delay_ms);
> > > >
> > > > + name = qemu_opt_get(opts, "name");
> > > > + qemu_console_set_name(vd->dcl.con, name);
> > >
> > > Why not expose a "head_name" property in QemuGraphicConsole?
> >
> > QemuGraphicConsole isn't mapped to any CLI though, is it ?
> >
> >
> No, it would be a bit tedious to do so with multi-head -devices.
>
>
> > In QAPI we have DisplayOptions union for all the local displays,
> > and as a user I think I'd expect 'name' to be settable from
> > those.
> >
> >
> DisplayOptions is meant for the UI display.. Here, the intent is really to
> set the HW EDID name field.
But it is also applicable to the backend, all of which have a
name for the display set in the window titlebar. We should
be looking at both sides IMHO.
> Also DisplayOptions doesn't map to a specific console.
It could be made to contain per-head information if we desired
though, and would be more useful than just the name. There were
some patches a while ago trying to express per-console placement
of windows onto host monitor outputs, for example.
> > own CLI options we can expose.
> >
> > For runtime setting, we have a QMP "display-update" command, that
> > currently just lets you change VNC listening address, but was intended
> > to allow for any runtime display changes.
> >
> > > This way it should be possible to set the name with QMP qom-set.
> >
> > qom-set isn't a particularly nice interface, as things you can set
> > from that are not introspectable and have no type information that
> > can be queried.
> >
>
> fwiw, it could be easily exposed to D-Bus, for ex:
>
> busctl --user set-property org.qemu /org/qemu/Display1/Console_1
> org.qemu.Display1.Console HeadName s "First Monitor"
That could be mapped to whatever interface we expose on the QEMU side,
it doesn't have to be qom-set.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-22 8:10 ` Daniel P. Berrangé
@ 2024-10-22 8:36 ` Marc-André Lureau
2024-10-28 19:25 ` Andrew Keesler
0 siblings, 1 reply; 21+ messages in thread
From: Marc-André Lureau @ 2024-10-22 8:36 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Roque Arcudia Hernandez, ankeesler, mst, qemu-devel, venture
[-- Attachment #1: Type: text/plain, Size: 7897 bytes --]
Hi
On Tue, Oct 22, 2024 at 12:10 PM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> On Tue, Oct 22, 2024 at 12:04:29PM +0400, Marc-André Lureau wrote:
> > Hi
> >
> > On Tue, Oct 22, 2024 at 11:54 AM Daniel P. Berrangé <berrange@redhat.com
> >
> > wrote:
> >
> > > On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
> > > > Hi Roque
> > > >
> > > > On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
> > > > <roqueh@google.com> wrote:
> > > > >
> > > > > From: Andrew Keesler <ankeesler@google.com>
> > > > >
> > > > > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
> > > Identification
> > > > > Data) is propagated by QEMU such that a virtual display presents
> > > legitimate
> > > > > metadata (e.g., name, serial number, preferred resolutions, etc.)
> to
> > > its
> > > > > connected guest.
> > > > >
> > > > > This change propagates an optional user-provided display name to
> > > > > QemuConsole. Future changes will update downstream devices to
> leverage
> > > this
> > > > > display name for various uses, the primary one being providing a
> > > custom EDID
> > > > > name to guests. Future changes will also update other displays
> (e.g.,
> > > spice)
> > > > > with a similar option to propagate a display name to downstream
> > > devices.
> > > > >
> > > > > Currently, every virtio-gpu virtual display has the same name:
> "QEMU
> > > > > Monitor". We hope to be able to inject the EDID name of virtual
> > > displays in
> > > > > order to test guest behavior that is specific to display names. We
> > > provide the
> > > > > ability to inject the display name from the display configuration
> as
> > > that most
> > > > > closely resembles how real displays work (hardware displays contain
> > > static EDID
> > > > > information that is provided to every connected host).
> > > > >
> > > > > It should also be noted that EDID names longer than 12 bytes will
> be
> > > truncated
> > > > > per spec (I think?).
> > > > >
> > > > > Signed-off-by: Andrew Keesler <ankeesler@google.com>
> > > > > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
> > > > > ---
> > > > > include/ui/console.h | 1 +
> > > > > ui/console-priv.h | 1 +
> > > > > ui/console.c | 8 ++++++++
> > > > > ui/vnc.c | 8 +++++++-
> > > > > 4 files changed, 17 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/include/ui/console.h b/include/ui/console.h
> > > > > index 5832d52a8a..74ab03ed72 100644
> > > > > --- a/include/ui/console.h
> > > > > +++ b/include/ui/console.h
> > > > > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
> > > > > uint32_t qemu_console_get_head(QemuConsole *con);
> > > > > int qemu_console_get_width(QemuConsole *con, int fallback);
> > > > > int qemu_console_get_height(QemuConsole *con, int fallback);
> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name);
> > > > > /* Return the low-level window id for the console */
> > > > > int qemu_console_get_window_id(QemuConsole *con);
> > > > > /* Set the low-level window id for the console */
> > > > > diff --git a/ui/console-priv.h b/ui/console-priv.h
> > > > > index 43ceb8122f..9f2769843f 100644
> > > > > --- a/ui/console-priv.h
> > > > > +++ b/ui/console-priv.h
> > > > > @@ -18,6 +18,7 @@ struct QemuConsole {
> > > > > Object parent;
> > > > >
> > > > > int index;
> > > > > + const char *name;
> > > > > DisplayState *ds;
> > > > > DisplaySurface *surface;
> > > > > DisplayScanout scanout;
> > > > > diff --git a/ui/console.c b/ui/console.c
> > > > > index 5165f17125..f377fd8417 100644
> > > > > --- a/ui/console.c
> > > > > +++ b/ui/console.c
> > > > > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole
> *con,
> > > int fallback)
> > > > > }
> > > > > }
> > > > >
> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name)
> > > > > +{
> > > > > + if (con == NULL) {
> > > > > + return;
> > > > > + }
> > > > > + con->name = name;
> > > > > +}
> > > > > +
> > > > > int qemu_invalidate_text_consoles(void)
> > > > > {
> > > > > QemuConsole *s;
> > > > > diff --git a/ui/vnc.c b/ui/vnc.c
> > > > > index 93a8dbd253..7d6acc5c2e 100644
> > > > > --- a/ui/vnc.c
> > > > > +++ b/ui/vnc.c
> > > > > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
> > > > > },{
> > > > > .name = "power-control",
> > > > > .type = QEMU_OPT_BOOL,
> > > > > + },{
> > > > > + .name = "name",
> > > > > + .type = QEMU_OPT_STRING,
> > > > > },
> > > > > { /* end of list */ }
> > > > > },
> > > > > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
> > > **errp)
> > > > > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
> > > > > g_autoptr(SocketAddressList) saddr_list = NULL;
> > > > > g_autoptr(SocketAddressList) wsaddr_list = NULL;
> > > > > - const char *share, *device_id;
> > > > > + const char *share, *device_id, *name;
> > > > > QemuConsole *con;
> > > > > bool password = false;
> > > > > bool reverse = false;
> > > > > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
> > > **errp)
> > > > > }
> > > > > qkbd_state_set_delay(vd->kbd, key_delay_ms);
> > > > >
> > > > > + name = qemu_opt_get(opts, "name");
> > > > > + qemu_console_set_name(vd->dcl.con, name);
> > > >
> > > > Why not expose a "head_name" property in QemuGraphicConsole?
> > >
> > > QemuGraphicConsole isn't mapped to any CLI though, is it ?
> > >
> > >
> > No, it would be a bit tedious to do so with multi-head -devices.
> >
> >
> > > In QAPI we have DisplayOptions union for all the local displays,
> > > and as a user I think I'd expect 'name' to be settable from
> > > those.
> > >
> > >
> > DisplayOptions is meant for the UI display.. Here, the intent is really
> to
> > set the HW EDID name field.
>
> But it is also applicable to the backend, all of which have a
> name for the display set in the window titlebar. We should
> be looking at both sides IMHO.
>
Ok, if we consider both should be treated similarly / reflect each other.
>
> > Also DisplayOptions doesn't map to a specific console.
>
> It could be made to contain per-head information if we desired
> though, and would be more useful than just the name. There were
> some patches a while ago trying to express per-console placement
> of windows onto host monitor outputs, for example.
>
[RFC PATCH v2 0/2] ui/gtk: Introduce new param - Connectors
https://patchew.org/QEMU/20240531185804.119557-1-dongwon.kim@intel.com/
>
> > > own CLI options we can expose.
> > >
> > > For runtime setting, we have a QMP "display-update" command, that
> > > currently just lets you change VNC listening address, but was intended
> > > to allow for any runtime display changes.
> > >
> > > > This way it should be possible to set the name with QMP qom-set.
> > >
> > > qom-set isn't a particularly nice interface, as things you can set
> > > from that are not introspectable and have no type information that
> > > can be queried.
> > >
> >
> > fwiw, it could be easily exposed to D-Bus, for ex:
> >
> > busctl --user set-property org.qemu /org/qemu/Display1/Console_1
> > org.qemu.Display1.Console HeadName s "First Monitor"
>
> That could be mapped to whatever interface we expose on the QEMU side,
> it doesn't have to be qom-set.
>
It seems to me the main problem is that consoles are dynamically created by
devices, and it's hard for the ui/display to map options to a specific
console.
The other issue is handling arrays with CLI in general...
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 11294 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-22 8:36 ` Marc-André Lureau
@ 2024-10-28 19:25 ` Andrew Keesler
2024-11-22 14:40 ` Andrew Keesler
0 siblings, 1 reply; 21+ messages in thread
From: Andrew Keesler @ 2024-10-28 19:25 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Daniel P. Berrangé, Roque Arcudia Hernandez, mst, qemu-devel,
venture
[-- Attachment #1: Type: text/plain, Size: 9225 bytes --]
Hi Daniel and Marc-André - please excuse my delay (I was traveling
last week).
I see 2 primary takeaways here:
1. Updating the name field from the ServerInit RFB message to be
controlled by the 'name' VNC option
2. Updating where we store the display 'name' in memory
For 1 - are we amenable to me updating this display name field to be
controlled by 'name' in a future patch? I'm still learning what the
QEMU community prefers with respect to patch sizes, but in general I
have been trying to keep the patches small.
For 2 - have we landed on storing the per-display 'name' in
DisplayOptions? I can't quite tell if we've converged here. It also
seems like there is some more plumbing to install here before we
leverage DisplayOptions, so I am curious what the recommendation is
for this patch - is there a temporary solution we could pursue and do
refactors later to unlock the CLI functionality that has been brought
up?
Correct me if I am wrong about any of this.
On Tue, Oct 22, 2024 at 4:36 AM Marc-André Lureau <
marcandre.lureau@gmail.com> wrote:
> Hi
>
> On Tue, Oct 22, 2024 at 12:10 PM Daniel P. Berrangé <berrange@redhat.com>
> wrote:
>
>> On Tue, Oct 22, 2024 at 12:04:29PM +0400, Marc-André Lureau wrote:
>> > Hi
>> >
>> > On Tue, Oct 22, 2024 at 11:54 AM Daniel P. Berrangé <
>> berrange@redhat.com>
>> > wrote:
>> >
>> > > On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
>> > > > Hi Roque
>> > > >
>> > > > On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
>> > > > <roqueh@google.com> wrote:
>> > > > >
>> > > > > From: Andrew Keesler <ankeesler@google.com>
>> > > > >
>> > > > > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
>> > > Identification
>> > > > > Data) is propagated by QEMU such that a virtual display presents
>> > > legitimate
>> > > > > metadata (e.g., name, serial number, preferred resolutions, etc.)
>> to
>> > > its
>> > > > > connected guest.
>> > > > >
>> > > > > This change propagates an optional user-provided display name to
>> > > > > QemuConsole. Future changes will update downstream devices to
>> leverage
>> > > this
>> > > > > display name for various uses, the primary one being providing a
>> > > custom EDID
>> > > > > name to guests. Future changes will also update other displays
>> (e.g.,
>> > > spice)
>> > > > > with a similar option to propagate a display name to downstream
>> > > devices.
>> > > > >
>> > > > > Currently, every virtio-gpu virtual display has the same name:
>> "QEMU
>> > > > > Monitor". We hope to be able to inject the EDID name of virtual
>> > > displays in
>> > > > > order to test guest behavior that is specific to display names. We
>> > > provide the
>> > > > > ability to inject the display name from the display configuration
>> as
>> > > that most
>> > > > > closely resembles how real displays work (hardware displays
>> contain
>> > > static EDID
>> > > > > information that is provided to every connected host).
>> > > > >
>> > > > > It should also be noted that EDID names longer than 12 bytes will
>> be
>> > > truncated
>> > > > > per spec (I think?).
>> > > > >
>> > > > > Signed-off-by: Andrew Keesler <ankeesler@google.com>
>> > > > > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
>> > > > > ---
>> > > > > include/ui/console.h | 1 +
>> > > > > ui/console-priv.h | 1 +
>> > > > > ui/console.c | 8 ++++++++
>> > > > > ui/vnc.c | 8 +++++++-
>> > > > > 4 files changed, 17 insertions(+), 1 deletion(-)
>> > > > >
>> > > > > diff --git a/include/ui/console.h b/include/ui/console.h
>> > > > > index 5832d52a8a..74ab03ed72 100644
>> > > > > --- a/include/ui/console.h
>> > > > > +++ b/include/ui/console.h
>> > > > > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
>> > > > > uint32_t qemu_console_get_head(QemuConsole *con);
>> > > > > int qemu_console_get_width(QemuConsole *con, int fallback);
>> > > > > int qemu_console_get_height(QemuConsole *con, int fallback);
>> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name);
>> > > > > /* Return the low-level window id for the console */
>> > > > > int qemu_console_get_window_id(QemuConsole *con);
>> > > > > /* Set the low-level window id for the console */
>> > > > > diff --git a/ui/console-priv.h b/ui/console-priv.h
>> > > > > index 43ceb8122f..9f2769843f 100644
>> > > > > --- a/ui/console-priv.h
>> > > > > +++ b/ui/console-priv.h
>> > > > > @@ -18,6 +18,7 @@ struct QemuConsole {
>> > > > > Object parent;
>> > > > >
>> > > > > int index;
>> > > > > + const char *name;
>> > > > > DisplayState *ds;
>> > > > > DisplaySurface *surface;
>> > > > > DisplayScanout scanout;
>> > > > > diff --git a/ui/console.c b/ui/console.c
>> > > > > index 5165f17125..f377fd8417 100644
>> > > > > --- a/ui/console.c
>> > > > > +++ b/ui/console.c
>> > > > > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole
>> *con,
>> > > int fallback)
>> > > > > }
>> > > > > }
>> > > > >
>> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name)
>> > > > > +{
>> > > > > + if (con == NULL) {
>> > > > > + return;
>> > > > > + }
>> > > > > + con->name = name;
>> > > > > +}
>> > > > > +
>> > > > > int qemu_invalidate_text_consoles(void)
>> > > > > {
>> > > > > QemuConsole *s;
>> > > > > diff --git a/ui/vnc.c b/ui/vnc.c
>> > > > > index 93a8dbd253..7d6acc5c2e 100644
>> > > > > --- a/ui/vnc.c
>> > > > > +++ b/ui/vnc.c
>> > > > > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
>> > > > > },{
>> > > > > .name = "power-control",
>> > > > > .type = QEMU_OPT_BOOL,
>> > > > > + },{
>> > > > > + .name = "name",
>> > > > > + .type = QEMU_OPT_STRING,
>> > > > > },
>> > > > > { /* end of list */ }
>> > > > > },
>> > > > > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
>> > > **errp)
>> > > > > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
>> > > > > g_autoptr(SocketAddressList) saddr_list = NULL;
>> > > > > g_autoptr(SocketAddressList) wsaddr_list = NULL;
>> > > > > - const char *share, *device_id;
>> > > > > + const char *share, *device_id, *name;
>> > > > > QemuConsole *con;
>> > > > > bool password = false;
>> > > > > bool reverse = false;
>> > > > > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
>> > > **errp)
>> > > > > }
>> > > > > qkbd_state_set_delay(vd->kbd, key_delay_ms);
>> > > > >
>> > > > > + name = qemu_opt_get(opts, "name");
>> > > > > + qemu_console_set_name(vd->dcl.con, name);
>> > > >
>> > > > Why not expose a "head_name" property in QemuGraphicConsole?
>> > >
>> > > QemuGraphicConsole isn't mapped to any CLI though, is it ?
>> > >
>> > >
>> > No, it would be a bit tedious to do so with multi-head -devices.
>> >
>> >
>> > > In QAPI we have DisplayOptions union for all the local displays,
>> > > and as a user I think I'd expect 'name' to be settable from
>> > > those.
>> > >
>> > >
>> > DisplayOptions is meant for the UI display.. Here, the intent is really
>> to
>> > set the HW EDID name field.
>>
>> But it is also applicable to the backend, all of which have a
>> name for the display set in the window titlebar. We should
>> be looking at both sides IMHO.
>>
>
> Ok, if we consider both should be treated similarly / reflect each other.
>
>
>>
>> > Also DisplayOptions doesn't map to a specific console.
>>
>> It could be made to contain per-head information if we desired
>> though, and would be more useful than just the name. There were
>> some patches a while ago trying to express per-console placement
>> of windows onto host monitor outputs, for example.
>>
>
> [RFC PATCH v2 0/2] ui/gtk: Introduce new param - Connectors
> https://patchew.org/QEMU/20240531185804.119557-1-dongwon.kim@intel.com/
>
>>
>> > > own CLI options we can expose.
>> > >
>> > > For runtime setting, we have a QMP "display-update" command, that
>> > > currently just lets you change VNC listening address, but was intended
>> > > to allow for any runtime display changes.
>> > >
>> > > > This way it should be possible to set the name with QMP qom-set.
>> > >
>> > > qom-set isn't a particularly nice interface, as things you can set
>> > > from that are not introspectable and have no type information that
>> > > can be queried.
>> > >
>> >
>> > fwiw, it could be easily exposed to D-Bus, for ex:
>> >
>> > busctl --user set-property org.qemu /org/qemu/Display1/Console_1
>> > org.qemu.Display1.Console HeadName s "First Monitor"
>>
>> That could be mapped to whatever interface we expose on the QEMU side,
>> it doesn't have to be qom-set.
>>
>
> It seems to me the main problem is that consoles are dynamically created
> by devices, and it's hard for the ui/display to map options to a specific
> console.
>
> The other issue is handling arrays with CLI in general...
>
> --
> Marc-André Lureau
>
[-- Attachment #2: Type: text/html, Size: 12783 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/2] ui: Allow injection of vnc display name
2024-10-28 19:25 ` Andrew Keesler
@ 2024-11-22 14:40 ` Andrew Keesler
0 siblings, 0 replies; 21+ messages in thread
From: Andrew Keesler @ 2024-11-22 14:40 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Daniel P. Berrangé, Roque Arcudia Hernandez, mst, qemu-devel,
venture
[-- Attachment #1: Type: text/plain, Size: 9723 bytes --]
Hi - gentle ping on my last email. Would love to hear any thoughts about
moving
this forward.
Thank you for your thoughts thus far.
On Mon, Oct 28, 2024 at 3:25 PM Andrew Keesler <ankeesler@google.com> wrote:
> Hi Daniel and Marc-André - please excuse my delay (I was traveling
> last week).
>
> I see 2 primary takeaways here:
>
> 1. Updating the name field from the ServerInit RFB message to be
> controlled by the 'name' VNC option
>
> 2. Updating where we store the display 'name' in memory
>
> For 1 - are we amenable to me updating this display name field to be
> controlled by 'name' in a future patch? I'm still learning what the
> QEMU community prefers with respect to patch sizes, but in general I
> have been trying to keep the patches small.
>
> For 2 - have we landed on storing the per-display 'name' in
> DisplayOptions? I can't quite tell if we've converged here. It also
> seems like there is some more plumbing to install here before we
> leverage DisplayOptions, so I am curious what the recommendation is
> for this patch - is there a temporary solution we could pursue and do
> refactors later to unlock the CLI functionality that has been brought
> up?
>
> Correct me if I am wrong about any of this.
>
> On Tue, Oct 22, 2024 at 4:36 AM Marc-André Lureau <
> marcandre.lureau@gmail.com> wrote:
>
>> Hi
>>
>> On Tue, Oct 22, 2024 at 12:10 PM Daniel P. Berrangé <berrange@redhat.com>
>> wrote:
>>
>>> On Tue, Oct 22, 2024 at 12:04:29PM +0400, Marc-André Lureau wrote:
>>> > Hi
>>> >
>>> > On Tue, Oct 22, 2024 at 11:54 AM Daniel P. Berrangé <
>>> berrange@redhat.com>
>>> > wrote:
>>> >
>>> > > On Mon, Oct 21, 2024 at 03:14:39PM +0400, Marc-André Lureau wrote:
>>> > > > Hi Roque
>>> > > >
>>> > > > On Fri, Oct 18, 2024 at 1:53 AM Roque Arcudia Hernandez
>>> > > > <roqueh@google.com> wrote:
>>> > > > >
>>> > > > > From: Andrew Keesler <ankeesler@google.com>
>>> > > > >
>>> > > > > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
>>> > > Identification
>>> > > > > Data) is propagated by QEMU such that a virtual display presents
>>> > > legitimate
>>> > > > > metadata (e.g., name, serial number, preferred resolutions,
>>> etc.) to
>>> > > its
>>> > > > > connected guest.
>>> > > > >
>>> > > > > This change propagates an optional user-provided display name to
>>> > > > > QemuConsole. Future changes will update downstream devices to
>>> leverage
>>> > > this
>>> > > > > display name for various uses, the primary one being providing a
>>> > > custom EDID
>>> > > > > name to guests. Future changes will also update other displays
>>> (e.g.,
>>> > > spice)
>>> > > > > with a similar option to propagate a display name to downstream
>>> > > devices.
>>> > > > >
>>> > > > > Currently, every virtio-gpu virtual display has the same name:
>>> "QEMU
>>> > > > > Monitor". We hope to be able to inject the EDID name of virtual
>>> > > displays in
>>> > > > > order to test guest behavior that is specific to display names.
>>> We
>>> > > provide the
>>> > > > > ability to inject the display name from the display
>>> configuration as
>>> > > that most
>>> > > > > closely resembles how real displays work (hardware displays
>>> contain
>>> > > static EDID
>>> > > > > information that is provided to every connected host).
>>> > > > >
>>> > > > > It should also be noted that EDID names longer than 12 bytes
>>> will be
>>> > > truncated
>>> > > > > per spec (I think?).
>>> > > > >
>>> > > > > Signed-off-by: Andrew Keesler <ankeesler@google.com>
>>> > > > > Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
>>> > > > > ---
>>> > > > > include/ui/console.h | 1 +
>>> > > > > ui/console-priv.h | 1 +
>>> > > > > ui/console.c | 8 ++++++++
>>> > > > > ui/vnc.c | 8 +++++++-
>>> > > > > 4 files changed, 17 insertions(+), 1 deletion(-)
>>> > > > >
>>> > > > > diff --git a/include/ui/console.h b/include/ui/console.h
>>> > > > > index 5832d52a8a..74ab03ed72 100644
>>> > > > > --- a/include/ui/console.h
>>> > > > > +++ b/include/ui/console.h
>>> > > > > @@ -408,6 +408,7 @@ int qemu_console_get_index(QemuConsole *con);
>>> > > > > uint32_t qemu_console_get_head(QemuConsole *con);
>>> > > > > int qemu_console_get_width(QemuConsole *con, int fallback);
>>> > > > > int qemu_console_get_height(QemuConsole *con, int fallback);
>>> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name);
>>> > > > > /* Return the low-level window id for the console */
>>> > > > > int qemu_console_get_window_id(QemuConsole *con);
>>> > > > > /* Set the low-level window id for the console */
>>> > > > > diff --git a/ui/console-priv.h b/ui/console-priv.h
>>> > > > > index 43ceb8122f..9f2769843f 100644
>>> > > > > --- a/ui/console-priv.h
>>> > > > > +++ b/ui/console-priv.h
>>> > > > > @@ -18,6 +18,7 @@ struct QemuConsole {
>>> > > > > Object parent;
>>> > > > >
>>> > > > > int index;
>>> > > > > + const char *name;
>>> > > > > DisplayState *ds;
>>> > > > > DisplaySurface *surface;
>>> > > > > DisplayScanout scanout;
>>> > > > > diff --git a/ui/console.c b/ui/console.c
>>> > > > > index 5165f17125..f377fd8417 100644
>>> > > > > --- a/ui/console.c
>>> > > > > +++ b/ui/console.c
>>> > > > > @@ -1452,6 +1452,14 @@ int qemu_console_get_height(QemuConsole
>>> *con,
>>> > > int fallback)
>>> > > > > }
>>> > > > > }
>>> > > > >
>>> > > > > +void qemu_console_set_name(QemuConsole *con, const char *name)
>>> > > > > +{
>>> > > > > + if (con == NULL) {
>>> > > > > + return;
>>> > > > > + }
>>> > > > > + con->name = name;
>>> > > > > +}
>>> > > > > +
>>> > > > > int qemu_invalidate_text_consoles(void)
>>> > > > > {
>>> > > > > QemuConsole *s;
>>> > > > > diff --git a/ui/vnc.c b/ui/vnc.c
>>> > > > > index 93a8dbd253..7d6acc5c2e 100644
>>> > > > > --- a/ui/vnc.c
>>> > > > > +++ b/ui/vnc.c
>>> > > > > @@ -3595,6 +3595,9 @@ static QemuOptsList qemu_vnc_opts = {
>>> > > > > },{
>>> > > > > .name = "power-control",
>>> > > > > .type = QEMU_OPT_BOOL,
>>> > > > > + },{
>>> > > > > + .name = "name",
>>> > > > > + .type = QEMU_OPT_STRING,
>>> > > > > },
>>> > > > > { /* end of list */ }
>>> > > > > },
>>> > > > > @@ -4016,7 +4019,7 @@ void vnc_display_open(const char *id, Error
>>> > > **errp)
>>> > > > > QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
>>> > > > > g_autoptr(SocketAddressList) saddr_list = NULL;
>>> > > > > g_autoptr(SocketAddressList) wsaddr_list = NULL;
>>> > > > > - const char *share, *device_id;
>>> > > > > + const char *share, *device_id, *name;
>>> > > > > QemuConsole *con;
>>> > > > > bool password = false;
>>> > > > > bool reverse = false;
>>> > > > > @@ -4217,6 +4220,9 @@ void vnc_display_open(const char *id, Error
>>> > > **errp)
>>> > > > > }
>>> > > > > qkbd_state_set_delay(vd->kbd, key_delay_ms);
>>> > > > >
>>> > > > > + name = qemu_opt_get(opts, "name");
>>> > > > > + qemu_console_set_name(vd->dcl.con, name);
>>> > > >
>>> > > > Why not expose a "head_name" property in QemuGraphicConsole?
>>> > >
>>> > > QemuGraphicConsole isn't mapped to any CLI though, is it ?
>>> > >
>>> > >
>>> > No, it would be a bit tedious to do so with multi-head -devices.
>>> >
>>> >
>>> > > In QAPI we have DisplayOptions union for all the local displays,
>>> > > and as a user I think I'd expect 'name' to be settable from
>>> > > those.
>>> > >
>>> > >
>>> > DisplayOptions is meant for the UI display.. Here, the intent is
>>> really to
>>> > set the HW EDID name field.
>>>
>>> But it is also applicable to the backend, all of which have a
>>> name for the display set in the window titlebar. We should
>>> be looking at both sides IMHO.
>>>
>>
>> Ok, if we consider both should be treated similarly / reflect each other.
>>
>>
>>>
>>> > Also DisplayOptions doesn't map to a specific console.
>>>
>>> It could be made to contain per-head information if we desired
>>> though, and would be more useful than just the name. There were
>>> some patches a while ago trying to express per-console placement
>>> of windows onto host monitor outputs, for example.
>>>
>>
>> [RFC PATCH v2 0/2] ui/gtk: Introduce new param - Connectors
>> https://patchew.org/QEMU/20240531185804.119557-1-dongwon.kim@intel.com/
>>
>>>
>>> > > own CLI options we can expose.
>>> > >
>>> > > For runtime setting, we have a QMP "display-update" command, that
>>> > > currently just lets you change VNC listening address, but was
>>> intended
>>> > > to allow for any runtime display changes.
>>> > >
>>> > > > This way it should be possible to set the name with QMP qom-set.
>>> > >
>>> > > qom-set isn't a particularly nice interface, as things you can set
>>> > > from that are not introspectable and have no type information that
>>> > > can be queried.
>>> > >
>>> >
>>> > fwiw, it could be easily exposed to D-Bus, for ex:
>>> >
>>> > busctl --user set-property org.qemu /org/qemu/Display1/Console_1
>>> > org.qemu.Display1.Console HeadName s "First Monitor"
>>>
>>> That could be mapped to whatever interface we expose on the QEMU side,
>>> it doesn't have to be qom-set.
>>>
>>
>> It seems to me the main problem is that consoles are dynamically created
>> by devices, and it's hard for the ui/display to map options to a specific
>> console.
>>
>> The other issue is handling arrays with CLI in general...
>>
>> --
>> Marc-André Lureau
>>
>
[-- Attachment #2: Type: text/html, Size: 13368 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-10-17 21:53 ` [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
@ 2024-11-25 12:04 ` Daniel P. Berrangé
2024-11-25 20:54 ` Andrew Keesler
0 siblings, 1 reply; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-11-25 12:04 UTC (permalink / raw)
To: Roque Arcudia Hernandez
Cc: ankeesler, mst, marcandre.lureau, qemu-devel, venture
On Thu, Oct 17, 2024 at 09:53:04PM +0000, Roque Arcudia Hernandez wrote:
> From: Andrew Keesler <ankeesler@google.com>
>
> Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display Identification
> Data) is propagated by QEMU such that a virtual display presents legitimate
> metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> connected guest.
>
> This change adds the ability to specify the EDID name for a particular
> virtio-vga display. Previously, every virtual display would have the same name:
> "QEMU Monitor". Now, we can inject names of displays in order to test guest
> behavior that is specific to display names. We provide the ability to inject the
> display name from the display configuration as that most closely resembles how
> real displays work (hardware displays contain static EDID information that is
> provided to every connected host).
>
> This new behavior must be enabled by setting the edid_name boolean property on
> the display device (it is disabled by default).
>
> It should be noted that EDID names longer than 12 bytes will be truncated per
> spec (I think?).
>
> Testing: verified that when I specified 2 outputs for a virtio-gpu with
> edid_name set, the names matched those that I configured with my vnc display.
>
> -display vnc=localhost:0,id=aaa,display=vga,head=0,name=AAA \
> -display vnc=localhost:1,id=bbb,display=vga,head=1,name=BBB \
> -device virtio-vga,max_outputs=2,id=vga,edid_name=true
Looking at this again, I'm thinking that it modelling this the wrong
way around.
On the QEMU side, we have a many<->many relationship between guest
display devices and host / remote display outputs.
If we assume every host / remote display output corresponds to a
separate "window" though, then we can reduce that down to a
many:one relationship between host outputs and guest devices.
Consider this valid config:
$ qemu-system-x86_64 \
-vnc :1 \
-spice port=5902,disable-ticketing \
-display gtk \
-device virtio-vga,max_outputs=2,id=vga
All three display outputs show the same guest display, so which
of VNC, SPICE & GTK would the virtio-vga EDID data take its names
from ?
IMHO, the name is a property of the virtio-vga "output" and the
various display backends should be honouring what that tells them
ie your configuration above should instead be:
-display vnc=localhost:0,id=aaa,display=vga,head=0 \
-display vnc=localhost:1,id=bbb,display=vga,head=1 \
-device '{"driver":"virtio-vga",
"max_outputs":2,
"id":"vga",
"outputs":[
{
"name":"AAA",
},
{
"name":"BBB",
},
]}'
..whereupon we have to feed the EDID name from the device back to VNC,
so VNC can tell the client of the head name.
Note, I'm intentionally using JSON syntax for -device here, to illustrate
handling of non-scalar properties.
The set of active outputs can be turned on/off at runtime. We can declare
that the user should give names for every output at startup, upto whatever
they said for "max_outputs". That way a name is available even when non-
primary outputs are later turned on at runtime.
The secondary reason why I think names ought to be handled with -device
is that this is guest visible data, and as a general rule we aim for all
guest visible data to be controlled via properties on the frontend, and
not have the backend directly change what the guest sees.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-11-25 12:04 ` Daniel P. Berrangé
@ 2024-11-25 20:54 ` Andrew Keesler
2024-11-26 16:03 ` Daniel P. Berrangé
0 siblings, 1 reply; 21+ messages in thread
From: Andrew Keesler @ 2024-11-25 20:54 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Roque Arcudia Hernandez, mst, marcandre.lureau, qemu-devel,
venture
[-- Attachment #1: Type: text/plain, Size: 4918 bytes --]
I follow what you are saying. I misunderstood what a "display" was in the
domain of QEMU. Yes, this makes more sense now.
> the user should give names for every output at startup
I see DEFINE_PROP_ARRAY exists. I can use that to define the new "outputs"
property. Any reason that each "output" would ever need to be an object
(rather than just a string)? Nothing comes to mind, I'm just taking a second
to think about API forwards compatibility.
> upto whatever they said for "max_outputs"
Where is the best place to perform this validation? I would imagine we would
want to fast-fail if the user provided more "outputs" than "max_outputs". I
can
perform the validation in virtio_gpu_base_get_features but that seems late.
Thanks for your help.
On Mon, Nov 25, 2024 at 7:04 AM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> On Thu, Oct 17, 2024 at 09:53:04PM +0000, Roque Arcudia Hernandez wrote:
> > From: Andrew Keesler <ankeesler@google.com>
> >
> > Thanks to 72d277a7, 1ed2cb32, and others, EDID (Extended Display
> Identification
> > Data) is propagated by QEMU such that a virtual display presents
> legitimate
> > metadata (e.g., name, serial number, preferred resolutions, etc.) to its
> > connected guest.
> >
> > This change adds the ability to specify the EDID name for a particular
> > virtio-vga display. Previously, every virtual display would have the
> same name:
> > "QEMU Monitor". Now, we can inject names of displays in order to test
> guest
> > behavior that is specific to display names. We provide the ability to
> inject the
> > display name from the display configuration as that most closely
> resembles how
> > real displays work (hardware displays contain static EDID information
> that is
> > provided to every connected host).
> >
> > This new behavior must be enabled by setting the edid_name boolean
> property on
> > the display device (it is disabled by default).
> >
> > It should be noted that EDID names longer than 12 bytes will be
> truncated per
> > spec (I think?).
> >
> > Testing: verified that when I specified 2 outputs for a virtio-gpu with
> > edid_name set, the names matched those that I configured with my vnc
> display.
> >
> > -display vnc=localhost:0,id=aaa,display=vga,head=0,name=AAA \
> > -display vnc=localhost:1,id=bbb,display=vga,head=1,name=BBB \
> > -device virtio-vga,max_outputs=2,id=vga,edid_name=true
>
> Looking at this again, I'm thinking that it modelling this the wrong
> way around.
>
> On the QEMU side, we have a many<->many relationship between guest
> display devices and host / remote display outputs.
>
> If we assume every host / remote display output corresponds to a
> separate "window" though, then we can reduce that down to a
> many:one relationship between host outputs and guest devices.
>
> Consider this valid config:
>
> $ qemu-system-x86_64 \
> -vnc :1 \
> -spice port=5902,disable-ticketing \
> -display gtk \
> -device virtio-vga,max_outputs=2,id=vga
>
> All three display outputs show the same guest display, so which
> of VNC, SPICE & GTK would the virtio-vga EDID data take its names
> from ?
>
> IMHO, the name is a property of the virtio-vga "output" and the
> various display backends should be honouring what that tells them
> ie your configuration above should instead be:
>
> -display vnc=localhost:0,id=aaa,display=vga,head=0 \
> -display vnc=localhost:1,id=bbb,display=vga,head=1 \
> -device '{"driver":"virtio-vga",
> "max_outputs":2,
> "id":"vga",
> "outputs":[
> {
> "name":"AAA",
> },
> {
> "name":"BBB",
> },
> ]}'
>
> ..whereupon we have to feed the EDID name from the device back to VNC,
> so VNC can tell the client of the head name.
>
> Note, I'm intentionally using JSON syntax for -device here, to illustrate
> handling of non-scalar properties.
>
> The set of active outputs can be turned on/off at runtime. We can declare
> that the user should give names for every output at startup, upto whatever
> they said for "max_outputs". That way a name is available even when non-
> primary outputs are later turned on at runtime.
>
> The secondary reason why I think names ought to be handled with -device
> is that this is guest visible data, and as a general rule we aim for all
> guest visible data to be controlled via properties on the frontend, and
> not have the backend directly change what the guest sees.
>
> With regards,
> Daniel
> --
> |: https://berrange.com -o-
> https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org -o-
> https://fstop138.berrange.com :|
> |: https://entangle-photo.org -o-
> https://www.instagram.com/dberrange :|
>
>
[-- Attachment #2: Type: text/html, Size: 6499 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-11-25 20:54 ` Andrew Keesler
@ 2024-11-26 16:03 ` Daniel P. Berrangé
2024-11-26 21:07 ` Andrew Keesler
0 siblings, 1 reply; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-11-26 16:03 UTC (permalink / raw)
To: Andrew Keesler
Cc: Roque Arcudia Hernandez, mst, marcandre.lureau, qemu-devel,
venture
On Mon, Nov 25, 2024 at 03:54:40PM -0500, Andrew Keesler wrote:
> I follow what you are saying. I misunderstood what a "display" was in the
> domain of QEMU. Yes, this makes more sense now.
>
> > the user should give names for every output at startup
>
> I see DEFINE_PROP_ARRAY exists. I can use that to define the new "outputs"
> property. Any reason that each "output" would ever need to be an object
> (rather than just a string)? Nothing comes to mind, I'm just taking a second
> to think about API forwards compatibility.
Currently we have 'xres' and 'yres' properties set against the device
for virtio-gpu.
If we're going to extend it to allow the name of each "output" head
to be configured, it makes sense to allow for a data structure that
will let us also cnofigure xres & yres per output.
Hence, I thought it would make more sense to have an array of structs,
rather than the simpler array of strings, which will let us set any
amount of per-output config data we might want in future.
NB, I'm not asking you to wire up support for xres/yres per output,
just that we anticipate it as a possibility.
> > upto whatever they said for "max_outputs"
>
> Where is the best place to perform this validation? I would imagine we would
> want to fast-fail if the user provided more "outputs" than "max_outputs". I
> can
> perform the validation in virtio_gpu_base_get_features but that seems late.
I'd suggest putting it in virtio_gpu_base_device_realize, as we already
have code there to validate 'max_outputs" is within limits.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-11-26 16:03 ` Daniel P. Berrangé
@ 2024-11-26 21:07 ` Andrew Keesler
2024-12-02 20:31 ` Andrew Keesler
0 siblings, 1 reply; 21+ messages in thread
From: Andrew Keesler @ 2024-11-26 21:07 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Roque Arcudia Hernandez, mst, marcandre.lureau, qemu-devel,
venture
[-- Attachment #1: Type: text/plain, Size: 2208 bytes --]
Thanks, Daniel. We'll get this patch updated and send it out again.
> it makes sense to allow for a data structure
Whoops, I misread your original message - data structure SGTM.
On Tue, Nov 26, 2024 at 11:04 AM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> On Mon, Nov 25, 2024 at 03:54:40PM -0500, Andrew Keesler wrote:
> > I follow what you are saying. I misunderstood what a "display" was in the
> > domain of QEMU. Yes, this makes more sense now.
> >
> > > the user should give names for every output at startup
> >
> > I see DEFINE_PROP_ARRAY exists. I can use that to define the new
> "outputs"
> > property. Any reason that each "output" would ever need to be an object
> > (rather than just a string)? Nothing comes to mind, I'm just taking a
> second
> > to think about API forwards compatibility.
>
> Currently we have 'xres' and 'yres' properties set against the device
> for virtio-gpu.
>
> If we're going to extend it to allow the name of each "output" head
> to be configured, it makes sense to allow for a data structure that
> will let us also cnofigure xres & yres per output.
>
> Hence, I thought it would make more sense to have an array of structs,
> rather than the simpler array of strings, which will let us set any
> amount of per-output config data we might want in future.
>
> NB, I'm not asking you to wire up support for xres/yres per output,
> just that we anticipate it as a possibility.
>
> > > upto whatever they said for "max_outputs"
> >
> > Where is the best place to perform this validation? I would imagine we
> would
> > want to fast-fail if the user provided more "outputs" than
> "max_outputs". I
> > can
> > perform the validation in virtio_gpu_base_get_features but that seems
> late.
>
> I'd suggest putting it in virtio_gpu_base_device_realize, as we already
> have code there to validate 'max_outputs" is within limits.
>
>
> With regards,
> Daniel
> --
> |: https://berrange.com -o-
> https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org -o-
> https://fstop138.berrange.com :|
> |: https://entangle-photo.org -o-
> https://www.instagram.com/dberrange :|
>
>
[-- Attachment #2: Type: text/html, Size: 3276 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-11-26 21:07 ` Andrew Keesler
@ 2024-12-02 20:31 ` Andrew Keesler
2024-12-05 16:59 ` Daniel P. Berrangé
0 siblings, 1 reply; 21+ messages in thread
From: Andrew Keesler @ 2024-12-02 20:31 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Roque Arcudia Hernandez, mst, marcandre.lureau, qemu-devel,
venture
[-- Attachment #1: Type: text/plain, Size: 3075 bytes --]
Hi again Daniel. I have a follow up question. Can you help me
understand how I can declare this "outputs" property?
-device '{"driver":"virtio-vga",
"max_outputs":2,
"id":"vga",
"outputs":[
{
"name":"AAA",
},
{
"name":"BBB",
},
]}'
I thought DEFINE_PROP_ARRAY would do it, but I can't tell what PropertyInfo
implementation I should pass. All of the PropertyInfo implementations I can
find use scalar types, or simple text decoding. I am wondering if I am
missing
some sort of "JSON" encoding capabilities that can happen behind the scenes.
On Tue, Nov 26, 2024 at 4:07 PM Andrew Keesler <ankeesler@google.com> wrote:
> Thanks, Daniel. We'll get this patch updated and send it out again.
>
> > it makes sense to allow for a data structure
>
> Whoops, I misread your original message - data structure SGTM.
>
> On Tue, Nov 26, 2024 at 11:04 AM Daniel P. Berrangé <berrange@redhat.com>
> wrote:
>
>> On Mon, Nov 25, 2024 at 03:54:40PM -0500, Andrew Keesler wrote:
>> > I follow what you are saying. I misunderstood what a "display" was in
>> the
>> > domain of QEMU. Yes, this makes more sense now.
>> >
>> > > the user should give names for every output at startup
>> >
>> > I see DEFINE_PROP_ARRAY exists. I can use that to define the new
>> "outputs"
>> > property. Any reason that each "output" would ever need to be an object
>> > (rather than just a string)? Nothing comes to mind, I'm just taking a
>> second
>> > to think about API forwards compatibility.
>>
>> Currently we have 'xres' and 'yres' properties set against the device
>> for virtio-gpu.
>>
>> If we're going to extend it to allow the name of each "output" head
>> to be configured, it makes sense to allow for a data structure that
>> will let us also cnofigure xres & yres per output.
>>
>> Hence, I thought it would make more sense to have an array of structs,
>> rather than the simpler array of strings, which will let us set any
>> amount of per-output config data we might want in future.
>>
>> NB, I'm not asking you to wire up support for xres/yres per output,
>> just that we anticipate it as a possibility.
>>
>> > > upto whatever they said for "max_outputs"
>> >
>> > Where is the best place to perform this validation? I would imagine we
>> would
>> > want to fast-fail if the user provided more "outputs" than
>> "max_outputs". I
>> > can
>> > perform the validation in virtio_gpu_base_get_features but that seems
>> late.
>>
>> I'd suggest putting it in virtio_gpu_base_device_realize, as we already
>> have code there to validate 'max_outputs" is within limits.
>>
>>
>> With regards,
>> Daniel
>> --
>> |: https://berrange.com -o-
>> https://www.flickr.com/photos/dberrange :|
>> |: https://libvirt.org -o-
>> https://fstop138.berrange.com :|
>> |: https://entangle-photo.org -o-
>> https://www.instagram.com/dberrange :|
>>
>>
[-- Attachment #2: Type: text/html, Size: 4708 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-12-02 20:31 ` Andrew Keesler
@ 2024-12-05 16:59 ` Daniel P. Berrangé
2024-12-10 9:27 ` Markus Armbruster
0 siblings, 1 reply; 21+ messages in thread
From: Daniel P. Berrangé @ 2024-12-05 16:59 UTC (permalink / raw)
To: Andrew Keesler
Cc: Roque Arcudia Hernandez, mst, marcandre.lureau, qemu-devel,
venture, Markus Armbruster
CC Markus to keep me honest in my comments below
On Mon, Dec 02, 2024 at 03:31:53PM -0500, Andrew Keesler wrote:
> Hi again Daniel. I have a follow up question. Can you help me
> understand how I can declare this "outputs" property?
>
> -device '{"driver":"virtio-vga",
> "max_outputs":2,
> "id":"vga",
> "outputs":[
> {
> "name":"AAA",
> },
> {
> "name":"BBB",
> },
> ]}'
>
> I thought DEFINE_PROP_ARRAY would do it, but I can't tell what PropertyInfo
> implementation I should pass. All of the PropertyInfo implementations I can
> find use scalar types, or simple text decoding. I am wondering if I am
> missing
> some sort of "JSON" encoding capabilities that can happen behind the scenes.
I could have sworn we had an example of how to handle this already,
but I'm not finding any Device class with a non-scalar property
that isn't merely an array of scalars.
We definitely have some examples elsewhere for exmaple "Machine" class
has an SmpCacheProperties array property, and the QAuthZList class
has an array of "QAuthZListRule" property.
In both cases the struct is defined in th qapi/<blah>.json, which
auto-generates code eg visit_type_QAuthZListRuleList, which can
then get called from qauthz_list_prop_get_rules and
qauthz_list_prop_set_rules, for the property.
Devices use a slightly higher level wrapper so instead of calling
object_class_property_add directly, then define the PropertyInfo
and object_class_property_add gets called indirectly for them.
I'm thinking it should still be possible to use the QAPI code
generator to help though. You could either just define the struct,
and thn use that to create PropertyInfo to be used in combination
with DEFINE_PROP_ARRAY, of you could define a list of structs at
the QAPI level and use plain DEFINE_PROP. I guess the former is
probably better aligned with other Device code.
>
> On Tue, Nov 26, 2024 at 4:07 PM Andrew Keesler <ankeesler@google.com> wrote:
>
> > Thanks, Daniel. We'll get this patch updated and send it out again.
> >
> > > it makes sense to allow for a data structure
> >
> > Whoops, I misread your original message - data structure SGTM.
> >
> > On Tue, Nov 26, 2024 at 11:04 AM Daniel P. Berrangé <berrange@redhat.com>
> > wrote:
> >
> >> On Mon, Nov 25, 2024 at 03:54:40PM -0500, Andrew Keesler wrote:
> >> > I follow what you are saying. I misunderstood what a "display" was in
> >> the
> >> > domain of QEMU. Yes, this makes more sense now.
> >> >
> >> > > the user should give names for every output at startup
> >> >
> >> > I see DEFINE_PROP_ARRAY exists. I can use that to define the new
> >> "outputs"
> >> > property. Any reason that each "output" would ever need to be an object
> >> > (rather than just a string)? Nothing comes to mind, I'm just taking a
> >> second
> >> > to think about API forwards compatibility.
> >>
> >> Currently we have 'xres' and 'yres' properties set against the device
> >> for virtio-gpu.
> >>
> >> If we're going to extend it to allow the name of each "output" head
> >> to be configured, it makes sense to allow for a data structure that
> >> will let us also cnofigure xres & yres per output.
> >>
> >> Hence, I thought it would make more sense to have an array of structs,
> >> rather than the simpler array of strings, which will let us set any
> >> amount of per-output config data we might want in future.
> >>
> >> NB, I'm not asking you to wire up support for xres/yres per output,
> >> just that we anticipate it as a possibility.
> >>
> >> > > upto whatever they said for "max_outputs"
> >> >
> >> > Where is the best place to perform this validation? I would imagine we
> >> would
> >> > want to fast-fail if the user provided more "outputs" than
> >> "max_outputs". I
> >> > can
> >> > perform the validation in virtio_gpu_base_get_features but that seems
> >> late.
> >>
> >> I'd suggest putting it in virtio_gpu_base_device_realize, as we already
> >> have code there to validate 'max_outputs" is within limits.
> >>
> >>
> >> With regards,
> >> Daniel
> >> --
> >> |: https://berrange.com -o-
> >> https://www.flickr.com/photos/dberrange :|
> >> |: https://libvirt.org -o-
> >> https://fstop138.berrange.com :|
> >> |: https://entangle-photo.org -o-
> >> https://www.instagram.com/dberrange :|
> >>
> >>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name
2024-12-05 16:59 ` Daniel P. Berrangé
@ 2024-12-10 9:27 ` Markus Armbruster
0 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2024-12-10 9:27 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Andrew Keesler, Roque Arcudia Hernandez, mst, marcandre.lureau,
qemu-devel, venture
Daniel P. Berrangé <berrange@redhat.com> writes:
> CC Markus to keep me honest in my comments below
>
> On Mon, Dec 02, 2024 at 03:31:53PM -0500, Andrew Keesler wrote:
>> Hi again Daniel. I have a follow up question. Can you help me
>> understand how I can declare this "outputs" property?
>>
>> -device '{"driver":"virtio-vga",
>> "max_outputs":2,
>> "id":"vga",
>> "outputs":[
>> {
>> "name":"AAA",
>> },
>> {
>> "name":"BBB",
>> },
>> ]}'
>>
>> I thought DEFINE_PROP_ARRAY would do it, but I can't tell what PropertyInfo
>> implementation I should pass. All of the PropertyInfo implementations I can
>> find use scalar types, or simple text decoding. I am wondering if I am
>> missing
>> some sort of "JSON" encoding capabilities that can happen behind the scenes.
>
> I could have sworn we had an example of how to handle this already,
> but I'm not finding any Device class with a non-scalar property
> that isn't merely an array of scalars.
I found a few:
* TYPE_X86_CPU properties "feature-words" and "filtered-features" have
struct type X86CPUFeatureWordInfo. Defined in target/i386/cpu.c
x86_cpu_initfn().
* TYPE_X86_CPU property "crash-information" has union type
GuestPanicInformation. Defined in target/i386/cpu.c
x86_cpu_common_class_init().
* TYPE_VIRTIO_BLK property "iothread-vq-mapping" has type
IOThreadVirtQueueMappingList, which is a list of struct
IOThreadVirtQueueMapping. Property defined in hw/block/virtio-blk.c
virtio_blk_properties[] using macro
DEFINE_PROP_IOTHREAD_VQ_MAPPING_LIST defined in
qdev-properties-system.[ch].
In case you're curious how I fond them... First, I collected device
help:
$ for i in `upstream-qemu -nodefaults -S -display none -device help | sed -n 's/^name "\([^"]*\)".*/\1/p'`; do upstream-qemu -nodefaults -S -display none -device $i,help; done >dev-help
Then I extracted the type names:
$ sed -n 's/.*=<\([^>]*\)>.*/\1/p' <dev-help | sort -u
Most of them "obviously" name scalars, QOM children or QOM links.
There's also crap like "list". The promising ones are the ones
conforming to QAPI naming rules for types.
Look for them in the schema, drop the enums, and what's left are
non-scalar properties.
Since the type names are whatever the developer made up on the spot, my
search *can* miss non-scalar properties.
I didn't look at targets other than x86_64.
> We definitely have some examples elsewhere for exmaple "Machine" class
> has an SmpCacheProperties array property, and the QAuthZList class
> has an array of "QAuthZListRule" property.
>
> In both cases the struct is defined in th qapi/<blah>.json, which
> auto-generates code eg visit_type_QAuthZListRuleList, which can
> then get called from qauthz_list_prop_get_rules and
> qauthz_list_prop_set_rules, for the property.
>
> Devices use a slightly higher level wrapper so instead of calling
> object_class_property_add directly, then define the PropertyInfo
> and object_class_property_add gets called indirectly for them.
> I'm thinking it should still be possible to use the QAPI code
> generator to help though. You could either just define the struct,
> and thn use that to create PropertyInfo to be used in combination
> with DEFINE_PROP_ARRAY, of you could define a list of structs at
> the QAPI level and use plain DEFINE_PROP. I guess the former is
> probably better aligned with other Device code.
Of the three instances I found, one uses such a qdev property machinery
(what you called "a slightly higher level wrapper"), and two do not.
Not sure what to recommend.
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2024-12-10 9:29 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-17 21:53 [PATCH 0/2] Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
2024-10-17 21:53 ` [PATCH 1/2] ui: Allow injection of vnc display name Roque Arcudia Hernandez
2024-10-21 11:14 ` Marc-André Lureau
2024-10-21 20:03 ` Andrew Keesler
2024-10-22 7:49 ` Marc-André Lureau
2024-10-22 7:55 ` Daniel P. Berrangé
2024-10-22 7:53 ` Daniel P. Berrangé
2024-10-22 8:04 ` Marc-André Lureau
2024-10-22 8:10 ` Daniel P. Berrangé
2024-10-22 8:36 ` Marc-André Lureau
2024-10-28 19:25 ` Andrew Keesler
2024-11-22 14:40 ` Andrew Keesler
2024-10-22 7:14 ` Daniel P. Berrangé
2024-10-17 21:53 ` [PATCH 2/2] hw/display: Allow injection of virtio-gpu EDID name Roque Arcudia Hernandez
2024-11-25 12:04 ` Daniel P. Berrangé
2024-11-25 20:54 ` Andrew Keesler
2024-11-26 16:03 ` Daniel P. Berrangé
2024-11-26 21:07 ` Andrew Keesler
2024-12-02 20:31 ` Andrew Keesler
2024-12-05 16:59 ` Daniel P. Berrangé
2024-12-10 9:27 ` Markus Armbruster
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).