Fix sending of data with -net socket (bz #1391497)
Fix keyboard issues with -ui gtk + host wayland (bz #1401211)
This commit is contained in:
parent
8a588691e2
commit
6438461c91
@ -1,5 +1,5 @@
|
|||||||
From: Christophe Fergeau <cfergeau@redhat.com>
|
From: Christophe Fergeau <cfergeau@redhat.com>
|
||||||
Date: Fri, 14 Oct 2016 14:22:36 +0200
|
Date: Fri, 28 Oct 2016 16:48:40 +0200
|
||||||
Subject: [PATCH] qxl: Only emit QXL_INTERRUPT_CLIENT_MONITORS_CONFIG on config
|
Subject: [PATCH] qxl: Only emit QXL_INTERRUPT_CLIENT_MONITORS_CONFIG on config
|
||||||
changes
|
changes
|
||||||
|
|
||||||
@ -23,29 +23,36 @@ This causes https://bugzilla.redhat.com/show_bug.cgi?id=1266484
|
|||||||
This commit makes sure that we only emit
|
This commit makes sure that we only emit
|
||||||
QXL_INTERRUPT_CLIENT_MONITORS_CONFIG when there are actual configuration
|
QXL_INTERRUPT_CLIENT_MONITORS_CONFIG when there are actual configuration
|
||||||
changes the guest should act on.
|
changes the guest should act on.
|
||||||
|
|
||||||
|
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
|
||||||
|
Message-id: 20161028144840.18326-1-cfergeau@redhat.com
|
||||||
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
(cherry picked from commit 6c7565028c272c4c6f2a83c3a90b044eeaf2804a)
|
||||||
---
|
---
|
||||||
hw/display/qxl.c | 20 +++++++++++++++++++-
|
hw/display/qxl.c | 37 ++++++++++++++++++++++++++++++++++++-
|
||||||
1 file changed, 19 insertions(+), 1 deletion(-)
|
1 file changed, 36 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||||
index 0e2682d..56759f8 100644
|
index 0e2682d..62d0c80 100644
|
||||||
--- a/hw/display/qxl.c
|
--- a/hw/display/qxl.c
|
||||||
+++ b/hw/display/qxl.c
|
+++ b/hw/display/qxl.c
|
||||||
@@ -1000,6 +1000,7 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
@@ -992,6 +992,34 @@ static uint32_t qxl_crc32(const uint8_t *p, unsigned len)
|
||||||
QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar);
|
return crc32(0xffffffff, p, len) ^ 0xffffffff;
|
||||||
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 +1031,21 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
+ if (rom->client_monitors_config.count != MIN(monitors_config->num_of_monitors, max_outputs)) {
|
+static bool qxl_rom_monitors_config_changed(QXLRom *rom,
|
||||||
+ config_changed = true;
|
+ 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) {
|
+ for (i = 0 ; i < rom->client_monitors_config.count ; ++i) {
|
||||||
+ VDAgentMonConfig *monitor = &monitors_config->monitors[i];
|
+ VDAgentMonConfig *monitor = &monitors_config->monitors[i];
|
||||||
+ QXLURect *rect = &rom->client_monitors_config.heads[i];
|
+ QXLURect *rect = &rom->client_monitors_config.heads[i];
|
||||||
@ -54,14 +61,36 @@ index 0e2682d..56759f8 100644
|
|||||||
+ (rect->top != monitor->y) ||
|
+ (rect->top != monitor->y) ||
|
||||||
+ (rect->right != monitor->x + monitor->width) ||
|
+ (rect->right != monitor->x + monitor->width) ||
|
||||||
+ (rect->bottom != monitor->y + monitor->height)) {
|
+ (rect->bottom != monitor->y + monitor->height)) {
|
||||||
+ config_changed = true;
|
+ 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,
|
memset(&rom->client_monitors_config, 0,
|
||||||
sizeof(rom->client_monitors_config));
|
sizeof(rom->client_monitors_config));
|
||||||
rom->client_monitors_config.count = monitors_config->num_of_monitors;
|
rom->client_monitors_config.count = monitors_config->num_of_monitors;
|
||||||
@@ -1059,7 +1075,9 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
@@ -1059,7 +1092,9 @@ static int interface_client_monitors_config(QXLInstance *sin,
|
||||||
trace_qxl_interrupt_client_monitors_config(qxl->id,
|
trace_qxl_interrupt_client_monitors_config(qxl->id,
|
||||||
rom->client_monitors_config.count,
|
rom->client_monitors_config.count,
|
||||||
rom->client_monitors_config.heads);
|
rom->client_monitors_config.heads);
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||||
|
Date: Fri, 4 Nov 2016 15:46:33 +0000
|
||||||
|
Subject: [PATCH] net: fix sending of data with -net socket, listen backend
|
||||||
|
|
||||||
|
The use of -net socket,listen was broken in the following
|
||||||
|
commit
|
||||||
|
|
||||||
|
commit 16a3df403b10c4ac347159e39005fd520b2648bb
|
||||||
|
Author: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
|
||||||
|
Date: Fri May 13 15:35:19 2016 +0800
|
||||||
|
|
||||||
|
net/net: Add SocketReadState for reuse codes
|
||||||
|
|
||||||
|
This function is from net/socket.c, move it to net.c and net.h.
|
||||||
|
Add SocketReadState to make others reuse net_fill_rstate().
|
||||||
|
suggestion from jason.
|
||||||
|
|
||||||
|
This refactored the state out of NetSocketState into a
|
||||||
|
separate SocketReadState. This refactoring requires
|
||||||
|
that a callback is provided to be triggered upon
|
||||||
|
completion of a packet receive from the guest.
|
||||||
|
|
||||||
|
The patch only registered this callback in the codepaths
|
||||||
|
hit by -net socket,connect, not -net socket,listen. So
|
||||||
|
as a result packets sent by the guest in the latter case
|
||||||
|
get dropped on the floor.
|
||||||
|
|
||||||
|
This bug is hidden because net_fill_rstate() silently
|
||||||
|
does nothing if the callback is not set.
|
||||||
|
|
||||||
|
This patch adds in the middle callback registration
|
||||||
|
and also adds an assert so that QEMU aborts if there
|
||||||
|
are any other codepaths hit which are missing the
|
||||||
|
callback.
|
||||||
|
|
||||||
|
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Reviewed-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
|
||||||
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||||||
|
(cherry picked from commit e79cd4068063ea2859199002a049010a11202939)
|
||||||
|
---
|
||||||
|
net/net.c | 5 ++---
|
||||||
|
net/socket.c | 1 +
|
||||||
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/net/net.c b/net/net.c
|
||||||
|
index d51cb29..19b4d9e 100644
|
||||||
|
--- a/net/net.c
|
||||||
|
+++ b/net/net.c
|
||||||
|
@@ -1648,9 +1648,8 @@ int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
|
||||||
|
if (rs->index >= rs->packet_len) {
|
||||||
|
rs->index = 0;
|
||||||
|
rs->state = 0;
|
||||||
|
- if (rs->finalize) {
|
||||||
|
- rs->finalize(rs);
|
||||||
|
- }
|
||||||
|
+ assert(rs->finalize);
|
||||||
|
+ rs->finalize(rs);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
diff --git a/net/socket.c b/net/socket.c
|
||||||
|
index 3f98eef..dcae1ae 100644
|
||||||
|
--- a/net/socket.c
|
||||||
|
+++ b/net/socket.c
|
||||||
|
@@ -522,6 +522,7 @@ static int net_socket_listen_init(NetClientState *peer,
|
||||||
|
s->fd = -1;
|
||||||
|
s->listen_fd = fd;
|
||||||
|
s->nc.link_down = true;
|
||||||
|
+ net_socket_rs_init(&s->rs, net_socket_rs_finalize);
|
||||||
|
|
||||||
|
qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
|
||||||
|
return 0;
|
53
0017-ui-use-evdev-keymap-when-running-under-wayland.patch
Normal file
53
0017-ui-use-evdev-keymap-when-running-under-wayland.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||||
|
Date: Thu, 1 Dec 2016 09:41:17 +0000
|
||||||
|
Subject: [PATCH] ui: use evdev keymap when running under wayland
|
||||||
|
|
||||||
|
Wayland always uses evdev as its input source, so QEMU
|
||||||
|
can use the existing evdev keymap data
|
||||||
|
|
||||||
|
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
---
|
||||||
|
include/ui/gtk.h | 4 ++++
|
||||||
|
ui/gtk.c | 7 +++++++
|
||||||
|
2 files changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
|
||||||
|
index 42ca0fe..b3b5005 100644
|
||||||
|
--- a/include/ui/gtk.h
|
||||||
|
+++ b/include/ui/gtk.h
|
||||||
|
@@ -18,6 +18,10 @@
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef GDK_WINDOWING_WAYLAND
|
||||||
|
+#include <gdk/gdkwayland.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(CONFIG_OPENGL)
|
||||||
|
#include "ui/egl-helpers.h"
|
||||||
|
#include "ui/egl-context.h"
|
||||||
|
diff --git a/ui/gtk.c b/ui/gtk.c
|
||||||
|
index 58d20ee..e8cf785 100644
|
||||||
|
--- a/ui/gtk.c
|
||||||
|
+++ b/ui/gtk.c
|
||||||
|
@@ -90,6 +90,9 @@
|
||||||
|
#ifndef GDK_IS_X11_DISPLAY
|
||||||
|
#define GDK_IS_X11_DISPLAY(dpy) (dpy == dpy)
|
||||||
|
#endif
|
||||||
|
+#ifndef GDK_IS_WAYLAND_DISPLAY
|
||||||
|
+#define GDK_IS_WAYLAND_DISPLAY(dpy) (dpy == dpy)
|
||||||
|
+#endif
|
||||||
|
#ifndef GDK_IS_WIN32_DISPLAY
|
||||||
|
#define GDK_IS_WIN32_DISPLAY(dpy) (dpy == dpy)
|
||||||
|
#endif
|
||||||
|
@@ -1034,6 +1037,10 @@ static int gd_map_keycode(GtkDisplayState *s, GdkDisplay *dpy, int gdk_keycode)
|
||||||
|
qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
+#ifdef GDK_WINDOWING_WAYLAND
|
||||||
|
+ } else if (GDK_IS_WAYLAND_DISPLAY(dpy) && gdk_keycode < 158) {
|
||||||
|
+ qemu_keycode = translate_evdev_keycode(gdk_keycode - 97);
|
||||||
|
+#endif
|
||||||
|
} else if (gdk_keycode == 208) { /* Hiragana_Katakana */
|
||||||
|
qemu_keycode = 0x70;
|
||||||
|
} else if (gdk_keycode == 211) { /* backslash */
|
11
qemu.spec
11
qemu.spec
@ -68,7 +68,7 @@
|
|||||||
Summary: QEMU is a FAST! processor emulator
|
Summary: QEMU is a FAST! processor emulator
|
||||||
Name: qemu
|
Name: qemu
|
||||||
Version: 2.7.0
|
Version: 2.7.0
|
||||||
Release: 7%{?rcrel}%{?dist}
|
Release: 8%{?rcrel}%{?dist}
|
||||||
Epoch: 2
|
Epoch: 2
|
||||||
License: GPLv2+ and LGPLv2+ and BSD
|
License: GPLv2+ and LGPLv2+ and BSD
|
||||||
Group: Development/Tools
|
Group: Development/Tools
|
||||||
@ -133,6 +133,11 @@ Patch0013: 0013-usb-redir-allocate-buffers-before-waking-up-the-host.patch
|
|||||||
Patch0014: 0014-ppc-kvm-Mark-64kB-page-size-support-as-disabled-if-n.patch
|
Patch0014: 0014-ppc-kvm-Mark-64kB-page-size-support-as-disabled-if-n.patch
|
||||||
# Fix flickering display with boxes + wayland VM (bz #1266484)
|
# Fix flickering display with boxes + wayland VM (bz #1266484)
|
||||||
Patch0015: 0015-qxl-Only-emit-QXL_INTERRUPT_CLIENT_MONITORS_CONFIG-o.patch
|
Patch0015: 0015-qxl-Only-emit-QXL_INTERRUPT_CLIENT_MONITORS_CONFIG-o.patch
|
||||||
|
# Fix sending of data with -net socket (bz #1391497)
|
||||||
|
Patch0016: 0016-net-fix-sending-of-data-with-net-socket-listen-backe.patch
|
||||||
|
# Fix keyboard issues with -ui gtk + host wayland (bz #1401211)
|
||||||
|
# Posted but not yet applied upstream
|
||||||
|
Patch0017: 0017-ui-use-evdev-keymap-when-running-under-wayland.patch
|
||||||
|
|
||||||
# documentation deps
|
# documentation deps
|
||||||
BuildRequires: texi2html
|
BuildRequires: texi2html
|
||||||
@ -1604,6 +1609,10 @@ getent passwd qemu >/dev/null || \
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Dec 12 2016 Cole Robinson <crobinso@redhat.com> - 2:2.7.0-8
|
||||||
|
- Fix sending of data with -net socket (bz #1391497)
|
||||||
|
- Fix keyboard issues with -ui gtk + host wayland (bz #1401211)
|
||||||
|
|
||||||
* Tue Oct 25 2016 Cole Robinson <crobinso@redhat.com> - 2:2.7.0-7
|
* Tue Oct 25 2016 Cole Robinson <crobinso@redhat.com> - 2:2.7.0-7
|
||||||
- Fix PPC64 build with memlock file (bz #1387601)
|
- Fix PPC64 build with memlock file (bz #1387601)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user