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>
