From owner-svn-src-all@freebsd.org Tue Nov 19 23:30:10 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 8328D1C17CB; Tue, 19 Nov 2019 23:30:10 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47HhrL2gTpz458R; Tue, 19 Nov 2019 23:30:10 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3E8AF19ED5; Tue, 19 Nov 2019 23:30:10 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id xAJNUALS073846; Tue, 19 Nov 2019 23:30:10 GMT (envelope-from jeff@FreeBSD.org) Received: (from jeff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id xAJNU9dD073843; Tue, 19 Nov 2019 23:30:09 GMT (envelope-from jeff@FreeBSD.org) Message-Id: <201911192330.xAJNU9dD073843@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jeff set sender to jeff@FreeBSD.org using -f From: Jeff Roberson Date: Tue, 19 Nov 2019 23:30:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r354870 - head/sys/vm X-SVN-Group: head X-SVN-Commit-Author: jeff X-SVN-Commit-Paths: head/sys/vm X-SVN-Commit-Revision: 354870 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 Nov 2019 23:30:10 -0000 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