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