RADEON/AIGLX/DRM Problem

Ganbold ganbold at micom.mng.net
Thu Jul 26 02:00:55 UTC 2007


vehemens wrote:
> 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.
>
>   

I tried this patch. Now X works with AIGLX enabled. Of course beryl 
works with white screen :)
However when I try to run googleearth, it crashes X. When I kill beryl, 
X crashes too.

Ganbold


> _______________________________________________
> freebsd-x11 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-x11
> To unsubscribe, send any mail to "freebsd-x11-unsubscribe at freebsd.org"
>
>
>
>   


-- 
Make sure your code does nothing gracefully.


More information about the freebsd-x11 mailing list