Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Feb 2007 18:38:27 +0200
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Guy Helmer <ghelmer@palisadesys.com>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: 6.2 amd64 panic: lockmgr: thread 0xffffff009f9fd000, not exclusive lock holder 0xffffff003961c000 unlocking
Message-ID:  <20070201163826.GI56152@deviant.kiev.zoral.com.ua>
In-Reply-To: <45C20F00.4010900@palisadesys.com>
References:  <45C0C749.1040300@palisadesys.com> <45C20F00.4010900@palisadesys.com>

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

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

On Thu, Feb 01, 2007 at 10:02:08AM -0600, Guy Helmer wrote:
> Guy Helmer wrote:
> >Does this make sense to anyone (it doesn't to me - procfs_doprofile=20
> >simply locks, calls vn_fullpath, and unlocks)?  I was trying to track=20
> >down a hang by running a system under stress, and instead got this=20
> >panic as a result of a process running a perl script that looks=20
> >through /proc/; it occurred on a very busy system with lots of process=
=20
> >churn.
> Does this change to src/sys/fs/procfs.c make sense?  From my reading, it=
=20
> is possible for vn_lock(9) to fail...
>=20
> Index: procfs.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /home/ncvs/src/sys/fs/procfs/procfs.c,v
> retrieving revision 1.12.2.1
> diff -u -r1.12.2.1 procfs.c
> --- procfs.c    14 Jun 2006 21:20:39 -0000      1.12.2.1
> +++ procfs.c    1 Feb 2007 15:19:30 -0000
> @@ -69,8 +69,11 @@
> {
> 	char *fullpath =3D "unknown";
> 	char *freepath =3D NULL;
> +	int err;
>=20
> -	vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td);
> +	if ((err =3D vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td)) !=3D 0)=
 {
> +		return (err);
> +	}
> 	vn_fullpath(td, p->p_textvp, &fullpath, &freepath);
> 	VOP_UNLOCK(p->p_textvp, 0, td);
> 	sbuf_printf(sb, "%s", fullpath);

vn_lock with LK_EXCLUSIVE|LK_RETRY flags combination shall not fail. It sho=
uld
return even dead vnodes locked.

I suspect that in fact this is race with exec(). Could you reproduce the
panic ? And then, with this patch ?

Index: fs/procfs/procfs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /usr/local/arch/ncvs/src/sys/fs/procfs/procfs.c,v
retrieving revision 1.14
diff -u -r1.14 procfs.c
--- fs/procfs/procfs.c	5 Jun 2006 16:41:27 -0000	1.14
+++ fs/procfs/procfs.c	1 Feb 2007 16:37:43 -0000
@@ -69,10 +69,12 @@
 {
 	char *fullpath =3D "unknown";
 	char *freepath =3D NULL;
+	struct vnode *textvp;
=20
-	vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td);
-	vn_fullpath(td, p->p_textvp, &fullpath, &freepath);
-	VOP_UNLOCK(p->p_textvp, 0, td);
+	textvp =3D p->p_textvp;
+	vn_lock(textvp, LK_EXCLUSIVE | LK_RETRY, td);
+	vn_fullpath(td, textvp, &fullpath, &freepath);
+	VOP_UNLOCK(textvp, 0, td);
 	sbuf_printf(sb, "%s", fullpath);
 	if (freepath)
 		free(freepath, M_TEMP);

--sl5MdczEF/OU2Miu
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iD8DBQFFwheCC3+MBN1Mb4gRAvyqAKDwMF58xF8t0As48qCR/Gi9eSwvTgCeIjUE
v3EVmqGv41JvGjiOa5HJCgM=
=Zuk4
-----END PGP SIGNATURE-----

--sl5MdczEF/OU2Miu--



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