xf86-video-intel: src/sna/sna_display.c
Chris Wilson
ickle at kemper.freedesktop.org
Sun Apr 5 07:50:46 PDT 2015
src/sna/sna_display.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
New commits:
commit be0fc3ce20fda064d68f38e24717552222d1fd74
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun Apr 5 15:46:27 2015 +0100
sna: Block signals while releasing cursor under modeset
Otherwise we may process a SIGIO moving the cursor away from the CRTC
causing us to remove the cursor and then process a stale pointer inside
the modeset after the signal is complete.
Reported-by: Chris Bainbrigde <chris.bainbridge at gmail.com>
References: https://bugs.freedesktop.org/show_bug.cgi?id=89903
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 26660b2..6f69619 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5202,24 +5202,28 @@ static void
sna_crtc_disable_cursor(struct sna *sna, struct sna_crtc *crtc)
{
struct drm_mode_cursor arg;
+ int sigio;
if (!crtc->cursor)
return;
- DBG(("%s: CRTC:%d, handle=%d\n", __FUNCTION__, crtc->id, crtc->cursor->handle));
- assert(crtc->cursor->ref);
+ sigio = sigio_block();
+ if (crtc->cursor) {
+ DBG(("%s: CRTC:%d, handle=%d\n", __FUNCTION__, crtc->id, crtc->cursor->handle));
+ assert(crtc->cursor->ref > 0);
+ crtc->cursor->ref--;
+ crtc->cursor = NULL;
+ crtc->last_cursor_size = 0;
- VG_CLEAR(arg);
- arg.flags = DRM_MODE_CURSOR_BO;
- arg.crtc_id = crtc->id;
- arg.width = arg.height = 0;
- arg.handle = 0;
+ VG_CLEAR(arg);
+ arg.flags = DRM_MODE_CURSOR_BO;
+ arg.crtc_id = crtc->id;
+ arg.width = arg.height = 0;
+ arg.handle = 0;
- (void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
- assert(crtc->cursor->ref > 0);
- crtc->cursor->ref--;
- crtc->cursor = NULL;
- crtc->last_cursor_size = 0;
+ (void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+ }
+ sigio_unblock(sigio);
}
static void
More information about the xorg-commit
mailing list