svn commit: r207584 - in head/sys: dev/md fs/nfsclient fs/nwfs fs/smbfs nfsclient

Konstantin Belousov kib at FreeBSD.org
Mon May 3 20:31:14 UTC 2010


Author: kib
Date: Mon May  3 20:31:13 2010
New Revision: 207584
URL: http://svn.freebsd.org/changeset/base/207584

Log:
  Lock the page around vm_page_activate() and vm_page_deactivate() calls
  where it was missed. The wrapped fragments now protect wire_count with
  page lock.
  
  Reviewed by:	alc

Modified:
  head/sys/dev/md/md.c
  head/sys/fs/nfsclient/nfs_clbio.c
  head/sys/fs/nwfs/nwfs_io.c
  head/sys/fs/smbfs/smbfs_io.c
  head/sys/nfsclient/nfs_bio.c

Modified: head/sys/dev/md/md.c
==============================================================================
--- head/sys/dev/md/md.c	Mon May  3 19:56:52 2010	(r207583)
+++ head/sys/dev/md/md.c	Mon May  3 20:31:13 2010	(r207584)
@@ -665,11 +665,13 @@ mdstart_swap(struct md_s *sc, struct bio
 		sf_buf_free(sf);
 		sched_unpin();
 		vm_page_wakeup(m);
+		vm_page_lock(m);
 		vm_page_lock_queues();
 		vm_page_activate(m);
 		if (bp->bio_cmd == BIO_WRITE)
 			vm_page_dirty(m);
 		vm_page_unlock_queues();
+		vm_page_unlock(m);
 
 		/* Actions on further pages start at offset 0 */
 		p += PAGE_SIZE - offs;

Modified: head/sys/fs/nfsclient/nfs_clbio.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clbio.c	Mon May  3 19:56:52 2010	(r207583)
+++ head/sys/fs/nfsclient/nfs_clbio.c	Mon May  3 20:31:13 2010	(r207584)
@@ -192,12 +192,14 @@ ncl_getpages(struct vop_getpages_args *a
 
 	size = count - uio.uio_resid;
 	VM_OBJECT_LOCK(object);
-	vm_page_lock_queues();
 	for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
 		vm_page_t m;
 		nextoff = toff + PAGE_SIZE;
 		m = pages[i];
 
+		vm_page_lock(m);
+		vm_page_lock_queues();
+
 		if (nextoff <= size) {
 			/*
 			 * Read operation filled an entire page
@@ -244,8 +246,10 @@ ncl_getpages(struct vop_getpages_args *a
 				vm_page_free(m);
 			}
 		}
+
+		vm_page_unlock_queues();
+		vm_page_unlock(m);
 	}
-	vm_page_unlock_queues();
 	VM_OBJECT_UNLOCK(object);
 	return (0);
 }

Modified: head/sys/fs/nwfs/nwfs_io.c
==============================================================================
--- head/sys/fs/nwfs/nwfs_io.c	Mon May  3 19:56:52 2010	(r207583)
+++ head/sys/fs/nwfs/nwfs_io.c	Mon May  3 20:31:13 2010	(r207584)
@@ -449,12 +449,14 @@ nwfs_getpages(ap)
 
 	size = count - uio.uio_resid;
 
-	vm_page_lock_queues();
 	for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
 		vm_page_t m;
 		nextoff = toff + PAGE_SIZE;
 		m = pages[i];
 
+		vm_page_lock(m);
+		vm_page_lock_queues();
+
 		if (nextoff <= size) {
 			m->valid = VM_PAGE_BITS_ALL;
 			KASSERT(m->dirty == 0,
@@ -489,8 +491,10 @@ nwfs_getpages(ap)
 				vm_page_free(m);
 			}
 		}
+
+		vm_page_unlock_queues();
+		vm_page_unlock(m);
 	}
-	vm_page_unlock_queues();
 	VM_OBJECT_UNLOCK(object);
 	return 0;
 #endif /* NWFS_RWCACHE */

Modified: head/sys/fs/smbfs/smbfs_io.c
==============================================================================
--- head/sys/fs/smbfs/smbfs_io.c	Mon May  3 19:56:52 2010	(r207583)
+++ head/sys/fs/smbfs/smbfs_io.c	Mon May  3 20:31:13 2010	(r207584)
@@ -500,12 +500,14 @@ smbfs_getpages(ap)
 
 	size = count - uio.uio_resid;
 
-	vm_page_lock_queues();
 	for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
 		vm_page_t m;
 		nextoff = toff + PAGE_SIZE;
 		m = pages[i];
 
+		vm_page_lock(m);
+		vm_page_lock_queues();
+
 		if (nextoff <= size) {
 			/*
 			 * Read operation filled an entire page
@@ -553,8 +555,10 @@ smbfs_getpages(ap)
 				vm_page_free(m);
 			}
 		}
+
+		vm_page_unlock_queues();
+		vm_page_unlock(m);
 	}
-	vm_page_unlock_queues();
 	VM_OBJECT_UNLOCK(object);
 	return 0;
 #endif /* SMBFS_RWGENERIC */

Modified: head/sys/nfsclient/nfs_bio.c
==============================================================================
--- head/sys/nfsclient/nfs_bio.c	Mon May  3 19:56:52 2010	(r207583)
+++ head/sys/nfsclient/nfs_bio.c	Mon May  3 20:31:13 2010	(r207584)
@@ -189,12 +189,14 @@ nfs_getpages(struct vop_getpages_args *a
 
 	size = count - uio.uio_resid;
 	VM_OBJECT_LOCK(object);
-	vm_page_lock_queues();
 	for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
 		vm_page_t m;
 		nextoff = toff + PAGE_SIZE;
 		m = pages[i];
 
+		vm_page_lock(m);
+		vm_page_lock_queues();
+
 		if (nextoff <= size) {
 			/*
 			 * Read operation filled an entire page
@@ -241,8 +243,10 @@ nfs_getpages(struct vop_getpages_args *a
 				vm_page_free(m);
 			}
 		}
+
+		vm_page_unlock_queues();
+		vm_page_unlock(m);
 	}
-	vm_page_unlock_queues();
 	VM_OBJECT_UNLOCK(object);
 	return (0);
 }


More information about the svn-src-all mailing list