RADEON/AIGLX/DRM Problem

Kostik Belousov kostikbel at gmail.com
Mon Jul 16 10:26:27 UTC 2007


On Sun, Jul 15, 2007 at 02:31:02AM -0700, vehemens wrote:
> The problem with the RADEON driver failing when run with the AIGLX extension 
> appears to be a problem with the DRM piece (library and/or driver).
> 
> What is happening is that the RADEON driver initializes DRM and sets a lock 
> using one file descriptor.   When the AIGLX extension loads, it probes via 
> DRM using open/close calls on another file descriptor.
> 
> As both the RADEON driver and the AIGLX extension are part of the same 
> process, the AIGLX probe close calls drm_close which removes the DRI lock 
> causing the RADEON driver to fail during xserver initialization (i.e. system 
> hang).
> 
> Just to complicate the issue, I've been told that this doesn't occur with 
> linux with the suggestion that the BSD driver is broken or that the close 
> semantics are different between the two operating systems.
> 
> I'm looking for ideas here as I don't know what direction to go in a this 
> point.

The following may change the behaviour of the drm_close() somewhat
in needed direction. It does all cleanup only on last close. I am
completely unsure whether this is right, and whether it would help. It
seems that normal drm dev cloning is needed there.

Patch only compile tested.

diff --git a/sys/dev/drm/drm_drv.c b/sys/dev/drm/drm_drv.c
index dda03c1..b7c9ab9 100644
--- a/sys/dev/drm/drm_drv.c
+++ b/sys/dev/drm/drm_drv.c
@@ -711,6 +711,15 @@ int drm_close(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p)
 		return EINVAL;
 	}
 
+	atomic_inc( &dev->counts[_DRM_STAT_CLOSES] );
+#ifdef __FreeBSD__
+	device_unbusy(dev->device);
+#endif
+	if (--dev->open_count != 0) {
+		DRM_UNLOCK();
+		return (0);
+	}
+
 	if (dev->driver.preclose != NULL)
 		dev->driver.preclose(dev, filp);
 
@@ -797,13 +806,8 @@ int drm_close(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p)
 	 * End inline drm_release
 	 */
 
-	atomic_inc( &dev->counts[_DRM_STAT_CLOSES] );
-#ifdef __FreeBSD__
-	device_unbusy(dev->device);
-#endif
-	if (--dev->open_count == 0) {
-		retcode = drm_lastclose(dev);
-	}
+
+	retcode = drm_lastclose(dev);
 
 	DRM_UNLOCK();
 	
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-x11/attachments/20070716/62e686c0/attachment.pgp


More information about the freebsd-x11 mailing list