From owner-svn-src-all@freebsd.org Fri Oct 23 15:49:19 2020 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 185944491F1; Fri, 23 Oct 2020 15:49:19 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4CHpZ66lW8z4HCh; Fri, 23 Oct 2020 15:49:18 +0000 (UTC) (envelope-from mjg@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 CC0AB9D16; Fri, 23 Oct 2020 15:49:18 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09NFnIDP073711; Fri, 23 Oct 2020 15:49:18 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09NFnIg4073710; Fri, 23 Oct 2020 15:49:18 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010231549.09NFnIg4073710@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Fri, 23 Oct 2020 15:49:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366974 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366974 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.33 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: Fri, 23 Oct 2020 15:49:19 -0000 Author: mjg Date: Fri Oct 23 15:49:18 2020 New Revision: 366974 URL: https://svnweb.freebsd.org/changeset/base/366974 Log: vfs: stop taking the interlock in vnode reclaim It no longer protects any of tested fields, keeping all the checks racy. While here make vtryrecycle drop the vnode on its own. Avoids an additional lock trip. Modified: head/sys/kern/vfs_subr.c Modified: head/sys/kern/vfs_subr.c ============================================================================== --- head/sys/kern/vfs_subr.c Fri Oct 23 15:12:06 2020 (r366973) +++ head/sys/kern/vfs_subr.c Fri Oct 23 15:49:18 2020 (r366974) @@ -1121,24 +1121,12 @@ restart: if (vp->v_type == VBAD || vp->v_type == VNON) goto next_iter; - if (!VI_TRYLOCK(vp)) - goto next_iter; - - if (vp->v_usecount > 0 || vp->v_holdcnt == 0 || - (!reclaim_nc_src && !LIST_EMPTY(&vp->v_cache_src)) || - VN_IS_DOOMED(vp) || vp->v_type == VNON) { - VI_UNLOCK(vp); - goto next_iter; - } - object = atomic_load_ptr(&vp->v_object); if (object == NULL || object->resident_page_count > trigger) { - VI_UNLOCK(vp); goto next_iter; } - vholdl(vp); - VI_UNLOCK(vp); + vhold(vp); TAILQ_REMOVE(&vnode_list, mvp, v_vnodelist); TAILQ_INSERT_AFTER(&vnode_list, vp, mvp, v_vnodelist); mtx_unlock(&vnode_list_mtx); @@ -1235,21 +1223,18 @@ restart: * blocking. */ if (vp->v_holdcnt > 0 || (mnt_op != NULL && (mp = vp->v_mount) != NULL && - mp->mnt_op != mnt_op) || !VI_TRYLOCK(vp)) { + mp->mnt_op != mnt_op)) { continue; } TAILQ_REMOVE(&vnode_list, mvp, v_vnodelist); TAILQ_INSERT_AFTER(&vnode_list, vp, mvp, v_vnodelist); if (__predict_false(vp->v_type == VBAD || vp->v_type == VNON)) { - VI_UNLOCK(vp); continue; } - vholdl(vp); + vhold(vp); count--; mtx_unlock(&vnode_list_mtx); - VI_UNLOCK(vp); vtryrecycle(vp); - vdrop(vp); mtx_lock(&vnode_list_mtx); goto restart; } @@ -1520,6 +1505,7 @@ vtryrecycle(struct vnode *vp) CTR2(KTR_VFS, "%s: impossible to recycle, vp %p lock is already held", __func__, vp); + vdrop(vp); return (EWOULDBLOCK); } /* @@ -1530,6 +1516,7 @@ vtryrecycle(struct vnode *vp) CTR2(KTR_VFS, "%s: impossible to recycle, cannot start the write for %p", __func__, vp); + vdrop(vp); return (EBUSY); } /* @@ -1541,7 +1528,7 @@ vtryrecycle(struct vnode *vp) VI_LOCK(vp); if (vp->v_usecount) { VOP_UNLOCK(vp); - VI_UNLOCK(vp); + vdropl(vp); vn_finished_write(vnmp); CTR2(KTR_VFS, "%s: impossible to recycle, %p is already referenced", @@ -1553,7 +1540,7 @@ vtryrecycle(struct vnode *vp) vgonel(vp); } VOP_UNLOCK(vp); - VI_UNLOCK(vp); + vdropl(vp); vn_finished_write(vnmp); return (0); }