Patrick,

Thanks for the report, it clearly looks like an xserver regression, but
next time don't hesitate to mail bugs@ instead.

On 11/07/13(Thu) 03:56, patrick keshishian wrote:
> [...]
> So after some investigating, this "crash" after suspend/resume cycle
> is actually an "abort" due to an assertion on xf86CursorScreenKeyRec
> not being initialized. Provided are a backtrace and print of said
> object[1].

Yep, I can reproduce the crash here by simply doing a console-switch
with the "SWcursor" option defined in my xorg.conf.  So this is not
something related to suspend/resume.

> What I see happen is RADEONCursorInit() fails[2], so
> xf86_cursors_init() never gets called, which would call
> xf86InitCursor(), which initializes the xf86CursorScreenKeyRec.

That's a first bug.  Since the last Xserver update, the radeon driver
is using EXA instead of XAA as acceleration methods, and there's
probably a bug here when trying to allocate some memory for your
hardware cursor.

> When RADEONCursorInit() fails, it logs the following and moves on:
> 
> [  2009.859] (EE) RADEON(0): Hardware cursor initialization failed
> [  2009.859] (II) RADEON(0): Using software cursor
> 
> Now, on resume (after a suspend), radeon_crtc_mode_commit() is invoked
> (see bt), and it calls xf86_reload_cursors(), which eventually causes
> the assert() and abort().

That looks like a second bug to me, should xf86_reload_cursors() be
called when using software cursor?  I leave that to matthieu@ but
in the meantime the diff below should work around your problem.

Index: radeon_crtc.c
===================================================================
RCS file: /home/ncvs/xenocara/driver/xf86-video-ati/src/radeon_crtc.c,v
retrieving revision 1.7
diff -u -p -r1.7 radeon_crtc.c
--- radeon_crtc.c       8 Aug 2012 16:25:22 -0000       1.7
+++ radeon_crtc.c       16 Jul 2013 11:57:23 -0000
@@ -502,8 +502,13 @@ radeon_crtc_mode_set(xf86CrtcPtr crtc, D
 static void
 radeon_crtc_mode_commit(xf86CrtcPtr crtc)
 {
-    if (crtc->scrn->pScreen != NULL)
-       xf86_reload_cursors(crtc->scrn->pScreen);
+    ScrnInfoPtr pScrn = crtc->scrn;
+    RADEONInfoPtr info = RADEONPTR(pScrn);
+
+    if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) {
+        if (pScrn->pScreen != NULL)
+            xf86_reload_cursors(pScrn->pScreen);
+    }
 }
 
 void

Reply via email to