Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 May 2001 01:44:16 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        David Malone <dwmalone@maths.tcd.ie>
Cc:        mheffner@vt.edu, freebsd-current@freebsd.org, alfred@freebsd.org
Subject:   Re: panic: mutex vm not owned 
Message-ID:  <20010521084416.6E9763E28@bazooka.unixfreak.org>
In-Reply-To: <200105210920.aa71413@salmon.maths.tcd.ie>; from dwmalone@maths.tcd.ie on "Mon, 21 May 2001 09:20:31 %2B0100"

next in thread | previous in thread | raw e-mail | index | archive | help
David Malone <dwmalone@maths.tcd.ie> writes:
> > Please try the attached patch.  I make no claims of its correctness,
> > but this e-mail is coming to you via X on -current updated a few hours
> > ago so it works here :-).
> 
> I tried Dima's patch (the one which Alfred has committed) and I
> get an earlier mutex recursion panic, probably when a local progam
> that uses shm forks and exits. I scribbled down this trace from
> it:

Is there such a program in the base system?

> panic+0x70
> _mtx_assert+0x67
> lockmgr+0xdc
> vm_map_remove+0x42
> shm_delete_mapping+0xe1
> shmexit_myhook+0x29
> exit1+0x9eb
> exit1
> 
> So it looks like those routines are sometime called with the mutex
> already held.

exit1 calls shmexit with vm_mtx held on line 228 of kern_exit.c
(rev. 1.127).  Actually, shmexit_myhook should always be called with
vm_mtx held, so shm_delete_mapping can't assume it isn't held.

Attached is an untested patch to try to fix this.  It's almost 02:00
here and I have to head to bed, but it may work for you.  At least it
may be a starting point for someone.

Hope this helps,

					Dima Dorfman
					dima@unixfreak.org


Index: sysv_shm.c
===================================================================
RCS file: /stl/src/FreeBSD/src/sys/kern/sysv_shm.c,v
retrieving revision 1.56
diff -u -r1.56 sysv_shm.c
--- sysv_shm.c	2001/05/19 01:28:03	1.56
+++ sysv_shm.c	2001/05/21 08:41:29
@@ -200,6 +206,8 @@
 	int segnum, result;
 	size_t size;
 
+	/* for vm_map_remove */
+	mtx_assert(&vm_mtx, MA_OWNED);
 	segnum = IPCID_TO_IX(shmmap_s->shmid);
 	shmseg = &shmsegs[segnum];
 	size = round_page(shmseg->shm_segsz);
@@ -229,6 +237,7 @@
 {
 	struct shmmap_state *shmmap_s;
 	int i;
+	int error;
 
 	if (!jail_sysvipc_allowed && jailed(p->p_ucred))
 		return (ENOSYS);
@@ -242,7 +251,10 @@
 			break;
 	if (i == shminfo.shmseg)
 		return EINVAL;
-	return shm_delete_mapping(p, shmmap_s);
+	mtx_lock(&vm_mtx);
+	error = shm_delete_mapping(p, shmmap_s);
+	mtx_unlock(&vm_mtx);
+	return error;
 }
 
 #ifndef _SYS_SYSPROTO_H_
@@ -659,6 +671,8 @@
 	struct shmmap_state *shmmap_s;
 	int i;
 
+	/* shm_delete_mappings requires this */
+	mtx_assert(&vm_mtx, MA_OWNED);
 	shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
 	for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
 		if (shmmap_s->shmid != -1)

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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