Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Nov 2019 23:30:09 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354870 - head/sys/vm
Message-ID:  <201911192330.xAJNU9dD073843@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Tue Nov 19 23:30:09 2019
New Revision: 354870
URL: https://svnweb.freebsd.org/changeset/base/354870

Log:
  Remove unnecessary object locking from the vnode pager.  Recent changes to
  busy/valid/dirty locking make these acquires redundant.
  
  Reviewed by:	kib, markj
  Differential Revision:	https://reviews.freebsd.org/D22186

Modified:
  head/sys/vm/vm_page.c
  head/sys/vm/vm_page.h
  head/sys/vm/vnode_pager.c

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Tue Nov 19 23:19:43 2019	(r354869)
+++ head/sys/vm/vm_page.c	Tue Nov 19 23:30:09 2019	(r354870)
@@ -4527,7 +4527,7 @@ vm_page_bits(int base, int size)
 	    ((vm_page_bits_t)1 << first_bit));
 }
 
-static inline void
+void
 vm_page_bits_set(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t set)
 {
 

Modified: head/sys/vm/vm_page.h
==============================================================================
--- head/sys/vm/vm_page.h	Tue Nov 19 23:19:43 2019	(r354869)
+++ head/sys/vm/vm_page.h	Tue Nov 19 23:30:09 2019	(r354870)
@@ -587,6 +587,7 @@ vm_page_t vm_page_alloc_contig_domain(vm_object_t obje
     vm_memattr_t memattr);
 vm_page_t vm_page_alloc_freelist(int, int);
 vm_page_t vm_page_alloc_freelist_domain(int, int, int);
+void vm_page_bits_set(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t set);
 bool vm_page_blacklist_add(vm_paddr_t pa, bool verbose);
 void vm_page_change_lock(vm_page_t m, struct mtx **mtx);
 vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int);

Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c	Tue Nov 19 23:19:43 2019	(r354869)
+++ head/sys/vm/vnode_pager.c	Tue Nov 19 23:30:09 2019	(r354870)
@@ -649,9 +649,7 @@ vnode_pager_input_smlfs(vm_object_t object, vm_page_t 
 			bzero((caddr_t)sf_buf_kva(sf) + i * bsize, bsize);
 		KASSERT((m->dirty & bits) == 0,
 		    ("vnode_pager_input_smlfs: page %p is dirty", m));
-		VM_OBJECT_WLOCK(object);
-		m->valid |= bits;
-		VM_OBJECT_WUNLOCK(object);
+		vm_page_bits_set(m, &m->valid, bits);
 	}
 	sf_buf_free(sf);
 	if (error) {
@@ -888,9 +886,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page
 		pmap_zero_page(m[0]);
 		KASSERT(m[0]->dirty == 0, ("%s: page %p is dirty",
 		    __func__, m[0]));
-		VM_OBJECT_WLOCK(object);
 		vm_page_valid(m[0]);
-		VM_OBJECT_WUNLOCK(object);
 		return (VM_PAGER_OK);
 	}
 
@@ -1143,7 +1139,8 @@ vnode_pager_generic_getpages_done(struct buf *bp)
 		bp->b_data = unmapped_buf;
 	}
 
-	VM_OBJECT_WLOCK(object);
+	/* Read lock to protect size. */
+	VM_OBJECT_RLOCK(object);
 	for (i = 0, tfoff = IDX_TO_OFF(bp->b_pages[0]->pindex);
 	    i < bp->b_npages; i++, tfoff = nextoff) {
 		vm_page_t mt;
@@ -1180,7 +1177,7 @@ vnode_pager_generic_getpages_done(struct buf *bp)
 		if (i < bp->b_pgbefore || i >= bp->b_npages - bp->b_pgafter)
 			vm_page_readahead_finish(mt);
 	}
-	VM_OBJECT_WUNLOCK(object);
+	VM_OBJECT_RUNLOCK(object);
 	if (error != 0)
 		printf("%s: I/O read error %d\n", __func__, error);
 
