Patchwork [1/2] qemu: add option to disable X grabs

login
register
mail settings
Submitter Ross Burton
Date Sept. 18, 2013, 4:48 p.m.
Message ID <1379522926-22817-1-git-send-email-ross.burton@intel.com>
Download mbox | patch
Permalink /patch/58335/
State Accepted
Commit dd2b2f93a99206e2b33b9a971b107dee0ffe4f54
Headers show

Comments

Ross Burton - Sept. 18, 2013, 4:48 p.m.
When the mouse pointer enters the qemu window it takes a pointer grab. This
doesn't sound too dangerous at first but it turns out that SDL will infinitely
busy-loop if it can't get the grab (e.g. if the screen is locked) and the
average autobuilder setup's X server will have locked the screen a few minutes
after boot.

The result is that on many autobuilders apparently random qemu instances (the
top-most one under the pointer) will hang during boot.

To resolve this add an option (via an environment variable) to never attempt a
grab.  The default behaviour remains to grab so that everyone else doesn't see
any change.

Signed-off-by: Ross Burton <ross.burton@intel.com>
---
 .../qemu/files/disable-grabs.patch                 |   69 ++++++++++++++++++++
 meta/recipes-devtools/qemu/qemu.inc                |    1 +
 2 files changed, 70 insertions(+)
 create mode 100644 meta/recipes-devtools/qemu/files/disable-grabs.patch
Eric BENARD - Sept. 18, 2013, 8:28 p.m.
Hi Ross,

Le Wed, 18 Sep 2013 17:48:45 +0100,
Ross Burton <ross.burton@intel.com> a écrit :
> diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc
> index 97e9b7b..1b861d7 100644
> --- a/meta/recipes-devtools/qemu/qemu.inc
> +++ b/meta/recipes-devtools/qemu/qemu.inc
> @@ -17,6 +17,7 @@ SRC_URI = "\
>      file://powerpc_rom.bin \
>      file://no-strip.patch \
>      file://larger_default_ram_size.patch \
> +    file://disable-grabs.patch \
>      "
>  
>  SRC_URI_append_class-nativesdk = "\

that seems to break the build here (while building meta-toolchain-qte) :
ERROR: Command Error: exit status: 1  Output:
Applying patch disable-grabs.patch
patching file ui/sdl.c
Hunk #3 FAILED at 912.
1 out of 3 hunks FAILED -- rejects in file ui/sdl.c
Patch disable-grabs.patch does not apply (enforce with -f)
ERROR: Function failed: patch_do_patch
ERROR: Logfile of failure stored
in: /scratch/eb/eukrea2/master/setup-scripts/build/tmp-defaultsetup-eglibc-eglibc/work/i686-nativesdk-oesdk-linux/nativesdk-qemu/1.5.0-r0/temp/log.do_patch.14821
ERROR: Task 2313
(virtual:nativesdk:/scratch/eb/eukrea2/master/setup-scripts/sources/openembedded-core/meta/recipes-devtools/qemu/qemu_1.5.0.bb,
do_patch) failed with exit code '1'

Eric
Richard Purdie - Sept. 18, 2013, 9:16 p.m.
On Wed, 2013-09-18 at 22:28 +0200, Eric Bénard wrote:
> Hi Ross,
> 
> Le Wed, 18 Sep 2013 17:48:45 +0100,
> Ross Burton <ross.burton@intel.com> a écrit :
> > diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc
> > index 97e9b7b..1b861d7 100644
> > --- a/meta/recipes-devtools/qemu/qemu.inc
> > +++ b/meta/recipes-devtools/qemu/qemu.inc
> > @@ -17,6 +17,7 @@ SRC_URI = "\
> >      file://powerpc_rom.bin \
> >      file://no-strip.patch \
> >      file://larger_default_ram_size.patch \
> > +    file://disable-grabs.patch \
> >      "
> >  
> >  SRC_URI_append_class-nativesdk = "\
> 
> that seems to break the build here (while building meta-toolchain-qte) :
> ERROR: Command Error: exit status: 1  Output:
> Applying patch disable-grabs.patch
> patching file ui/sdl.c
> Hunk #3 FAILED at 912.
> 1 out of 3 hunks FAILED -- rejects in file ui/sdl.c
> Patch disable-grabs.patch does not apply (enforce with -f)
> ERROR: Function failed: patch_do_patch
> ERROR: Logfile of failure stored
> in: /scratch/eb/eukrea2/master/setup-scripts/build/tmp-defaultsetup-eglibc-eglibc/work/i686-nativesdk-oesdk-linux/nativesdk-qemu/1.5.0-r0/temp/log.do_patch.14821
> ERROR: Task 2313
> (virtual:nativesdk:/scratch/eb/eukrea2/master/setup-scripts/sources/openembedded-core/meta/recipes-devtools/qemu/qemu_1.5.0.bb,
> do_patch) failed with exit code '1'

