Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Jul 2007 13:02:53 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        vehemens <vehemens@verizon.net>
Cc:        freebsd-x11@freebsd.org
Subject:   Re: RADEON/AIGLX/DRM Problem
Message-ID:  <20070716100252.GS2200@deviant.kiev.zoral.com.ua>
In-Reply-To: <200707150231.03162.vehemens@verizon.net>
References:  <200707030247.52207.vehemens@verizon.net> <1183974697.15243.58.camel@thor.sulgenrain.local> <200707092112.06905.vehemens@verizon.net> <200707150231.03162.vehemens@verizon.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--g/o8sqaH6XVFI89B
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Jul 15, 2007 at 02:31:02AM -0700, vehemens wrote:
> The problem with the RADEON driver failing when run with the AIGLX extens=
ion=20
> appears to be a problem with the DRM piece (library and/or driver).
>=20
> What is happening is that the RADEON driver initializes DRM and sets a lo=
ck=20
> using one file descriptor.   When the AIGLX extension loads, it probes vi=
a=20
> DRM using open/close calls on another file descriptor.
>=20
> As both the RADEON driver and the AIGLX extension are part of the same=20
> process, the AIGLX probe close calls drm_close which removes the DRI lock=
=20
> causing the RADEON driver to fail during xserver initialization (i.e. sys=
tem=20
> hang).
>=20
> Just to complicate the issue, I've been told that this doesn't occur with=
=20
> linux with the suggestion that the BSD driver is broken or that the close=
=20
> semantics are different between the two operating systems.
>=20
> I'm looking for ideas here as I don't know what direction to go in a this=
=20
> 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, D=
RM_STRUCTPROC *p)
 		return EINVAL;
 	}
=20
+	atomic_inc( &dev->counts[_DRM_STAT_CLOSES] );
+#ifdef __FreeBSD__
+	device_unbusy(dev->device);
+#endif
+	if (--dev->open_count !=3D 0) {
+		DRM_UNLOCK();
+		return (0);
+	}
+
 	if (dev->driver.preclose !=3D NULL)
 		dev->driver.preclose(dev, filp);
=20
@@ -797,13 +806,8 @@ int drm_close(struct cdev *kdev, int flags, int fmt, D=
RM_STRUCTPROC *p)
 	 * End inline drm_release
 	 */
=20
-	atomic_inc( &dev->counts[_DRM_STAT_CLOSES] );
-#ifdef __FreeBSD__
-	device_unbusy(dev->device);
-#endif
-	if (--dev->open_count =3D=3D 0) {
-		retcode =3D drm_lastclose(dev);
-	}
+
+	retcode =3D drm_lastclose(dev);
=20
 	DRM_UNLOCK();
 =09

--g/o8sqaH6XVFI89B
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (FreeBSD)

iD8DBQFGm0JMC3+MBN1Mb4gRAqjPAKDI/9R2vQ5lOrAimivMUxkK7neDmACfZgrc
1HSwFEq+/R0kkeN2qp4wOBo=
=hpa2
-----END PGP SIGNATURE-----

--g/o8sqaH6XVFI89B--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070716100252.GS2200>