Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 May 2001 22:51:11 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        Alfred Perlstein <alfred@FreeBSD.ORG>
Cc:        current@FreeBSD.ORG
Subject:   Re: vm_pager_(de)allocate and vm_mtx 
Message-ID:  <20010526055111.7B5803E28@bazooka.unixfreak.org>
In-Reply-To: <20010526010239.G17514@superconductor.rush.net>; from alfred@FreeBSD.ORG on "Sat, 26 May 2001 01:02:39 -0400"

next in thread | previous in thread | raw e-mail | index | archive | help
Alfred Perlstein <alfred@FreeBSD.ORG> writes:
> * Dima Dorfman <dima@unixfreak.org> [010525 22:22] wrote:
> > Is there a reason vm_pager_allocate acquires vm_mtx itself if
> > necessary but vm_pager_deallocate does not?  At the moment, detaching
> > an md(4) disk will panic the system with a failed mtx_assert in
> > vm_pager_deallocate.  This can be fixed one of two ways:
> > vm_pager_deallocate could be made to deal with vm_mtx itself like
> > vm_pager_allocate does, or md(4) and any other drivers which call
> > vm_pager_deallocate can be fixed to acquire vm_mtx.  So which will it
> > be?  I'll supply patches for either case.
> 
> Usually fixing the caller is better as it will catch people that
> expect vm state to remain unchanged across several calls.

Patch to fix md(4) attached.  Look okay?

					Dima Dorfman
					dima@unixfreak.org

Index: md.c
===================================================================
RCS file: /stl/src/FreeBSD/src/sys/dev/md/md.c,v
retrieving revision 1.33
diff -u -r1.33 md.c
--- md.c	2001/05/21 18:52:00	1.33
+++ md.c	2001/05/26 05:48:57
@@ -711,8 +711,11 @@
 		(void)vn_close(sc->vnode, sc->flags & MD_READONLY ?  FREAD : (FREAD|FWRITE), sc->cred, p);
 	if (sc->cred != NULL)
 		crfree(sc->cred);
-	if (sc->object != NULL)
+	if (sc->object != NULL) {
+		mtx_lock(&vm_mtx);
 		vm_pager_deallocate(sc->object);
+		mtx_unlock(&vm_mtx);
+	}
 	if (sc->secp != NULL) {
 		for (u = 0; u < sc->nsect; u++) 
 			if ((uintptr_t)sc->secp[u] > 255)
@@ -763,17 +766,20 @@
 	 * Note the truncation.
 	 */
 
+	mtx_lock(&vm_mtx);
 	sc->secsize = PAGE_SIZE;
 	sc->nsect = mdio->md_size / (PAGE_SIZE / DEV_BSIZE);
 	sc->object = vm_pager_allocate(OBJT_SWAP, NULL, sc->secsize * (vm_offset_t)sc->nsect, VM_PROT_DEFAULT, 0);
 	if (mdio->md_options & MD_RESERVE) {
 		if (swap_pager_reserve(sc->object, 0, sc->nsect) < 0) {
 			vm_pager_deallocate(sc->object);
+			mtx_unlock(&vm_mtx);
 			sc->object = NULL;
 			mddestroy(sc, mdio, p);
 			return(EDOM);
 		}
 	}
+	mtx_unlock(&vm_mtx);
 	error = mdsetcred(sc, p->p_ucred);
 	if (error)
 		mddestroy(sc, mdio, p);

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?20010526055111.7B5803E28>