From owner-freebsd-current@FreeBSD.ORG Wed Apr 11 19:42:47 2012 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 29EA7106564A for ; Wed, 11 Apr 2012 19:42:47 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.zoral.com.ua (mx0.zoral.com.ua [91.193.166.200]) by mx1.freebsd.org (Postfix) with ESMTP id 864518FC0C for ; Wed, 11 Apr 2012 19:42:46 +0000 (UTC) Received: from skuns.kiev.zoral.com.ua (localhost [127.0.0.1]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id q3BJgepM097696; Wed, 11 Apr 2012 22:42:40 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5) with ESMTP id q3BJgem6005355; Wed, 11 Apr 2012 22:42:40 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5/Submit) id q3BJgdjY005354; Wed, 11 Apr 2012 22:42:39 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Wed, 11 Apr 2012 22:42:39 +0300 From: Konstantin Belousov To: Taku YAMAMOTO Message-ID: <20120411194239.GN2358@deviant.kiev.zoral.com.ua> References: <20120410063153.GA1458@mole.fafoe.narf.at> <20120411113400.GA1399@mole.fafoe.narf.at> <20120411125338.GK2358@deviant.kiev.zoral.com.ua> <20120412031919.be6c584e.taku@tackymt.homeip.net> <20120412040411.03ee34dd.taku@tackymt.homeip.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="jZYq8Bnk7KOiLUpC" Content-Disposition: inline In-Reply-To: <20120412040411.03ee34dd.taku@tackymt.homeip.net> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.2 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.0 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua Cc: freebsd-current@freebsd.org Subject: Re: Follow-up: Re: recent update breaks some ports X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Apr 2012 19:42:47 -0000 --jZYq8Bnk7KOiLUpC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Apr 12, 2012 at 04:04:11AM +0900, Taku YAMAMOTO wrote: > The following is the first occurence of wlock-within-wlock incident > when I run xfdesktop-settings under gdb. >=20 > Hardware watchpoint 3: lock_place[0].count_ww >=20 > Old value =3D 0 > New value =3D 1 > 0x28f52522 in _thr_rtld_wlock_acquire (lock=3D0x28f63600) > at /usr/src/lib/libthr/thread/thr_rtld.c:152 > 152 HANDLE_NESTED_ACQ(count_ww); > (gdb) bt > #0 0x28f52522 in _thr_rtld_wlock_acquire (lock=3D0x28f63600) > at /usr/src/lib/libthr/thread/thr_rtld.c:152 > #1 0x280719c1 in wlock_acquire () from /libexec/ld-elf.so.1 > #2 0x2806eb15 in dlopen_object () from /libexec/ld-elf.so.1 > #3 0x2806ef1b in load_filtee1 () from /libexec/ld-elf.so.1 > #4 0x2806ef7d in load_filtees () from /libexec/ld-elf.so.1 > #5 0x2806f318 in symlook_obj () from /libexec/ld-elf.so.1 > #6 0x2806f421 in symlook_list () from /libexec/ld-elf.so.1 > #7 0x2806fa0b in symlook_default () from /libexec/ld-elf.so.1 > #8 0x2806fc1a in find_symdef () from /libexec/ld-elf.so.1 > #9 0x2806a426 in reloc_non_plt () from /libexec/ld-elf.so.1 > #10 0x2806d453 in relocate_objects () from /libexec/ld-elf.so.1 > #11 0x2806ee6d in dlopen_object () from /libexec/ld-elf.so.1 > #12 0x2806f862 in rtld_dlopen () from /libexec/ld-elf.so.1 > #13 0x28d2a6b0 in g_module_open () from /usr/local/lib/libgmodule-2.0.so.0 > #14 0x28406894 in gtk_im_context_simple_new () > from /usr/local/lib/libgtk-x11-2.0.so.0 Thank you for the report, I hope that the patch at the end of the message would take care of this problem. >=20 >=20 > The following is the first occurence of rlock-within-wlock incident. >=20 > Hardware watchpoint 2: lock_place[0].count_rw >=20 > Old value =3D 0 > New value =3D 1 > 0x28f526fd in _thr_rtld_rlock_acquire (lock=3D0x28f63600) > at /usr/src/lib/libthr/thread/thr_rtld.c:133 > 133 HANDLE_NESTED_ACQ(count_rw); > (gdb) bt > #0 0x28f526fd in _thr_rtld_rlock_acquire (lock=3D0x28f63600) > at /usr/src/lib/libthr/thread/thr_rtld.c:133 > #1 0x28071291 in rlock_acquire () from /libexec/ld-elf.so.1 > #2 0x2806fccb in _rtld_bind () from /libexec/ld-elf.so.1 > #3 0x28069dc9 in _rtld_bind_start () from /libexec/ld-elf.so.1 > #4 0x290c3000 in ?? () > #5 0x00000148 in ?? () > #6 0x29356318 in ?? () from /usr/lib/libsupc++.so.1 > #7 0x28f503e0 in _thr_once_init () > from /home/taku/work/build/biotite/usr/src/lib/libthr/libthr.so.3 > #8 0xffffffff in ?? () > #9 0x00200202 in ?? () > #10 0x290c3000 in ?? () > #11 0x00000148 in ?? () > #12 0x2935eae0 in __gxx_personality_v0 () from /usr/lib/libsupc++.so.1 > #13 0x2935f5c5 in __cxa_get_globals () from /usr/lib/libsupc++.so.1 > #14 0x290c2710 in ?? () > #15 0xbfbfdc48 in ?? () > #16 0x29356325 in ?? () from /usr/lib/libsupc++.so.1 > #17 0x280714c9 in lock_release () from /libexec/ld-elf.so.1 > Previous frame inner to this frame (corrupt stack?) Unortunately, this trace is not usefule, it seems that you need to recompile rtld/libc/libthr with debugging symbols to get the issue fixed. diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index f02d276..1def854 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -85,7 +85,7 @@ static void digest_dynamic(Obj_Entry *, int); static Obj_Entry *digest_phdr(const Elf_Phdr *, int, caddr_t, const char *= ); static Obj_Entry *dlcheck(void *); static Obj_Entry *dlopen_object(const char *name, int fd, Obj_Entry *refob= j, - int lo_flags, int mode); + int lo_flags, int mode, RtldLockState *lockstate); static Obj_Entry *do_load_object(int, const char *, char *, struct stat *,= int); static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *); static bool donelist_check(DoneList *, const Obj_Entry *); @@ -1672,13 +1672,14 @@ unload_filtees(Obj_Entry *obj) } =20 static void -load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags) +load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags, + RtldLockState *lockstate) { =20 for (; needed !=3D NULL; needed =3D needed->next) { needed->obj =3D dlopen_object(obj->strtab + needed->name, -1, obj, flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) | - RTLD_LOCAL); + RTLD_LOCAL, lockstate); } } =20 @@ -1688,8 +1689,8 @@ load_filtees(Obj_Entry *obj, int flags, RtldLockState= *lockstate) =20 lock_restart_for_upgrade(lockstate); if (!obj->filtees_loaded) { - load_filtee1(obj, obj->needed_filtees, flags); - load_filtee1(obj, obj->needed_aux_filtees, flags); + load_filtee1(obj, obj->needed_filtees, flags, lockstate); + load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate); obj->filtees_loaded =3D true; } } @@ -2489,7 +2490,7 @@ rtld_dlopen(const char *name, int fd, int mode) lo_flags |=3D RTLD_LO_TRACE; =20 return (dlopen_object(name, fd, obj_main, lo_flags, - mode & (RTLD_MODEMASK | RTLD_GLOBAL))); + mode & (RTLD_MODEMASK | RTLD_GLOBAL), NULL)); } =20 static void @@ -2504,17 +2505,20 @@ dlopen_cleanup(Obj_Entry *obj) =20 static Obj_Entry * dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags, - int mode) + int mode, RtldLockState *lockstate) { Obj_Entry **old_obj_tail; Obj_Entry *obj; Objlist initlist; - RtldLockState lockstate; + RtldLockState mlockstate; int result; =20 objlist_init(&initlist); =20 - wlock_acquire(rtld_bind_lock, &lockstate); + if (lockstate =3D=3D NULL && !(lo_flags & RTLD_LO_EARLY)) { + wlock_acquire(rtld_bind_lock, &mlockstate); + lockstate =3D &mlockstate; + } GDB_STATE(RT_ADD,NULL); =20 old_obj_tail =3D obj_tail; @@ -2543,7 +2547,7 @@ dlopen_object(const char *name, int fd, Obj_Entry *re= fobj, int lo_flags, if (result =3D=3D -1 || (relocate_objects(obj, (mode & RTLD_MODEMASK) =3D=3D RTLD_NOW, &obj_rtld, (lo_flags & RTLD_LO_EARLY) ? SYMLOOK_EARLY : 0, - &lockstate)) =3D=3D -1) { + lockstate)) =3D=3D -1) { dlopen_cleanup(obj); obj =3D NULL; } else if (lo_flags & RTLD_LO_EARLY) { @@ -2587,28 +2591,31 @@ dlopen_object(const char *name, int fd, Obj_Entry *= refobj, int lo_flags, GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL); =20 if (!(lo_flags & RTLD_LO_EARLY)) { - map_stacks_exec(&lockstate); + map_stacks_exec(lockstate); } =20 if (initlist_objects_ifunc(&initlist, (mode & RTLD_MODEMASK) =3D=3D RT= LD_NOW, (lo_flags & RTLD_LO_EARLY) ? SYMLOOK_EARLY : 0, - &lockstate) =3D=3D -1) { + lockstate) =3D=3D -1) { objlist_clear(&initlist); dlopen_cleanup(obj); - lock_release(rtld_bind_lock, &lockstate); + if (lockstate =3D=3D &mlockstate) + lock_release(rtld_bind_lock, lockstate); return (NULL); } =20 if (!(lo_flags & RTLD_LO_EARLY)) { /* Call the init functions. */ - objlist_call_init(&initlist, &lockstate); + objlist_call_init(&initlist, lockstate); } objlist_clear(&initlist); - lock_release(rtld_bind_lock, &lockstate); + if (lockstate =3D=3D &mlockstate) + lock_release(rtld_bind_lock, lockstate); return obj; trace: trace_loaded_objects(obj); - lock_release(rtld_bind_lock, &lockstate); + if (lockstate =3D=3D &mlockstate) + lock_release(rtld_bind_lock, lockstate); exit(0); } =20 --jZYq8Bnk7KOiLUpC Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (FreeBSD) iEYEARECAAYFAk+F3q8ACgkQC3+MBN1Mb4hlbwCg3itV3h1dFLBa61ydIN+pfsAT 9HQAoJRt6JwT2qGFMFCOa0/oJ+1Bia26 =Zr+l -----END PGP SIGNATURE----- --jZYq8Bnk7KOiLUpC--