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