From owner-svn-src-user@freebsd.org Fri Mar 16 20:04:53 2018 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 789FBF49363 for ; Fri, 16 Mar 2018 20:04:53 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 1FCF571D92; Fri, 16 Mar 2018 20:04:53 +0000 (UTC) (envelope-from markj@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 19239559; Fri, 16 Mar 2018 20:04:53 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w2GK4qi9012679; Fri, 16 Mar 2018 20:04:52 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w2GK4q3s012678; Fri, 16 Mar 2018 20:04:52 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201803162004.w2GK4q3s012678@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Fri, 16 Mar 2018 20:04:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r331072 - user/markj/vm-playground/sys/kern X-SVN-Group: user X-SVN-Commit-Author: markj X-SVN-Commit-Paths: user/markj/vm-playground/sys/kern X-SVN-Commit-Revision: 331072 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Mar 2018 20:04:53 -0000 Author: markj Date: Fri Mar 16 20:04:52 2018 New Revision: 331072 URL: https://svnweb.freebsd.org/changeset/base/331072 Log: Elide the object lock in vfs_vmio_truncate() in the common case. Rather attempting to free invalid pages, accelerate their reclamation by moving them near the head of the inactive queue. With this change, bufspace threads don't touch the object lock. Modified: user/markj/vm-playground/sys/kern/vfs_bio.c Modified: user/markj/vm-playground/sys/kern/vfs_bio.c ============================================================================== --- user/markj/vm-playground/sys/kern/vfs_bio.c Fri Mar 16 19:26:58 2018 (r331071) +++ user/markj/vm-playground/sys/kern/vfs_bio.c Fri Mar 16 20:04:52 2018 (r331072) @@ -2915,24 +2915,14 @@ vfs_vmio_unwire(struct buf *bp, vm_page_t m) vm_page_lock(m); if (vm_page_unwire_noq(m)) { - /* - * Determine if the page should be freed before adding - * it to the inactive queue. - */ - if (m->valid == 0) { - freed = !vm_page_busied(m); - if (freed) - vm_page_free(m); - } else if ((bp->b_flags & B_DIRECT) != 0) - freed = vm_page_try_to_free(m); - else - freed = false; - if (!freed) { + if ((bp->b_flags & B_DIRECT) == 0 || !vm_page_try_to_free(m)) { /* - * If the page is unlikely to be reused, let the - * VM know. Otherwise, maintain LRU. + * Use a racy check of the valid bits to determine + * whether we can accelerate reclamation of the page. + * This allows elision of the object write lock in the + * common case. */ - if ((bp->b_flags & B_NOREUSE) != 0) + if (m->valid == 0 || (bp->b_flags & B_NOREUSE) != 0) vm_page_deactivate_noreuse(m); else if (m->queue == PQ_ACTIVE) vm_page_reference(m); @@ -3021,7 +3011,12 @@ vfs_vmio_truncate(struct buf *bp, int desiredpages) (desiredpages << PAGE_SHIFT), bp->b_npages - desiredpages); } else BUF_CHECK_UNMAPPED(bp); - obj = bp->b_bufobj->bo_object; + + /* + * The object lock is needed only if we attempt to free the buffer's + * pages. + */ + obj = (bp->b_flags & B_DIRECT) != 0 ? bp->b_bufobj->bo_object : NULL; if (obj != NULL) VM_OBJECT_WLOCK(obj); for (i = desiredpages; i < bp->b_npages; i++) {