* [Qemu-devel] [PULL 01/15] kbd-state: don't block auto-repeat events
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 02/15] spice: set device address and device display ID in QXL interface Gerd Hoffmann
` (14 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20190220100235.20914-1-kraxel@redhat.com
---
ui/kbd-state.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/ui/kbd-state.c b/ui/kbd-state.c
index ac14add70eab..f3ab2d7a665d 100644
--- a/ui/kbd-state.c
+++ b/ui/kbd-state.c
@@ -42,14 +42,18 @@ void qkbd_state_key_event(QKbdState *kbd, QKeyCode qcode, bool down)
{
bool state = test_bit(qcode, kbd->keys);
- if (state == down) {
+ if (down == false /* got key-up event */ &&
+ state == false /* key is not pressed */) {
/*
- * Filter out events which don't change the keyboard state.
+ * Filter out suspicious key-up events.
*
- * Most notably this allows to simply send along all key-up
- * events, and this function will filter out everything where
- * the corresponding key-down event wasn't send to the guest,
- * for example due to being a host hotkey.
+ * This allows simply sending along all key-up events, and
+ * this function will filter out everything where the
+ * corresponding key-down event wasn't sent to the guest, for
+ * example due to being a host hotkey.
+ *
+ * Note that key-down events on already pressed keys are *not*
+ * suspicious, those are keyboard autorepeat events.
*/
return;
}
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 02/15] spice: set device address and device display ID in QXL interface
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 01/15] kbd-state: don't block auto-repeat events Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 03/15] sdl2: drop qemu_input_event_send_key_qcode call Gerd Hoffmann
` (13 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann,
Lukáš Hrázký
From: Lukáš Hrázký <lhrazky@redhat.com>
Calls the new SPICE QXL interface function spice_qxl_set_device_info to
set the hardware address of the graphics device represented by the QXL
interface (e.g. a PCI path) and the device display IDs (the IDs of the
device's monitors that belong to this QXL interface).
Also stops using the deprecated spice_qxl_set_max_monitors, the new
interface function replaces it.
Signed-off-by: Lukáš Hrázký <lhrazky@redhat.com>
Message-Id: <20190215150919.8263-1-lhrazky@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
include/ui/spice-display.h | 4 ++++
hw/display/qxl.c | 14 ++++++++++++-
ui/spice-core.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
ui/spice-display.c | 11 ++++++++++
4 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h
index 87a84a59d4e0..53c3612c3202 100644
--- a/include/ui/spice-display.h
+++ b/include/ui/spice-display.h
@@ -179,3 +179,7 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd);
void qemu_spice_display_start(void);
void qemu_spice_display_stop(void);
int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd);
+
+bool qemu_spice_fill_device_address(QemuConsole *con,
+ char *device_address,
+ size_t size);
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index da8fd5a40a14..c8ce5781e037 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -276,7 +276,8 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG,
0));
} else {
-#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
+/* >= release 0.12.6, < release 0.14.2 */
+#if SPICE_SERVER_VERSION >= 0x000c06 && SPICE_SERVER_VERSION < 0x000e02
if (qxl->max_outputs) {
spice_qxl_set_max_monitors(&qxl->ssd.qxl, qxl->max_outputs);
}
@@ -2188,6 +2189,17 @@ static void qxl_realize_common(PCIQXLDevice *qxl, Error **errp)
SPICE_INTERFACE_QXL_MAJOR, SPICE_INTERFACE_QXL_MINOR);
return;
}
+
+#if SPICE_SERVER_VERSION >= 0x000e02 /* release 0.14.2 */
+ char device_address[256] = "";
+ if (qemu_spice_fill_device_address(qxl->vga.con, device_address, 256)) {
+ spice_qxl_set_device_info(&qxl->ssd.qxl,
+ device_address,
+ 0,
+ qxl->max_outputs);
+ }
+#endif
+
qemu_add_vm_change_state_handler(qxl_vm_change_state_handler, qxl);
qxl->update_irq = qemu_bh_new(qxl_update_irq_bh, qxl);
diff --git a/ui/spice-core.c b/ui/spice-core.c
index a40fb2c00dab..37fae3c42405 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -34,6 +34,7 @@
#include "qemu/option.h"
#include "migration/misc.h"
#include "hw/hw.h"
+#include "hw/pci/pci_bus.h"
#include "ui/spice-display.h"
/* core bits */
@@ -863,6 +864,56 @@ bool qemu_spice_have_display_interface(QemuConsole *con)
return false;
}
+/*
+ * Recursively (in reverse order) appends addresses of PCI devices as it moves
+ * up in the PCI hierarchy.
+ *
+ * @returns true on success, false when the buffer wasn't large enough
+ */
+static bool append_pci_address(char *buf, size_t buf_size, const PCIDevice *pci)
+{
+ PCIBus *bus = pci_get_bus(pci);
+ /*
+ * equivalent to if (!pci_bus_is_root(bus)), but the function is not built
+ * with PCI_CONFIG=n, avoid using an #ifdef by checking directly
+ */
+ if (bus->parent_dev != NULL) {
+ append_pci_address(buf, buf_size, bus->parent_dev);
+ }
+
+ size_t len = strlen(buf);
+ ssize_t written = snprintf(buf + len, buf_size - len, "/%02x.%x",
+ PCI_SLOT(pci->devfn), PCI_FUNC(pci->devfn));
+
+ return written > 0 && written < buf_size - len;
+}
+
+bool qemu_spice_fill_device_address(QemuConsole *con,
+ char *device_address,
+ size_t size)
+{
+ DeviceState *dev = DEVICE(object_property_get_link(OBJECT(con),
+ "device",
+ &error_abort));
+ PCIDevice *pci = (PCIDevice *) object_dynamic_cast(OBJECT(dev),
+ TYPE_PCI_DEVICE);
+
+ if (pci == NULL) {
+ warn_report("Setting device address of a display device to SPICE: "
+ "Not a PCI device.");
+ return false;
+ }
+
+ strncpy(device_address, "pci/0000", size);
+ if (!append_pci_address(device_address, size, pci)) {
+ warn_report("Setting device address of a display device to SPICE: "
+ "Too many PCI devices in the chain.");
+ return false;
+ }
+
+ return true;
+}
+
int qemu_spice_add_display_interface(QXLInstance *qxlin, QemuConsole *con)
{
if (g_slist_find(spice_consoles, con)) {
diff --git a/ui/spice-display.c b/ui/spice-display.c
index aea6f6ebceda..a5e26479a866 100644
--- a/ui/spice-display.c
+++ b/ui/spice-display.c
@@ -1147,6 +1147,17 @@ static void qemu_spice_display_init_one(QemuConsole *con)
ssd->qxl.base.sif = &dpy_interface.base;
qemu_spice_add_display_interface(&ssd->qxl, con);
+
+#if SPICE_SERVER_VERSION >= 0x000e02 /* release 0.14.2 */
+ char device_address[256] = "";
+ if (qemu_spice_fill_device_address(con, device_address, 256)) {
+ spice_qxl_set_device_info(&ssd->qxl,
+ device_address,
+ qemu_console_get_head(con),
+ 1);
+ }
+#endif
+
qemu_spice_create_host_memslot(ssd);
register_displaychangelistener(&ssd->dcl);
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 03/15] sdl2: drop qemu_input_event_send_key_qcode call
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 01/15] kbd-state: don't block auto-repeat events Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 02/15] spice: set device address and device display ID in QXL interface Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 04/15] ui/gtk: Fix the license information Gerd Hoffmann
` (12 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
qkbd_state_key_event() does that for us.
Fixes: 07333e1ca3 kbd-state: use state tracker for sdl2
Reported-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: BALATON Zoltan <balaton@eik.bme.hu>
Message-id: 20190208072744.10687-1-kraxel@redhat.com
---
ui/sdl2-input.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c
index 664364a5e5be..fb345f45fb28 100644
--- a/ui/sdl2-input.c
+++ b/ui/sdl2-input.c
@@ -54,8 +54,5 @@ void sdl2_process_key(struct sdl2_console *scon,
break;
}
}
- } else {
- qemu_input_event_send_key_qcode(con, qcode,
- ev->type == SDL_KEYDOWN);
}
}
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 04/15] ui/gtk: Fix the license information
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (2 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 03/15] sdl2: drop qemu_input_event_send_key_qcode call Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 05/15] char/spice: trigger HUP event Gerd Hoffmann
` (11 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann, Thomas Huth
From: Thomas Huth <thuth@redhat.com>
The license information in this file is very messy. A short note at
the beginning says GPL first, but the long boilerplate code then
talks about "GNU Lesser General Public License version 2.0". First,
there is no such version of the "GNU Lesser GPL", it only started with
version 2.1. In version 2.0, it was still called "GNU Library GPL"
instead. Second, you can easily get the license of this file wrong
if you only quickly glance at the long boilerplate code.
Anyway, looking at the text of the LGPL (see COPYING.LIB in the top
directory), the license clearly states in section "3." that one should
rather replace the license information with the GPL information in
such a case of a mixture instead. Thus let's clean up the confusing
statements and use the proper GPL text only.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 1550731902-28842-1-git-send-email-thuth@redhat.com
[ kraxel: s/v2/v2+/ as requested by Daniel ]
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/gtk.c | 30 +++++++++++++-----------------
1 file changed, 13 insertions(+), 17 deletions(-)
diff --git a/ui/gtk.c b/ui/gtk.c
index 949b143e4e4e..e96e15435a2f 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -6,29 +6,25 @@
* Authors:
* Anthony Liguori <aliguori@us.ibm.com>
*
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * Portions from gtk-vnc:
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Portions from gtk-vnc (originally licensed under the LGPL v2+):
*
* GTK VNC Widget
*
* Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
* Copyright (C) 2009-2010 Daniel P. Berrange <dan@berrange.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.0 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define GETTEXT_PACKAGE "qemu"
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 05/15] char/spice: trigger HUP event
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (3 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 04/15] ui/gtk: Fix the license information Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 06/15] char/spice: discard write() if backend is disconnected Gerd Hoffmann
` (10 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Inform the front-end of disconnected state (spice client
disconnected).
This will wakeup the source handler immediately, so it can detect the
disconnection asap.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-2-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
chardev/spice.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/chardev/spice.c b/chardev/spice.c
index 173c257949c0..c2baeb5461fa 100644
--- a/chardev/spice.c
+++ b/chardev/spice.c
@@ -148,15 +148,25 @@ static void vmc_unregister_interface(SpiceChardev *scd)
static gboolean spice_char_source_prepare(GSource *source, gint *timeout)
{
SpiceCharSource *src = (SpiceCharSource *)source;
+ Chardev *chr = CHARDEV(src->scd);
*timeout = -1;
+ if (!chr->be_open) {
+ return true;
+ }
+
return !src->scd->blocked;
}
static gboolean spice_char_source_check(GSource *source)
{
SpiceCharSource *src = (SpiceCharSource *)source;
+ Chardev *chr = CHARDEV(src->scd);
+
+ if (!chr->be_open) {
+ return true;
+ }
return !src->scd->blocked;
}
@@ -164,9 +174,12 @@ static gboolean spice_char_source_check(GSource *source)
static gboolean spice_char_source_dispatch(GSource *source,
GSourceFunc callback, gpointer user_data)
{
+ SpiceCharSource *src = (SpiceCharSource *)source;
+ Chardev *chr = CHARDEV(src->scd);
GIOFunc func = (GIOFunc)callback;
+ GIOCondition cond = chr->be_open ? G_IO_OUT : G_IO_HUP;
- return func(NULL, G_IO_OUT, user_data);
+ return func(NULL, cond, user_data);
}
static GSourceFuncs SpiceCharSourceFuncs = {
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 06/15] char/spice: discard write() if backend is disconnected
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (4 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 05/15] char/spice: trigger HUP event Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 07/15] spice: avoid spice runtime assert Gerd Hoffmann
` (9 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Most chardev backend handle write() as discarded data if underlying
system is disconnected. For unknown historical reasons, the Spice
backend has "reliable" write: it will wait until the client end is
reconnected to do further successful write().
To decide whether it make sense to wait until the client is
reconnected (or queue the writes), let's review Spice chardev usage
and handling of a disconnected client:
* spice vdagent
The agents reopen the virtio port on disconnect. In qemu side,
virtio_serial_close() will also discard pending data.
* usb redirection
A disconnect creates a device disconnection.
* smartcard emulation
Data is discarded in passthru_apdu_from_guest().
(Spice doesn't explicitly open the smartcard char device until
upcoming 0.14.2, commit 69a5cfc74131ec0459f2eb5a231139f5a69a8037)
* spice webdavd
The daemon will restart the service, and reopen the virtio port.
* spice ports (serial console, qemu monitor..)
Depends on the associated device or usage.
- serial, may be throttled or discarded on write, depending on
device
- QMP/HMP monitor have some CLOSED event handling, but want to
flush the write, which will finish when a new client connects.
On disconnect/reconnect, the client starts with fresh sessions. If it
is a seamless migration, the client disconnects after the source
migrated. The handling of source disconnect in qemu is thus irrelevant
for the Spice session migration.
For all these use cases, it is better to discard writes when the
client is disconnected, and require the vm-side device/agent to behave
correctly on CHR_EVENT_CLOSED, to stop reading and writing from
the spice chardev.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-3-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
chardev/spice.c | 12 ++++++++++++
chardev/trace-events | 1 +
2 files changed, 13 insertions(+)
diff --git a/chardev/spice.c b/chardev/spice.c
index c2baeb5461fa..c68e60115bb1 100644
--- a/chardev/spice.c
+++ b/chardev/spice.c
@@ -208,6 +208,12 @@ static int spice_chr_write(Chardev *chr, const uint8_t *buf, int len)
int read_bytes;
assert(s->datalen == 0);
+
+ if (!chr->be_open) {
+ trace_spice_chr_discard_write(len);
+ return len;
+ }
+
s->datapos = buf;
s->datalen = len;
spice_server_char_device_wakeup(&s->sin);
@@ -300,6 +306,12 @@ static void qemu_chr_open_spice_vmc(Chardev *chr,
}
*be_opened = false;
+#if SPICE_SERVER_VERSION < 0x000e02
+ /* Spice < 0.14.2 doesn't explicitly open smartcard chardev */
+ if (strcmp(type, "smartcard") == 0) {
+ *be_opened = true;
+ }
+#endif
chr_open(chr, type);
}
diff --git a/chardev/trace-events b/chardev/trace-events
index d0e5f3bbc1a7..b8a759634420 100644
--- a/chardev/trace-events
+++ b/chardev/trace-events
@@ -10,6 +10,7 @@ wct_cmd_other(const char *cmd) "%s"
wct_speed(int speed) "%d"
# chardev/spice.c
+spice_chr_discard_write(int len) "spice chr write discarded %d"
spice_vmc_write(ssize_t out, int len) "spice wrote %zd of requested %d"
spice_vmc_read(int bytes, int len) "spice read %d of requested %d"
spice_vmc_register_interface(void *scd) "spice vmc registered interface %p"
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 07/15] spice: avoid spice runtime assert
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (5 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 06/15] char/spice: discard write() if backend is disconnected Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 08/15] spice: merge options lists Gerd Hoffmann
` (8 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The Spice server doesn't like to be started or stopped twice . It
aborts with:
(process:6191): Spice-ERROR **: 19:29:35.912: red-worker.c:623:handle_dev_start: assertion `!worker->running' failed
It's easy to avoid that situation since qemu spice_display_is_running
tracks the server state.
After the commit "spice: do not stop spice if VM is paused", it will
be possible to pause and resume the VM, and this will call
qemu_spice_display_start() twice. The easiest is to add a check for
spice_display_is_running with this patch to avoid the assert.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-4-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/spice-core.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 37fae3c42405..784fddff7d45 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -972,12 +972,20 @@ int qemu_spice_display_add_client(int csock, int skipauth, int tls)
void qemu_spice_display_start(void)
{
+ if (spice_display_is_running) {
+ return;
+ }
+
spice_display_is_running = true;
spice_server_vm_start(spice_server);
}
void qemu_spice_display_stop(void)
{
+ if (!spice_display_is_running) {
+ return;
+ }
+
spice_server_vm_stop(spice_server);
spice_display_is_running = false;
}
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 08/15] spice: merge options lists
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (6 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 07/15] spice: avoid spice runtime assert Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 09/15] spice: do not stop spice if VM is paused Gerd Hoffmann
` (7 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Passing several -spice options to qemu command line, or calling
several time qemu_opts_set() will ignore all but the first option
list. Since the spice server is a singleton, it makes sense to merge
all the options, the last value being the one taken into account.
This changes the behaviour from, for ex:
$ qemu... -spice port=5900 -spice port=5901 -> port: 5900
to:
$ qemu... -spice port=5900 -spice port=5901 -> port: 5901
(if necessary we could instead produce an error when an option is
given twice, although this makes handling default values and such more
complicated)
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-5-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/spice-core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 784fddff7d45..1cc996027719 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -398,6 +398,7 @@ static SpiceChannelList *qmp_query_spice_channels(void)
static QemuOptsList qemu_spice_opts = {
.name = "spice",
.head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head),
+ .merge_lists = true,
.desc = {
{
.name = "port",
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 09/15] spice: do not stop spice if VM is paused
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (7 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 08/15] spice: merge options lists Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 10/15] char: move SpiceChardev and open_spice_port() to spice.h header Gerd Hoffmann
` (6 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
spice_server_vm_start/stop() was added to help migration state (commit
f5bb039c6d97ef3e664094eab3c9a4dc1824ed73).
However, a paused VM could keep running the spice server. This will
allow a Spice client to keep sending commands to a spice chardev. This
allows to stop/cont a VM from a Spice monitor port. Character
devices (vdagent/usb/smartcard/..) should not read from Spice when the
VM is paused.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-6-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/spice-core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 1cc996027719..4d384974ca34 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -628,7 +628,7 @@ static void vm_change_state_handler(void *opaque, int running,
{
if (running) {
qemu_spice_display_start();
- } else {
+ } else if (state != RUN_STATE_PAUSED) {
qemu_spice_display_stop();
}
}
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 10/15] char: move SpiceChardev and open_spice_port() to spice.h header
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (8 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 09/15] spice: do not stop spice if VM is paused Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 11/15] char: register spice ports after spice started Gerd Hoffmann
` (5 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
This will allow easier subclassing of SpiceChardev, in upcoming
"display: add -display spice-app launching external application"
patch.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-7-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
include/chardev/spice.h | 27 +++++++++++++++++++++++++++
chardev/spice.c | 28 +++++-----------------------
2 files changed, 32 insertions(+), 23 deletions(-)
create mode 100644 include/chardev/spice.h
diff --git a/include/chardev/spice.h b/include/chardev/spice.h
new file mode 100644
index 000000000000..6431da320599
--- /dev/null
+++ b/include/chardev/spice.h
@@ -0,0 +1,27 @@
+#ifndef CHARDEV_SPICE_H_
+#define CHARDEV_SPICE_H_
+
+#include <spice.h>
+#include "chardev/char-fe.h"
+
+typedef struct SpiceChardev {
+ Chardev parent;
+
+ SpiceCharDeviceInstance sin;
+ bool active;
+ bool blocked;
+ const uint8_t *datapos;
+ int datalen;
+ QLIST_ENTRY(SpiceChardev) next;
+} SpiceChardev;
+
+#define TYPE_CHARDEV_SPICE "chardev-spice"
+#define TYPE_CHARDEV_SPICEVMC "chardev-spicevmc"
+#define TYPE_CHARDEV_SPICEPORT "chardev-spiceport"
+
+#define SPICE_CHARDEV(obj) OBJECT_CHECK(SpiceChardev, (obj), TYPE_CHARDEV_SPICE)
+
+void qemu_chr_open_spice_port(Chardev *chr, ChardevBackend *backend,
+ bool *be_opened, Error **errp);
+
+#endif
diff --git a/chardev/spice.c b/chardev/spice.c
index c68e60115bb1..2202d50eee1e 100644
--- a/chardev/spice.c
+++ b/chardev/spice.c
@@ -2,30 +2,12 @@
#include "trace.h"
#include "ui/qemu-spice.h"
#include "chardev/char.h"
+#include "chardev/spice.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
#include "qemu/option.h"
-#include <spice.h>
#include <spice/protocol.h>
-
-typedef struct SpiceChardev {
- Chardev parent;
-
- SpiceCharDeviceInstance sin;
- bool active;
- bool blocked;
- const uint8_t *datapos;
- int datalen;
- QLIST_ENTRY(SpiceChardev) next;
-} SpiceChardev;
-
-#define TYPE_CHARDEV_SPICE "chardev-spice"
-#define TYPE_CHARDEV_SPICEVMC "chardev-spicevmc"
-#define TYPE_CHARDEV_SPICEPORT "chardev-spiceport"
-
-#define SPICE_CHARDEV(obj) OBJECT_CHECK(SpiceChardev, (obj), TYPE_CHARDEV_SPICE)
-
typedef struct SpiceCharSource {
GSource source;
SpiceChardev *scd;
@@ -315,10 +297,10 @@ static void qemu_chr_open_spice_vmc(Chardev *chr,
chr_open(chr, type);
}
-static void qemu_chr_open_spice_port(Chardev *chr,
- ChardevBackend *backend,
- bool *be_opened,
- Error **errp)
+void qemu_chr_open_spice_port(Chardev *chr,
+ ChardevBackend *backend,
+ bool *be_opened,
+ Error **errp)
{
ChardevSpicePort *spiceport = backend->u.spiceport.data;
const char *name = spiceport->fqdn;
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 11/15] char: register spice ports after spice started
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (9 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 10/15] char: move SpiceChardev and open_spice_port() to spice.h header Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 12/15] build-sys: add gio-2.0 check Gerd Hoffmann
` (4 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Spice port registration is delayed until the server is started. But
ports created after are not being registered. If the server is already
started, do vmc_register_interface() to register it from
qemu_chr_open_spice_port().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-8-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
chardev/spice.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/chardev/spice.c b/chardev/spice.c
index 2202d50eee1e..22c30ae833dd 100644
--- a/chardev/spice.c
+++ b/chardev/spice.c
@@ -316,6 +316,11 @@ void qemu_chr_open_spice_port(Chardev *chr,
*be_opened = false;
s = SPICE_CHARDEV(chr);
s->sin.portname = g_strdup(name);
+
+ if (using_spice) {
+ /* spice server already created */
+ vmc_register_interface(s);
+ }
}
void qemu_spice_register_ports(void)
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 12/15] build-sys: add gio-2.0 check
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (10 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 11/15] char: register spice ports after spice started Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 13/15] qapi: document DisplayType enum Gerd Hoffmann
` (3 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
GIO is required for the "-display spice-app" backend.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-9-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
configure | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/configure b/configure
index a61682c3c727..05d72f1c565b 100755
--- a/configure
+++ b/configure
@@ -3503,6 +3503,14 @@ for i in $glib_modules; do
fi
done
+if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
+ gio=yes
+ gio_cflags=$($pkg_config --cflags gio-2.0)
+ gio_libs=$($pkg_config --libs gio-2.0)
+else
+ gio=no
+fi
+
# Sanity check that the current size_t matches the
# size that glib thinks it should be. This catches
# problems on multi-arch where people try to build
@@ -6520,6 +6528,11 @@ if test "$gtk" = "yes" ; then
echo "CONFIG_GTK_GL=y" >> $config_host_mak
fi
fi
+if test "$gio" = "yes" ; then
+ echo "CONFIG_GIO=y" >> $config_host_mak
+ echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
+ echo "GIO_LIBS=$gio_libs" >> $config_host_mak
+fi
echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
if test "$gnutls" = "yes" ; then
echo "CONFIG_GNUTLS=y" >> $config_host_mak
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 13/15] qapi: document DisplayType enum
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (11 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 12/15] build-sys: add gio-2.0 check Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 14/15] spice: use a default name for the server Gerd Hoffmann
` (2 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-10-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
qapi/ui.json | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/qapi/ui.json b/qapi/ui.json
index 7d9c4bddaf12..7702ddf583a1 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
@@ -1085,6 +1085,31 @@
#
# Display (user interface) type.
#
+# @default: The default user interface, selecting from the first available
+# of gtk, sdl, cocoa, and vnc.
+#
+# @none: No user interface or video output display. The guest will
+# still see an emulated graphics card, but its output will not
+# be displayed to the QEMU user.
+#
+# @gtk: The GTK user interface.
+#
+# @sdl: The SDL user interface.
+#
+# @egl-headless: No user interface, offload GL operations to a local
+# DRI device. Graphical display need to be paired with
+# VNC or Spice. (Since 3.1)
+#
+# @curses: Display video output via curses. For graphics device
+# models which support a text mode, QEMU can display this
+# output using a curses/ncurses interface. Nothing is
+# displayed when the graphics device is in graphical mode or
+# if the graphics device does not support a text
+# mode. Generally only the VGA device models support text
+# mode.
+#
+# @cocoa: The Cocoa user interface.
+#
# Since: 2.12
#
##
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 14/15] spice: use a default name for the server
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (12 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 13/15] qapi: document DisplayType enum Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-22 7:53 ` [Qemu-devel] [PULL 15/15] display: add -display spice-app launching a Spice client Gerd Hoffmann
2019-02-25 12:48 ` [Qemu-devel] [PULL 00/15] Ui 20190222 patches Peter Maydell
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
If no -name is given, let's use a friendly "QEMU version" server
name. This is sometime exposed on spice client side, for example on
remote-viewer title.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-11-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/spice-core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 4d384974ca34..0632c74e9fcb 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -785,7 +785,7 @@ void qemu_spice_init(void)
qemu_opt_foreach(opts, add_channel, &tls_port, &error_fatal);
- spice_server_set_name(spice_server, qemu_name);
+ spice_server_set_name(spice_server, qemu_name ?: "QEMU " QEMU_VERSION);
spice_server_set_uuid(spice_server, (unsigned char *)&qemu_uuid);
seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0);
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PULL 15/15] display: add -display spice-app launching a Spice client
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (13 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 14/15] spice: use a default name for the server Gerd Hoffmann
@ 2019-02-22 7:53 ` Gerd Hoffmann
2019-02-25 12:48 ` [Qemu-devel] [PULL 00/15] Ui 20190222 patches Peter Maydell
15 siblings, 0 replies; 17+ messages in thread
From: Gerd Hoffmann @ 2019-02-22 7:53 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Eric Blake, Marc-André Lureau,
Markus Armbruster, Gerd Hoffmann
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a new display backend that will configure Spice to allow a remote
client to control QEMU in a similar fashion as other QEMU display
backend/UI like GTK.
For this to work, it will set up Spice server with a unix socket, and
register a VC chardev that will be exposed as Spice ports. A QMP
monitor is also exposed as a Spice port, this allows the remote client
fuller qemu control and state handling.
- doesn't handle VC set_echo() - this doesn't seem a strong
requirement, very few front-end use it
- spice options can be tweaked with other -spice arguments
- Windows support shouldn't be hard to do, but will probably use a TCP
port instead
- we may want to watch the child process to quit automatically if it
crashed
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Victor Toso <victortoso@redhat.com>
Message-id: 20190221110703.5775-12-marcandre.lureau@redhat.com
[ kraxel: squash incremental fix ]
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/spice-app.c | 202 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
qapi/ui.json | 7 +-
qemu-options.hx | 5 ++
ui/Makefile.objs | 5 ++
4 files changed, 218 insertions(+), 1 deletion(-)
create mode 100644 ui/spice-app.c
diff --git a/ui/spice-app.c b/ui/spice-app.c
new file mode 100644
index 000000000000..925b27b708bb
--- /dev/null
+++ b/ui/spice-app.c
@@ -0,0 +1,202 @@
+/*
+ * QEMU external Spice client display driver
+ *
+ * Copyright (c) 2018 Marc-André Lureau <marcandre.lureau@redhat.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "qemu/osdep.h"
+
+#include <gio/gio.h>
+
+#include "qemu-common.h"
+#include "ui/console.h"
+#include "qemu/config-file.h"
+#include "qemu/option.h"
+#include "qemu/cutils.h"
+#include "qapi/error.h"
+#include "io/channel-command.h"
+#include "chardev/spice.h"
+#include "sysemu/sysemu.h"
+
+static const char *tmp_dir;
+static char *app_dir;
+static char *sock_path;
+
+typedef struct VCChardev {
+ SpiceChardev parent;
+} VCChardev;
+
+#define TYPE_CHARDEV_VC "chardev-vc"
+#define VC_CHARDEV(obj) OBJECT_CHECK(VCChardev, (obj), TYPE_CHARDEV_VC)
+
+static ChardevBackend *
+chr_spice_backend_new(void)
+{
+ ChardevBackend *be = g_new0(ChardevBackend, 1);
+
+ be->type = CHARDEV_BACKEND_KIND_SPICEPORT;
+ be->u.spiceport.data = g_new0(ChardevSpicePort, 1);
+
+ return be;
+}
+
+static void vc_chr_open(Chardev *chr,
+ ChardevBackend *backend,
+ bool *be_opened,
+ Error **errp)
+{
+ ChardevBackend *be;
+ const char *fqdn = NULL;
+
+ if (strstart(chr->label, "serial", NULL)) {
+ fqdn = "org.qemu.console.serial.0";
+ } else if (strstart(chr->label, "parallel", NULL)) {
+ fqdn = "org.qemu.console.parallel.0";
+ } else if (strstart(chr->label, "compat_monitor", NULL)) {
+ fqdn = "org.qemu.monitor.hmp.0";
+ }
+
+ be = chr_spice_backend_new();
+ be->u.spiceport.data->fqdn = fqdn ?
+ g_strdup(fqdn) : g_strdup_printf("org.qemu.console.%s", chr->label);
+ qemu_chr_open_spice_port(chr, be, be_opened, errp);
+ qapi_free_ChardevBackend(be);
+}
+
+static void vc_chr_set_echo(Chardev *chr, bool echo)
+{
+ /* TODO: set echo for frontends QMP and qtest */
+}
+
+static void char_vc_class_init(ObjectClass *oc, void *data)
+{
+ ChardevClass *cc = CHARDEV_CLASS(oc);
+
+ cc->parse = qemu_chr_parse_vc;
+ cc->open = vc_chr_open;
+ cc->chr_set_echo = vc_chr_set_echo;
+}
+
+static const TypeInfo char_vc_type_info = {
+ .name = TYPE_CHARDEV_VC,
+ .parent = TYPE_CHARDEV_SPICEPORT,
+ .instance_size = sizeof(VCChardev),
+ .class_init = char_vc_class_init,
+};
+
+static void spice_app_atexit(void)
+{
+ if (sock_path) {
+ unlink(sock_path);
+ }
+ if (tmp_dir) {
+ rmdir(tmp_dir);
+ }
+ g_free(sock_path);
+ g_free(app_dir);
+}
+
+static void spice_app_display_early_init(DisplayOptions *opts)
+{
+ QemuOpts *qopts;
+ ChardevBackend *be = chr_spice_backend_new();
+ GError *err = NULL;
+
+ if (opts->has_full_screen) {
+ error_report("spice-app full-screen isn't supported yet.");
+ exit(1);
+ }
+ if (opts->has_window_close) {
+ error_report("spice-app window-close isn't supported yet.");
+ exit(1);
+ }
+
+ atexit(spice_app_atexit);
+
+ if (qemu_name) {
+ app_dir = g_build_filename(g_get_user_runtime_dir(),
+ "qemu", qemu_name, NULL);
+ if (g_mkdir_with_parents(app_dir, S_IRWXU) < -1) {
+ error_report("Failed to create directory %s: %s",
+ app_dir, strerror(errno));
+ exit(1);
+ }
+ } else {
+ app_dir = g_dir_make_tmp(NULL, &err);
+ tmp_dir = app_dir;
+ if (err) {
+ error_report("Failed to create temporary directory: %s",
+ err->message);
+ exit(1);
+ }
+ }
+
+ type_register(&char_vc_type_info);
+
+ sock_path = g_strjoin("", app_dir, "/", "spice.sock", NULL);
+ qopts = qemu_opts_create(qemu_find_opts("spice"), NULL, 0, &error_abort);
+ qemu_opt_set(qopts, "disable-ticketing", "on", &error_abort);
+ qemu_opt_set(qopts, "unix", "on", &error_abort);
+ qemu_opt_set(qopts, "addr", sock_path, &error_abort);
+ qemu_opt_set(qopts, "image-compression", "off", &error_abort);
+ qemu_opt_set(qopts, "streaming-video", "off", &error_abort);
+ qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
+ display_opengl = opts->has_gl;
+
+ be->u.spiceport.data->fqdn = g_strdup("org.qemu.monitor.qmp.0");
+ qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
+ be, NULL, &error_abort);
+ qopts = qemu_opts_create(qemu_find_opts("mon"),
+ NULL, 0, &error_fatal);
+ qemu_opt_set(qopts, "chardev", "org.qemu.monitor.qmp", &error_abort);
+ qemu_opt_set(qopts, "mode", "control", &error_abort);
+
+ qapi_free_ChardevBackend(be);
+}
+
+static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
+{
+ GError *err = NULL;
+ gchar *uri;
+
+ uri = g_strjoin("", "spice+unix://", app_dir, "/", "spice.sock", NULL);
+ info_report("Launching display with URI: %s", uri);
+ g_app_info_launch_default_for_uri(uri, NULL, &err);
+ if (err) {
+ error_report("Failed to launch %s URI: %s", uri, err->message);
+ error_report("You need a capable Spice client, "
+ "such as virt-viewer 8.0");
+ exit(1);
+ }
+ g_free(uri);
+}
+
+static QemuDisplay qemu_display_spice_app = {
+ .type = DISPLAY_TYPE_SPICE_APP,
+ .early_init = spice_app_display_early_init,
+ .init = spice_app_display_init,
+};
+
+static void register_spice_app(void)
+{
+ qemu_display_register(&qemu_display_spice_app);
+}
+
+type_init(register_spice_app);
diff --git a/qapi/ui.json b/qapi/ui.json
index 7702ddf583a1..c5d1d7f09966 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
@@ -1110,12 +1110,17 @@
#
# @cocoa: The Cocoa user interface.
#
+# @spice-app: Set up a Spice server and run the default associated
+# application to connect to it. The server will redirect
+# the serial console and QEMU monitors. (Since 4.0)
+#
# Since: 2.12
#
##
{ 'enum' : 'DisplayType',
'data' : [ 'default', 'none', 'gtk', 'sdl',
- 'egl-headless', 'curses', 'cocoa' ] }
+ 'egl-headless', 'curses', 'cocoa',
+ 'spice-app'] }
##
# @DisplayOptions:
diff --git a/qemu-options.hx b/qemu-options.hx
index 77bd98e20b14..c843126ebdeb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1211,6 +1211,7 @@ STEXI
ETEXI
DEF("display", HAS_ARG, QEMU_OPTION_display,
+ "-display spice-app[,gl=on|off]\n"
"-display sdl[,frame=on|off][,alt_grab=on|off][,ctrl_grab=on|off]\n"
" [,window_close=on|off][,gl=on|core|es|off]\n"
"-display gtk[,grab_on_hover=on|off][,gl=on|off]|\n"
@@ -1262,6 +1263,10 @@ Start a VNC server on display <arg>
@item egl-headless
Offload all OpenGL operations to a local DRI device. For any graphical display,
this display needs to be paired with either VNC or SPICE displays.
+@item spice-app
+Start QEMU as a Spice server and launch the default Spice client
+application. The Spice server will redirect the serial consoles and
+QEMU monitors. (Since 4.0)
@end table
ETEXI
diff --git a/ui/Makefile.objs b/ui/Makefile.objs
index 7f8b3da79134..fe1a7aed97c2 100644
--- a/ui/Makefile.objs
+++ b/ui/Makefile.objs
@@ -49,6 +49,11 @@ curses.mo-objs := curses.o
curses.mo-cflags := $(CURSES_CFLAGS)
curses.mo-libs := $(CURSES_LIBS)
+common-obj-$(call land,$(CONFIG_SPICE),$(CONFIG_GIO)) += spice-app.mo
+spice-app.mo-objs := spice-app.o
+spice-app.mo-cflags := $(GIO_CFLAGS)
+spice-app.mo-libs := $(GIO_LIBS)
+
common-obj-$(CONFIG_OPENGL) += shader.o
common-obj-$(CONFIG_OPENGL) += console-gl.o
common-obj-$(CONFIG_OPENGL) += egl-helpers.o
--
2.9.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PULL 00/15] Ui 20190222 patches
2019-02-22 7:53 [Qemu-devel] [PULL 00/15] Ui 20190222 patches Gerd Hoffmann
` (14 preceding siblings ...)
2019-02-22 7:53 ` [Qemu-devel] [PULL 15/15] display: add -display spice-app launching a Spice client Gerd Hoffmann
@ 2019-02-25 12:48 ` Peter Maydell
15 siblings, 0 replies; 17+ messages in thread
From: Peter Maydell @ 2019-02-25 12:48 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: QEMU Developers, Paolo Bonzini, Markus Armbruster,
Marc-André Lureau
On Fri, 22 Feb 2019 at 07:55, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> The following changes since commit 2e68b8620637a4ee8c79b5724144b726af1e261b:
>
> Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-4.0-20190219' into staging (2019-02-18 16:20:13 +0000)
>
> are available in the git repository at:
>
> git://git.kraxel.org/qemu tags/ui-20190222-pull-request
>
> for you to fetch changes up to d8aec9d9f129e6879ae0669623981892deff86f2:
>
> display: add -display spice-app launching a Spice client (2019-02-22 07:42:59 +0100)
>
> ----------------------------------------------------------------
> ui: add support for -display spice-app
> ui: gtk+sdl bugfixes.
>
> ----------------------------------------------------------------
>
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/4.0
for any user-visible changes.
-- PMM
^ permalink raw reply [flat|nested] 17+ messages in thread