From owner-dev-commits-src-all@freebsd.org Mon Jan 25 22:42:46 2021 Return-Path: Delivered-To: dev-commits-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 C99A64F48D2; Mon, 25 Jan 2021 22:42:46 +0000 (UTC) (envelope-from git@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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4DPlHn20dBz3kCv; Mon, 25 Jan 2021 22:42:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 50FC61E5EC; Mon, 25 Jan 2021 22:42:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 10PMghG2026418; Mon, 25 Jan 2021 22:42:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 10PMghl3026417; Mon, 25 Jan 2021 22:42:43 GMT (envelope-from git) Date: Mon, 25 Jan 2021 22:42:43 GMT Message-Id: <202101252242.10PMghl3026417@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mateusz Guzik Subject: git: 6f0842764946 - main - cache: make ->v_cache_dd accesses atomic-clean for lockless usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mjg X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6f0842764946ed57382293cc3361b86955308084 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jan 2021 22:42:47 -0000 The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=6f0842764946ed57382293cc3361b86955308084 commit 6f0842764946ed57382293cc3361b86955308084 Author: Mateusz Guzik AuthorDate: 2021-01-25 20:29:54 +0000 Commit: Mateusz Guzik CommitDate: 2021-01-25 22:41:13 +0000 cache: make ->v_cache_dd accesses atomic-clean for lockless usage --- sys/kern/vfs_cache.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index ba3856ffe0b4..fad7ce91ef44 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -1441,7 +1441,7 @@ cache_zap_locked(struct namecache *ncp) TAILQ_REMOVE(&vp->v_cache_dst, ncp, nc_dst); if (ncp == vp->v_cache_dd) { vn_seqc_write_begin_unheld(vp); - vp->v_cache_dd = NULL; + atomic_store_ptr(&vp->v_cache_dd, NULL); vn_seqc_write_end(vp); } } else { @@ -1451,7 +1451,7 @@ cache_zap_locked(struct namecache *ncp) if (ncp->nc_flag & NCF_ISDOTDOT) { if (ncp == dvp->v_cache_dd) { vn_seqc_write_begin_unheld(dvp); - dvp->v_cache_dd = NULL; + atomic_store_ptr(&dvp->v_cache_dd, NULL); vn_seqc_write_end(dvp); } } else { @@ -1628,7 +1628,7 @@ retry_dotdot: cache_free(ncp); } else { vn_seqc_write_begin(dvp); - dvp->v_cache_dd = NULL; + atomic_store_ptr(&dvp->v_cache_dd, NULL); vn_seqc_write_end(dvp); mtx_unlock(dvlp); if (dvlp2 != NULL) @@ -2157,7 +2157,7 @@ cache_enter_lock(struct celockstate *cel, struct vnode *dvp, struct vnode *vp, cache_lock_vnodes_cel(cel, dvp, vp); if (vp == NULL || vp->v_type != VDIR) break; - ncp = vp->v_cache_dd; + ncp = atomic_load_consume_ptr(&vp->v_cache_dd); if (ncp == NULL) break; nc_flag = atomic_load_char(&ncp->nc_flag); @@ -2198,7 +2198,7 @@ cache_enter_lock_dd(struct celockstate *cel, struct vnode *dvp, struct vnode *vp for (;;) { blps[1] = NULL; cache_lock_vnodes_cel(cel, dvp, vp); - ncp = dvp->v_cache_dd; + ncp = atomic_load_consume_ptr(&dvp->v_cache_dd); if (ncp == NULL) break; nc_flag = atomic_load_char(&ncp->nc_flag); @@ -2240,7 +2240,7 @@ cache_enter_dotdot_prep(struct vnode *dvp, struct vnode *vp, uint32_t hash; int len; - if (dvp->v_cache_dd == NULL) + if (atomic_load_ptr(&dvp->v_cache_dd) == NULL) return; len = cnp->cn_namelen; cache_celockstate_init(&cel); @@ -2254,7 +2254,7 @@ cache_enter_dotdot_prep(struct vnode *dvp, struct vnode *vp, } else { ncp = NULL; } - dvp->v_cache_dd = NULL; + atomic_store_ptr(&dvp->v_cache_dd, NULL); vn_seqc_write_end(dvp); cache_enter_unlock(&cel); if (ncp != NULL) @@ -2393,7 +2393,7 @@ cache_enter_time(struct vnode *dvp, struct vnode *vp, struct componentname *cnp, KASSERT(vp == NULL || vp->v_type == VDIR, ("wrong vnode type %p", vp)); vn_seqc_write_begin(dvp); - dvp->v_cache_dd = ncp; + atomic_store_ptr(&dvp->v_cache_dd, ncp); vn_seqc_write_end(dvp); } @@ -2411,12 +2411,12 @@ cache_enter_time(struct vnode *dvp, struct vnode *vp, struct componentname *cnp, else ndd = NULL; } - vp->v_cache_dd = ncp; + atomic_store_ptr(&vp->v_cache_dd, ncp); vn_seqc_write_end(vp); } else if (vp->v_type != VDIR) { if (vp->v_cache_dd != NULL) { vn_seqc_write_begin(vp); - vp->v_cache_dd = NULL; + atomic_store_ptr(&vp->v_cache_dd, NULL); vn_seqc_write_end(vp); } } @@ -2658,7 +2658,7 @@ cache_has_entries(struct vnode *vp) { if (LIST_EMPTY(&vp->v_cache_src) && TAILQ_EMPTY(&vp->v_cache_dst) && - vp->v_cache_dd == NULL) + atomic_load_ptr(&vp->v_cache_dd) == NULL) return (false); return (true); } @@ -3291,7 +3291,7 @@ vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf, vp_seqc = tvp_seqc; continue; } - ncp = atomic_load_ptr(&vp->v_cache_dd); + ncp = atomic_load_consume_ptr(&vp->v_cache_dd); if (ncp == NULL) { cache_rev_failed(&reason); goto out_abort; @@ -4705,7 +4705,7 @@ cache_fplookup_dotdot(struct cache_fpl *fpl) return (cache_fpl_aborted(fpl)); } - ncp = atomic_load_ptr(&dvp->v_cache_dd); + ncp = atomic_load_consume_ptr(&dvp->v_cache_dd); if (ncp == NULL) { return (cache_fpl_aborted(fpl)); }