Module Name:    src
Committed By:   uebayasi
Date:           Mon Sep 27 08:25:38 UTC 2010

Modified Files:
        src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_do_getpages_xip1: Adjust locking.  Although XIP never does real I/O,
it's called without PGO_LOCKED in some cases.  Leave vmobjlock unlocked in
that case.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.25 -r1.36.2.26 src/sys/miscfs/genfs/genfs_io.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.25 src/sys/miscfs/genfs/genfs_io.c:1.36.2.26
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.25	Sun Sep 26 15:18:11 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Mon Sep 27 08:25:37 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.26 2010/09/27 08:25:37 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.26 2010/09/27 08:25:37 uebayasi Exp $");
 
 #include "opt_xip.h"
 
@@ -832,8 +832,8 @@
 	UVMHIST_LOG(ubchist, "xip npages=%d sbkoff=%lx ebkoff=%lx",
 	    npages, (long)sbkoff, (long)ebkoff, 0);
 
-	if ((flags & PGO_LOCKED) == 0)
-		mutex_exit(&uobj->vmobjlock);
+	KASSERT(mutex_owned(&uobj->vmobjlock));
+	mutex_exit(&uobj->vmobjlock);
 
 	off = offset;
 	for (i = 0; i < npages; i++) {
@@ -896,9 +896,7 @@
 		off += PAGE_SIZE;
 	}
 
-	if ((flags & PGO_LOCKED) == 0)
-		mutex_enter(&uobj->vmobjlock);
-	KASSERT(mutex_owned(&uobj->vmobjlock));
+	mutex_enter(&uobj->vmobjlock);
 
 	for (i = 0; i < npages; i++) {
 		struct vm_page *pg = pps[i];
@@ -1519,10 +1517,12 @@
 			npages = maxpages;
 
 		orignpages = npages;
+		KASSERT(mutex_owned(&uobj->vmobjlock));
 		error = genfs_do_getpages_xip1(vp, off, pgs, &npages, 0,
 		    VM_PROT_ALL, 0, PGO_LOCKED);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);
+		KASSERT(mutex_owned(&uobj->vmobjlock));
 		for (i = 0; i < npages; i++) {
 			pg = pgs[i];
 			if (pg == NULL || pg == PGO_DONTCARE)
@@ -1559,6 +1559,7 @@
 	KASSERT(uobj->uo_npages == 0);
 
 done:
+	KASSERT(mutex_owned(&uobj->vmobjlock));
 	mutex_exit(&uobj->vmobjlock);
 	return 0;
 }

Reply via email to