Rebase to qemu-2.8.0-rc3
This commit is contained in:
parent
8288677cfa
commit
50bb158a7a
@ -1,106 +0,0 @@
|
||||
From d1fd2760ce6025f55b7c71ca303d49afbf17ad8e Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <d1fd2760ce6025f55b7c71ca303d49afbf17ad8e.1480901031.git.crobinso@redhat.com>
|
||||
From: Christophe Fergeau <cfergeau@redhat.com>
|
||||
Date: Fri, 28 Oct 2016 16:48:40 +0200
|
||||
Subject: [PATCH] qxl: Only emit QXL_INTERRUPT_CLIENT_MONITORS_CONFIG on config
|
||||
changes
|
||||
|
||||
Currently if the client keeps sending the same monitor config to
|
||||
QEMU/spice-server, QEMU will always raise
|
||||
a QXL_INTERRUPT_CLIENT_MONITORS_CONFIG regardless of whether there was a
|
||||
change or not.
|
||||
Guest-side (with fedora 25), the kernel QXL KMS driver will also forward the
|
||||
event to user-space without checking if there were actual changes.
|
||||
Next in line are gnome-shell/mutter (on a default f25 install), which
|
||||
will try to reconfigure everything without checking if there is anything
|
||||
to do.
|
||||
Where this gets ugly is that when applying the resolution changes,
|
||||
gnome-shell/mutter will call drmModeRmFB, drmModeAddFB, and
|
||||
drmModeSetCrtc, which will cause the primary surface to be destroyed and
|
||||
recreated by the QXL KMS driver. This in turn will cause the client to
|
||||
resend a client monitors config message, which will cause QEMU to reemit
|
||||
an interrupt with an unchanged monitors configuration, ...
|
||||
This causes https://bugzilla.redhat.com/show_bug.cgi?id=1266484
|
||||
|
||||
This commit makes sure that we only emit
|
||||
QXL_INTERRUPT_CLIENT_MONITORS_CONFIG when there are actual configuration
|
||||
changes the guest should act on.
|
||||
|
||||
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
hw/display/qxl.c | 37 ++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 36 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||
index 0e2682d..62d0c80 100644
|
||||
--- a/hw/display/qxl.c
|
||||
+++ b/hw/display/qxl.c
|
||||
@@ -992,6 +992,34 @@ static uint32_t qxl_crc32(const uint8_t *p, unsigned len)
|
||||
return crc32(0xffffffff, p, len) ^ 0xffffffff;
|
||||
}
|
||||
|
||||
+static bool qxl_rom_monitors_config_changed(QXLRom *rom,
|
||||
+ VDAgentMonitorsConfig *monitors_config,
|
||||
+ unsigned int max_outputs)
|
||||
+{
|
||||
+ int i;
|
||||
+ unsigned int monitors_count;
|
||||
+
|
||||
+ monitors_count = MIN(monitors_config->num_of_monitors, max_outputs);
|
||||
+
|
||||
+ if (rom->client_monitors_config.count != monitors_count) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0 ; i < rom->client_monitors_config.count ; ++i) {
|
||||
+ VDAgentMonConfig *monitor = &monitors_config->monitors[i];
|
||||
+ QXLURect *rect = &rom->client_monitors_config.heads[i];
|
||||
+ /* monitor->depth ignored */
|
||||
+ if ((rect->left != monitor->x) ||
|
||||
+ (rect->top != monitor->y) ||
|
||||
+ (rect->right != monitor->x + monitor->width) ||
|
||||
+ (rect->bottom != monitor->y + monitor->height)) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
/* called from main context only */
|
||||
static int interface_client_monitors_config(QXLInstance *sin,
|
||||
VDAgentMonitorsConfig *monitors_config)
|
||||
@@ -1000,6 +1028,7 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
||||
QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar);
|
||||
int i;
|
||||
unsigned max_outputs = ARRAY_SIZE(rom->client_monitors_config.heads);
|
||||
+ bool config_changed = false;
|
||||
|
||||
if (qxl->revision < 4) {
|
||||
trace_qxl_client_monitors_config_unsupported_by_device(qxl->id,
|
||||
@@ -1030,6 +1059,10 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
||||
}
|
||||
#endif
|
||||
|
||||
+ config_changed = qxl_rom_monitors_config_changed(rom,
|
||||
+ monitors_config,
|
||||
+ max_outputs);
|
||||
+
|
||||
memset(&rom->client_monitors_config, 0,
|
||||
sizeof(rom->client_monitors_config));
|
||||
rom->client_monitors_config.count = monitors_config->num_of_monitors;
|
||||
@@ -1059,7 +1092,9 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
||||
trace_qxl_interrupt_client_monitors_config(qxl->id,
|
||||
rom->client_monitors_config.count,
|
||||
rom->client_monitors_config.heads);
|
||||
- qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG);
|
||||
+ if (config_changed) {
|
||||
+ qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG);
|
||||
+ }
|
||||
return 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
11
qemu.spec
11
qemu.spec
@ -82,7 +82,7 @@ Requires: %{name}-block-ssh = %{epoch}:%{version}-%{release}
|
||||
%undefine _hardened_build
|
||||
|
||||
# Release candidate version tracking
|
||||
%global rcver rc2
|
||||
%global rcver rc3
|
||||
%if 0%{?rcver:1}
|
||||
%global rcrel .%{rcver}
|
||||
%global rcstr -%{rcver}
|
||||
@ -92,7 +92,7 @@ Requires: %{name}-block-ssh = %{epoch}:%{version}-%{release}
|
||||
Summary: QEMU is a FAST! processor emulator
|
||||
Name: qemu
|
||||
Version: 2.8.0
|
||||
Release: 0.2%{?rcrel}%{?dist}
|
||||
Release: 0.3%{?rcrel}%{?dist}
|
||||
Epoch: 2
|
||||
License: GPLv2+ and LGPLv2+ and BSD
|
||||
Group: Development/Tools
|
||||
@ -126,10 +126,6 @@ Source21: 50-kvm-s390x.conf
|
||||
# /etc/security/limits.d/95-kvm-ppc64-memlock.conf
|
||||
Source22: 95-kvm-ppc64-memlock.conf
|
||||
|
||||
# Fix flickering display with boxes + wayland VM (bz #1392239)
|
||||
# Posted, but not yet upstream
|
||||
Patch0001: 0001-qxl-Only-emit-QXL_INTERRUPT_CLIENT_MONITORS_CONFIG-o.patch
|
||||
|
||||
# documentation deps
|
||||
BuildRequires: texi2html
|
||||
BuildRequires: texinfo
|
||||
@ -1952,6 +1948,9 @@ getent passwd qemu >/dev/null || \
|
||||
|
||||
|
||||
%changelog
|
||||
* Mon Dec 12 2016 Cole Robinson <crobinso@redhat.com> - 2:2.8.0-0.3-rc3
|
||||
- Rebase to qemu-2.8.0-rc3
|
||||
|
||||
* Mon Dec 05 2016 Cole Robinson <crobinso@redhat.com> - 2:2.8.0-0.2-rc2
|
||||
- Rebuild to pick up changed libxen* sonames
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user