kern/131597: [kernel] c++ exceptions very slow on FreeBSD 7.1/amd64
Konstantin Belousov
kostikbel at gmail.com
Fri Jun 28 17:50:02 UTC 2013
The following reply was made to PR kern/131597; it has been noted by GNATS.
From: Konstantin Belousov <kostikbel at gmail.com>
To: John Baldwin <jhb at freebsd.org>
Cc: bug-followup at freebsd.org, guillaume at morinfr.org, theraven at freebsd.org
Subject: Re: kern/131597: [kernel] c++ exceptions very slow on FreeBSD
7.1/amd64
Date: Fri, 28 Jun 2013 20:45:38 +0300
--8C4Pdt+UNHoLxtm5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
On Fri, Jun 28, 2013 at 01:38:39PM -0400, John Baldwin wrote:
> On Friday, June 28, 2013 1:17:21 pm Konstantin Belousov wrote:
> > On Fri, Jun 28, 2013 at 08:47:55AM -0400, John Baldwin wrote:
> > > Looking at this again, the patch committed in 178807 is just wrong an=
d should=20
> > > be reverted. There is no state in rtld that needs to be protected vi=
a a write=20
> > > lock. GCC is too lazy to use their own locking to protect shared sta=
te=20
> > > between threads and wants the runtime linker to enforce this. Their=
=20
> > > justification that glibc doesn't allow concurrent execution of this i=
sn't a=20
> > > valid excuse. For an API like this that just walks a list and invoke=
s a=20
> > > callback, if the callback manipulates shared state owned by the calle=
r, the=20
> > > caller should be responsible for sychronizing access to it, not rtld!
> > >=20
> > > Instead I think we should apply the patch in the original GCC bug to =
our in-
> > > tree GCC and to our GCC ports. This should remove the sigprocmask ca=
lls and
> > > not penalize other users of dl_iterate_phdr() for GCC's poor behavior.
> >=20
> > In other words, we should become knowingly incompatible with the stock
> > GCC and with other consumers of dl_iterate_phdr(), like libunwind ?
> > E.g. libunwind ability to unwind from the signal handler relies on
> > this behaviour.
>=20
> Does libunwind depend on rtld single-threading to lock state shared with
> other threads? If it does it should manage that itself. If GCC and/or
> libunwind want to share arbitrary state between threads, or protect state
> from being accessed by a signal handler, then GCC and/or libunwind should
> manage that. rtld can't possibly (and shouldn't) know the rules about
> how that state that is private to GCC/libunwind is managed.
libunwind depends on the dl_iterate_phdr() signal-safety.
>=20
> What if you had a consumer of this that wanted to access the state outside
> of the callback? Then it already has to manage all the locking itself to
> be safe anyway.
>=20
> Put another way, requiring dl_iterate_phdr() to providing locking for con=
sumers
> would be equivalent to code assuming that C++'s for_each() template in
> <algorithm> provided locking to callers. That is entirely upside-down.
I think I should revive the fast sigprocmask patch.
--8C4Pdt+UNHoLxtm5
Content-Type: application/pgp-signature
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (FreeBSD)
iQIcBAEBAgAGBQJRzcvBAAoJEJDCuSvBvK1B9UgP/jne8523ys+JZDGUn9izYhJk
LlT5LSSARhTcbREEsIevB5VQt2pbDtKsca/fCtLmaasPN5cb8XgLeyy1J3caB742
LdrXLcczv8PvSJM0D7EDTH6ktGrmAl0i9cHb8sLqHuPAD7/ZNBJRfJXWdRe4Rs3r
/A78kqAdyGlJAupQ+2ocbtsIOg8F1G3L3b7iZ+gA7+txErCv5th6H3+lXalpF+8X
40FDUvpoU9roOesa9vKcQLFWcBMedLkVmTujmHrvFfMuz6zXu+0Anje5Zc0LPOSu
hst4vYimFxn/VXQuU5qmGKhhz0o0jtwJzdF836aJotx2tsQWuBLWZiKSBffKQFeB
D6aK0GlMlK/i6LQD+LeJbjB+k0/jxgK6ZtdetUPnPCUjeHE5IKDrm1Z0yMzMC/20
H5AQ3WdFR7Jvu11ZK6jp2aqX6BDUTTwW85c1Y/k2n5+I48vD1EDXRDO73aQkHyM8
0EU5kCPS1CRbXsf4XeGlye/YhJBNS7Hp/tdNSjhSjHckA78xLUsoKeo6LfCmFtG6
GT8oDSmyugQl6QwCNzNp9bjKJ3wSI1TZjBr8GNQI/kXZJpaJkFb6mzLLLhUbjtt/
XHrA2gaJDE9eTlOohoBO8zJ8bXe1ykK/YuduXdsAfpqKH4KckkEqUiA1ptrMV7C6
9olJnLJJMrgbMjv955u6
=/5H4
-----END PGP SIGNATURE-----
--8C4Pdt+UNHoLxtm5--
More information about the freebsd-bugs
mailing list