diff options
author | Roland Mainz <roland.mainz@nrubsig.org> | 2004-12-15 09:22:02 +0000 |
---|---|---|
committer | Roland Mainz <roland.mainz@nrubsig.org> | 2004-12-15 09:22:02 +0000 |
commit | fa678e04f57b615f7507b5dd160ce1b32c877aa5 (patch) | |
tree | 8978640daeabc6da14ef53b2229027ff0f269380 | |
parent | dedca6594250056cc5a4fef74e715fc229602619 (diff) |
Bug #1889 (https://bugs.freedesktop.org/show_bug.cgi?id=1889) attachment
#1330 (https://bugs.freedesktop.org/attachment.cgi?id=1330): Retry CCE
idle commands until the (higher) timeout is reached, and properly stop
the engine if we totally fail -- gets rid of serious performance issues
and lockups with r128 DRI (see also Debian bug reports #223089,
#236187, #236373, #243436). Patch by Daniel Jacobowitz.
-rw-r--r-- | src/r128_accel.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/r128_accel.c b/src/r128_accel.c index 90c5cb5f..ded73d5a 100644 --- a/src/r128_accel.c +++ b/src/r128_accel.c @@ -237,17 +237,23 @@ void R128CCEWaitForIdle(ScrnInfoPtr pScrn) i = 0; do { ret = drmCommandNone(info->drmFD, DRM_R128_CCE_IDLE); - } while ( ret && errno == EBUSY && i++ < R128_IDLE_RETRY ); + } while ( ret && errno == EBUSY && i++ < (R128_IDLE_RETRY * R128_IDLE_RETRY) ); if (ret && ret != -EBUSY) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: CCE idle %d\n", __FUNCTION__, ret); } + if (i > R128_IDLE_RETRY) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: (DEBUG) CCE idle took i = %d\n", __FUNCTION__, i); + } + if (ret == 0) return; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Idle timed out, resetting engine...\n"); + R128CCE_STOP(pScrn, info); R128EngineReset(pScrn); /* Always restart the engine when doing CCE 2D acceleration */ |