Thanks for the report. I looked into it and somehow the patch was
corrupted. I've pushed a fix in.

Cheers,

Richard
Ross Burton - Sept. 18, 2013, 9:40 p.m.
On 18 September 2013 22:16, Richard Purdie
<richard.purdie@linuxfoundation.org> wrote:
> Thanks for the report. I looked into it and somehow the patch was
> corrupted. I've pushed a fix in.

There was a typo in my patch and instead of re-generating it I did the
transposition in emacs, which presumably decided to be "clever" and
re-write the patch headers incorrectly.  Thanks, emacs!

Sorry about that,
Ross

Patch

diff --git a/meta/recipes-devtools/qemu/files/disable-grabs.patch b/meta/recipes-devtools/qemu/files/disable-grabs.patch
new file mode 100644
index 0000000..0e82cc8
--- /dev/null
+++ b/meta/recipes-devtools/qemu/files/disable-grabs.patch
@@ -0,0 +1,69 @@ 
+When the pointer enters the Qemu window it calls SDL_WM_GrabInput, which calls
+XGrabPointer in a busyloop until it returns GrabSuccess. However if there's already
+a pointer grab (screen is locked, a menu is open) then qemu will hang until the
+grab can be taken.  In the specific case of a headless X server on an autobuilder, once
+the screensaver has kicked in any qemu instance that appears underneath the
+pointer will hang.
+
+I'm not entirely sure why pointer grabs are required (the documentation
+explicitly says it doesn't do grabs when using a tablet, which we are) so wrap
+them in a conditional that can be set by the autobuilder environment, preserving
+the current grabbing behaviour for everyone else.
+
+Upstream-Status: Pending
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+
+
+From 4b1988ecb01a178269ec0513a75f2ec620c7ef6a Mon Sep 17 00:00:00 2001
+From: Ross Burton <ross.burton@intel.com>
+Date: Wed, 18 Sep 2013 14:04:54 +0100
+Subject: [PATCH] sdl.c: allow user to disable pointer grabs
+
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+---
+ ui/sdl.c |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/ui/sdl.c b/ui/sdl.c
+index 39a42d6..6095aa6 100644
+--- a/ui/sdl.c
++++ b/ui/sdl.c
+@@ -59,6 +59,7 @@ static SDL_Cursor *guest_sprite = NULL;
+ static SDL_PixelFormat host_format;
+ static int scaling_active = 0;
+ static Notifier mouse_mode_notifier;
++static doing_grabs = True;
+ 
+ static void sdl_update(DisplayChangeListener *dcl,
+                        int x, int y, int w, int h)
+@@ -384,14 +385,16 @@ static void sdl_grab_start(void)
+             SDL_WarpMouse(guest_x, guest_y);
+     } else
+         sdl_hide_cursor();
+-    SDL_WM_GrabInput(SDL_GRAB_ON);
++    if (doing_grabs)
++      SDL_WM_GrabInput(SDL_GRAB_ON);
+     gui_grab = 1;
+     sdl_update_caption();
+ }
+ 
+ static void sdl_grab_end(void)
+ {
+-    SDL_WM_GrabInput(SDL_GRAB_OFF);
++    if (doing_grabs)
++      SDL_WM_GrabInput(SDL_GRAB_OFF);
+     gui_grab = 0;
+     sdl_show_cursor();
+     sdl_update_caption();
+@@ -909,7 +912,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
+      * This requires SDL >= 1.2.14. */
+     setenv("SDL_DISABLE_LOCK_KEYS", "1", 1);
+ 
++    doing_grabs = (getenv("QEMU_DONT_GRAB") == NULL);
++
+     flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE;
+     if (SDL_Init (flags)) {
+         fprintf(stderr, "Could not initialize SDL(%s) - exiting\n",
+-- 
+1.7.10.4
+
diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc
index 97e9b7b..1b861d7 100644
--- a/meta/recipes-devtools/qemu/qemu.inc
+++ b/meta/recipes-devtools/qemu/qemu.inc
@@ -17,6 +17,7 @@  SRC_URI = "\
     file://powerpc_rom.bin \
     file://no-strip.patch \
     file://larger_default_ram_size.patch \
+    file://disable-grabs.patch \
     "
 
 SRC_URI_append_class-nativesdk = "\