@@ -1304,12 +1301,6 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page
 	 */
 	VM_OBJECT_RLOCK(object);
 	if (maxsize + poffset > object->un_pager.vnp.vnp_size) {
-		if (!VM_OBJECT_TRYUPGRADE(object)) {
-			VM_OBJECT_RUNLOCK(object);
-			VM_OBJECT_WLOCK(object);
-			if (maxsize + poffset <= object->un_pager.vnp.vnp_size)
-				goto downgrade;
-		}
 		if (object->un_pager.vnp.vnp_size > poffset) {
 			maxsize = object->un_pager.vnp.vnp_size - poffset;
 			ncount = btoc(maxsize);
@@ -1317,7 +1308,7 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page
 				pgoff = roundup2(pgoff, DEV_BSIZE);
 
 				/*
-				 * If the object is locked and the following
+				 * If the page is busy and the following
 				 * conditions hold, then the page's dirty
 				 * field cannot be concurrently changed by a
 				 * pmap operation.
@@ -1336,9 +1327,8 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page
 		}
 		for (i = ncount; i < count; i++)
 			rtvals[i] = VM_PAGER_BAD;
-downgrade:
-		VM_OBJECT_LOCK_DOWNGRADE(object);
 	}
+	VM_OBJECT_RUNLOCK(object);
 
 	auio.uio_iov = &aiov;
 	auio.uio_segflg = UIO_NOCOPY;
@@ -1384,7 +1374,6 @@ start_write:
 		 */
 		MPASS(prev_offset < next_offset);
 
-		VM_OBJECT_RUNLOCK(object);
 		aiov.iov_base = NULL;
 		auio.uio_iovcnt = 1;
 		auio.uio_offset = prev_offset;
@@ -1400,7 +1389,6 @@ start_write:
 				    "zero-length write at %ju resid %zd\n",
 				    auio.uio_offset, auio.uio_resid);
 			}
-			VM_OBJECT_RLOCK(object);
 			break;
 		}
 
@@ -1418,7 +1406,6 @@ start_write:
 			vn_printf(vp, "vnode_pager_putpages: residual I/O %zd "
 			    "at %ju\n", auio.uio_resid,
 			    (uintmax_t)ma[0]->pindex);
-		VM_OBJECT_RLOCK(object);
 		if (error != 0 || auio.uio_resid != 0)
 			break;
 	}
@@ -1432,7 +1419,6 @@ write_done:
 	/* Unwritten pages in range, free bonus if the page is clean. */
 	for (; i < ncount; i++)
 		rtvals[i] = ma[i]->dirty == 0 ? VM_PAGER_OK : VM_PAGER_ERROR;
-	VM_OBJECT_RUNLOCK(object);
 	VM_CNT_ADD(v_vnodepgsout, i);
 	VM_CNT_INC(v_vnodeout);
 	return (rtvals[0]);
@@ -1482,7 +1468,6 @@ vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, 
 	if (written == 0 && eof >= lpos)
 		return;
 	obj = ma[0]->object;
-	VM_OBJECT_WLOCK(obj);
 	for (i = 0, pos = 0; pos < written; i++, pos += PAGE_SIZE) {
 		if (pos < trunc_page(written)) {
 			rtvals[i] = VM_PAGER_OK;
@@ -1494,7 +1479,7 @@ vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, 
 		}
 	}
 	if (eof >= lpos) /* avoid truncation */
-		goto done;
+		return;
 	for (pos = eof, i = OFF_TO_IDX(trunc_page(pos)); pos < lpos; i++) {
 		if (pos != trunc_page(pos)) {
 			/*
@@ -1523,8 +1508,6 @@ vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, 
 			pos += PAGE_SIZE;
 		}
 	}
-done:
-	VM_OBJECT_WUNLOCK(obj);
 }
 
 static void



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