From owner-dev-commits-src-all@freebsd.org Fri Jan 1 00:11:53 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 4E8084D5FAC; Fri, 1 Jan 2021 00:11:53 +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 "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D6QS91dYVz4bpg; Fri, 1 Jan 2021 00:11:53 +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 2922519751; Fri, 1 Jan 2021 00:11:53 +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 1010BrFq005841; Fri, 1 Jan 2021 00:11:53 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1010Br1b005840; Fri, 1 Jan 2021 00:11:53 GMT (envelope-from git) Date: Fri, 1 Jan 2021 00:11:53 GMT Message-Id: <202101010011.1010Br1b005840@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: 0b5bd1afd89f - main - cache: support lockless lookup of degenerate paths 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: 0b5bd1afd89fa42629a28dc01eae5e39c8e5fecd 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: Fri, 01 Jan 2021 00:11:53 -0000 The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=0b5bd1afd89fa42629a28dc01eae5e39c8e5fecd commit 0b5bd1afd89fa42629a28dc01eae5e39c8e5fecd Author: Mateusz Guzik AuthorDate: 2020-12-28 06:53:17 +0000 Commit: Mateusz Guzik CommitDate: 2021-01-01 00:10:42 +0000 cache: support lockless lookup of degenerate paths Tested by: pho --- sys/kern/vfs_cache.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index c9b0010020f8..cde2fde8a9ec 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -4224,6 +4224,56 @@ cache_fplookup_final(struct cache_fpl *fpl) return (cache_fplookup_final_child(fpl, tvs)); } +/* + * Comment from locked lookup: + * Check for degenerate name (e.g. / or "") which is a way of talking about a + * directory, e.g. like "/." or ".". + */ +static int __noinline +cache_fplookup_degenerate(struct cache_fpl *fpl) +{ + struct componentname *cnp; + struct vnode *dvp; + enum vgetstate dvs; + int error, lkflags; + + fpl->tvp = fpl->dvp; + fpl->tvp_seqc = fpl->dvp_seqc; + + cnp = fpl->cnp; + dvp = fpl->dvp; + + if (__predict_false(cnp->cn_nameiop != LOOKUP)) { + cache_fpl_smr_exit(fpl); + return (cache_fpl_handled(fpl, EISDIR)); + } + + MPASS((cnp->cn_flags & SAVESTART) == 0); + + if ((cnp->cn_flags & (LOCKPARENT|WANTPARENT)) != 0) { + return (cache_fplookup_final_withparent(fpl)); + } + + dvs = vget_prep_smr(dvp); + cache_fpl_smr_exit(fpl); + if (__predict_false(dvs == VGET_NONE)) { + return (cache_fpl_aborted(fpl)); + } + + if ((cnp->cn_flags & LOCKLEAF) != 0) { + lkflags = LK_SHARED; + if ((cnp->cn_flags & LOCKSHARED) == 0) + lkflags = LK_EXCLUSIVE; + error = vget_finish(dvp, lkflags, dvs); + if (__predict_false(error != 0)) { + return (cache_fpl_aborted(fpl)); + } + } else { + vget_finish_ref(dvp, dvs); + } + return (cache_fpl_handled(fpl, 0)); +} + static int __noinline cache_fplookup_noentry(struct cache_fpl *fpl) { @@ -4694,15 +4744,8 @@ cache_fplookup_preparse(struct cache_fpl *fpl) ndp = fpl->ndp; cnp = fpl->cnp; - /* - * TODO - * Original comment: - * Check for degenerate name (e.g. / or "") - * which is a way of talking about a directory, - * e.g. like "/." or ".". - */ if (__predict_false(cnp->cn_nameptr[0] == '\0')) { - return (cache_fpl_aborted(fpl)); + return (cache_fplookup_degenerate(fpl)); } /* @@ -4913,7 +4956,7 @@ cache_fplookup_impl(struct vnode *dvp, struct cache_fpl *fpl) VNPASS(cache_fplookup_vnode_supported(fpl->dvp), fpl->dvp); error = cache_fplookup_preparse(fpl); - if (__predict_false(error != 0)) { + if (__predict_false(cache_fpl_terminated(fpl))) { goto out; }