[PATCH] xfree86: die gracefully in the vga arbiter if AddScreen fails

Tiago Vignatti tiago.vignatti at nokia.com
Thu Apr 1 08:57:50 PDT 2010


vga arbiter will be locked in one device while AbortDDX will call LeaveVT
routines from the other device. Fail!

Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
---

Keith, you might want to apply in 1.8 this one.

The stack is the following, where NVSync stays spinning forever:

 0xb72828f9 in NVSync (pScrn=0x9277910) at nv_xaa.c:287
 287     while(READ_GET(pNv) != pNv->dmaPut);
 (gdb) bt
 #0  0xb72828f9 in NVSync (pScrn=0x9277910) at nv_xaa.c:287
 #1  0xb72742a0 in NVLeaveVT (scrnIndex=0, flags=0) at nv_driver.c:1044
 #2  0xb602c11c in XAALeaveVT (index=0, flags=0) at xaaInit.c:534
 #3  0x081df8dd in xf86XVLeaveVT (index=0, flags=0) at xf86xv.c:1274
 #4  0x080c1f66 in AbortDDX () at xf86Init.c:1272
 #5  0x080b4429 in AbortServer () at log.c:418
 #6  0x080b484f in FatalError (
     f=0x8228c5c "AddScreen/ScreenInit failed for driver %d\n") at log.c:546
 #7  0x080c1b9d in InitOutput (pScreenInfo=0x82597e0, argc=6, argv=0xbf85fe74)
     at xf86Init.c:1072
 #8  0x08065363 in main (argc=6, argv=0xbf85fe74, envp=0xbf85fe90) at
 main.c:249


 hw/xfree86/common/xf86Init.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 72241a7..71ac9a9 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1269,7 +1269,9 @@ AbortDDX(void)
 	       * we might not have been wrapped yet. Therefore enable
 	       * screen explicitely.
 	       */
+	      xf86VGAarbiterLock(xf86Screens[i]);
 	      (xf86Screens[i]->LeaveVT)(i, 0);
+	      xf86VGAarbiterUnlock(xf86Screens[i]);
 	  }
   }
 
-- 
1.6.0.4



More information about the xorg-devel mailing list