From owner-svn-src-head@freebsd.org Tue Jul 14 21:16:49 2020 Return-Path: Delivered-To: svn-src-head@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 24A2436FBD5; Tue, 14 Jul 2020 21:16:49 +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 4B5tcc62b4z3ycb; Tue, 14 Jul 2020 21:16:48 +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 8D563C45C; Tue, 14 Jul 2020 21:16:48 +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 06ELGme5022087; Tue, 14 Jul 2020 21:16:48 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 06ELGm3b022086; Tue, 14 Jul 2020 21:16:48 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202007142116.06ELGm3b022086@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Tue, 14 Jul 2020 21:16:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r363199 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 363199 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jul 2020 21:16:49 -0000 Author: mjg Date: Tue Jul 14 21:16:48 2020 New Revision: 363199 URL: https://svnweb.freebsd.org/changeset/base/363199 Log: cache: remove neg_locked argument from cache_zap_locked Tested by: pho Modified: head/sys/kern/vfs_cache.c Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Tue Jul 14 21:16:07 2020 (r363198) +++ head/sys/kern/vfs_cache.c Tue Jul 14 21:16:48 2020 (r363199) @@ -441,7 +441,7 @@ STATNODE_COUNTER(numneg_evicted, STATNODE_COUNTER(shrinking_skipped, "Number of times shrinking was already in progress"); -static void cache_zap_locked(struct namecache *ncp, bool neg_locked); +static void cache_zap_locked(struct namecache *ncp); static int vn_fullpath_hardlink(struct thread *td, struct nameidata *ndp, char **retbuf, char **freebuf, size_t *buflen); static int vn_fullpath_any(struct thread *td, struct vnode *vp, struct vnode *rdir, @@ -778,7 +778,7 @@ cache_negative_insert(struct namecache *ncp) } static void -cache_negative_remove(struct namecache *ncp, bool neg_locked) +cache_negative_remove(struct namecache *ncp) { struct neglist *neglist; struct negstate *negstate; @@ -788,18 +788,16 @@ cache_negative_remove(struct namecache *ncp, bool neg_ cache_assert_bucket_locked(ncp, RA_WLOCKED); neglist = NCP2NEGLIST(ncp); negstate = NCP2NEGSTATE(ncp); - if (!neg_locked) { - if ((negstate->neg_flag & NEG_HOT) != 0) { - hot_locked = true; - mtx_lock(&ncneg_hot.nl_lock); - if ((negstate->neg_flag & NEG_HOT) == 0) { - list_locked = true; - mtx_lock(&neglist->nl_lock); - } - } else { + if ((negstate->neg_flag & NEG_HOT) != 0) { + hot_locked = true; + mtx_lock(&ncneg_hot.nl_lock); + if ((negstate->neg_flag & NEG_HOT) == 0) { list_locked = true; mtx_lock(&neglist->nl_lock); } + } else { + list_locked = true; + mtx_lock(&neglist->nl_lock); } if ((negstate->neg_flag & NEG_HOT) != 0) { mtx_assert(&ncneg_hot.nl_lock, MA_OWNED); @@ -888,19 +886,24 @@ cache_negative_zap_one(void) mtx_unlock(&neglist->nl_lock); mtx_lock(dvlp); rw_wlock(blp); - mtx_lock(&neglist->nl_lock); + /* + * Enter SMR to safely check the negative list. + * Even if the found pointer matches, the entry may now be reallocated + * and used by a different vnode. + */ + vfs_smr_enter(); ncp2 = TAILQ_FIRST(&neglist->nl_list); if (ncp != ncp2 || dvlp != VP2VNODELOCK(ncp2->nc_dvp) || - blp != NCP2BUCKETLOCK(ncp2) || !(ncp2->nc_flag & NCF_NEGATIVE)) { + blp != NCP2BUCKETLOCK(ncp2)) { + vfs_smr_exit(); ncp = NULL; } else { + vfs_smr_exit(); SDT_PROBE2(vfs, namecache, shrink_negative, done, ncp->nc_dvp, ncp->nc_name); - - cache_zap_locked(ncp, true); + cache_zap_locked(ncp); counter_u64_add(numneg_evicted, 1); } - mtx_unlock(&neglist->nl_lock); rw_wunlock(blp); mtx_unlock(dvlp); cache_free(ncp); @@ -913,7 +916,7 @@ cache_negative_zap_one(void) * pointer to a vnode or if it is just a negative cache entry. */ static void -cache_zap_locked(struct namecache *ncp, bool neg_locked) +cache_zap_locked(struct namecache *ncp) { if (!(ncp->nc_flag & NCF_NEGATIVE)) @@ -936,7 +939,7 @@ cache_zap_locked(struct namecache *ncp, bool neg_locke } else { SDT_PROBE2(vfs, namecache, zap_negative, done, ncp->nc_dvp, ncp->nc_name); - cache_negative_remove(ncp, neg_locked); + cache_negative_remove(ncp); } if (ncp->nc_flag & NCF_ISDOTDOT) { if (ncp == ncp->nc_dvp->v_cache_dd) @@ -962,7 +965,7 @@ cache_zap_negative_locked_vnode_kl(struct namecache *n blp = NCP2BUCKETLOCK(ncp); rw_wlock(blp); - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); rw_wunlock(blp); } @@ -1009,7 +1012,7 @@ cache_zap_locked_vnode_kl2(struct namecache *ncp, stru } } rw_wlock(blp); - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); rw_wunlock(blp); if (to_unlock != NULL) mtx_unlock(to_unlock); @@ -1055,7 +1058,7 @@ cache_zap_locked_vnode(struct namecache *ncp, struct v to_unlock = vlp1; } rw_wlock(blp); - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); rw_wunlock(blp); mtx_unlock(to_unlock); out: @@ -1086,7 +1089,7 @@ cache_zap_unlocked_bucket(struct namecache *ncp, struc break; } if (rncp != NULL) { - cache_zap_locked(rncp, false); + cache_zap_locked(rncp); rw_wunlock(blp); cache_unlock_vnodes(dvlp, vlp); counter_u64_add(zap_and_exit_bucket_relock_success, 1); @@ -1112,7 +1115,7 @@ cache_zap_wlocked_bucket(struct namecache *ncp, struct if (!(ncp->nc_flag & NCF_NEGATIVE)) vlp = VP2VNODELOCK(ncp->nc_vp); if (cache_trylock_vnodes(dvlp, vlp) == 0) { - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); rw_wunlock(blp); cache_unlock_vnodes(dvlp, vlp); return (0); @@ -1139,7 +1142,7 @@ cache_zap_rlocked_bucket(struct namecache *ncp, struct if (cache_trylock_vnodes(dvlp, vlp) == 0) { rw_runlock(blp); rw_wlock(blp); - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); rw_wunlock(blp); cache_unlock_vnodes(dvlp, vlp); return (0); @@ -1165,7 +1168,7 @@ cache_zap_wlocked_bucket_kl(struct namecache *ncp, str cache_sort_vnodes(&dvlp, &vlp); if (*vlpp1 == dvlp && *vlpp2 == vlp) { - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); cache_unlock_vnodes(dvlp, vlp); *vlpp1 = NULL; *vlpp2 = NULL; @@ -1180,7 +1183,7 @@ cache_zap_wlocked_bucket_kl(struct namecache *ncp, str *vlpp2 = NULL; if (cache_trylock_vnodes(dvlp, vlp) == 0) { - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); cache_unlock_vnodes(dvlp, vlp); return (0); } @@ -1798,7 +1801,7 @@ cache_enter_dotdot_prep(struct vnode *dvp, struct vnod ncp = dvp->v_cache_dd; if (ncp != NULL && (ncp->nc_flag & NCF_ISDOTDOT)) { KASSERT(ncp->nc_dvp == dvp, ("wrong isdotdot parent")); - cache_zap_locked(ncp, false); + cache_zap_locked(ncp); } else { ncp = NULL; } @@ -1929,7 +1932,7 @@ cache_enter_time(struct vnode *dvp, struct vnode *vp, */ if ((ndd = vp->v_cache_dd) != NULL) { if ((ndd->nc_flag & NCF_ISDOTDOT) != 0) - cache_zap_locked(ndd, false); + cache_zap_locked(ndd); else ndd = NULL; }