RADEON/AIGLX/DRM Problem

vehemens vehemens at verizon.net
Wed Jul 25 20:46:48 UTC 2007


On Monday 16 July 2007 03:02:53 am Kostik Belousov wrote:
> 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();

I did try your patch.  It allows me to remove all of my workarounds.  In 
addition, I no longer have the xserver exit hangs.

I get a white screen when I restart the xserver and beryl.  This is probably 
the driver not restoring the card state on exit.

I havn't looked at the driver code on the use of device_unbusy(dev->device) 
yet, but was wondering if it really should be per close?

It does appear to be the best solution and probably the right one at this 
point.




More information about the freebsd-x11 mailing list